其实很简单利用helm 直接安装


helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul
helm install --name consul --namespace=consul stable/consul

helm install --name consul --namespace=consul stable/consul

然后等一分钟就安装好了

web管理界面可以通过svc 对外的8500端口来访问


另外写下之间手动写的编排文件

consul_service.yml

consul_service.yml

apiVersion: v1
kind: Service
metadata:  
    name: stag-consul  
    labels:    
      name: stag-consul
spec:  
    type: ClusterIP  
    ports:    
     - 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: stag-consul
    clusterIP: None

consul_statefulset.yml

apiVersion: apps/v1beta1 
kind: StatefulSet
metadata:
  name: stag-consul
spec:
  serviceName: stag-consul
  replicas: 3
  template: 
    metadata:
      labels:
        app: stag-consul
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - stag-consul
              topologyKey: kubernetes.io/hostname
      terminationGracePeriodSeconds: 10
      containers:
      - name: consul
        image: consul:latest
        args:
             - "agent"
             - "-server"
             - "-bootstrap-expect=3"
             - "-ui"
             - "-data-dir=/consul/data"
             - "-bind=0.0.0.0"
             - "-client=0.0.0.0"
             - "-advertise=$(PODIP)"
             - "-retry-join=stag-consul"
            # - "-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"
             - "-domain=cluster.local"
             - "-disable-host-node-id"
        volumeMounts:
            - name: data
              mountPath: /consul/data
        env:
            - name: PODIP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
        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
      volumes:
        - name: data
          hostPath:
            path: /home/consuldata

这里有个问题,因为consul是有状态服务,所有必须用pvc 来进行存储,我这里为了方便,直接挂在了hostpath,后续更新storageclass的方式