Kubernetes以Statefulset方式部署Consul集群

应用namespace

apiVersion: v1
kind: Namespace
metadata:
name: public-service
labels:
name: public-service

应用statefulset

需要先部署nfs storage class

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: consul
namespace: public-service
spec:
replicas: 3
updateStrategy:
type: RollingUpdate
serviceName: consul
selector:
matchLabels:
app: consul
template:
metadata:
labels:
app: consul
spec:
terminationGracePeriodSeconds: 10
securityContext:
fsGroup: 1000
# affinity:
# podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# - labelSelector:
# matchExpressions:
# - key: app
# operator: In
# values:
# - consul
# topologyKey: kubernetes.io/hostname
containers:
- name: consul
image: consul:1.8
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8500
name: ui-port
- containerPort: 8400
name: alt-port
- containerPort: 53
name: udp-port
- containerPort: 8443
name: https-port
- containerPort: 8080
name: http-port
- containerPort: 8301
name: serflan
- containerPort: 8302
name: serfwan
- containerPort: 8600
name: consuldns
- containerPort: 8300
name: server
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
args:
- "agent"
- "-server"
- "-advertise=$(POD_IP)"
- "-bind=0.0.0.0"
- "-bootstrap-expect=3"
- "-data-dir=/consul/data"
- "-disable-host-node-id"
- "-domain=cluster.local"
- "-retry-join=consul-0.consul.$(NAMESPACE).svc.cluster.local"
- "-retry-join=consul-1.consul.$(NAMESPACE).svc.cluster.local"
- "-retry-join=consul-2.consul.$(NAMESPACE).svc.cluster.local"
- "-client=0.0.0.0"
- "-ui"
resources:
limits:
cpu: "200m"
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- consul leave
volumeMounts:
- name: consul-data
mountPath: /consul/data
volumeClaimTemplates:
- metadata:
name: consul-data
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi

应用service

apiVersion: v1
kind: Service
metadata:
name: consul
namespace: public-service
labels:
name: consul
spec:
clusterIP: None
ports:
- name: defult
port: 80
targetPort: 8500
- name: http
port: 8500
targetPort: 8500
- name: https
port: 8443
targetPort: 8443
- name: rpc
port: 8400
targetPort: 8400
- name: serflan-tcp
protocol: "TCP"
port: 8301
targetPort: 8301
- name: serflan-udp
protocol: "UDP"
port: 8301
targetPort: 8301
- name: serfwan-tcp
protocol: "TCP"
port: 8302
targetPort: 8302
- name: serfwan-udp
protocol: "UDP"
port: 8302
targetPort: 8302
- name: server
port: 8300
targetPort: 8300
- name: consuldns
port: 8600
targetPort: 8600
selector:
app: consul

应用ingress

需要先部署ingress-nginx

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: consul
namespace: public-service
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: consul.example.com
http:
paths:
- path: /
backend:
serviceName: consul
servicePort: 80