一、docker部署consul集群
參考文獻:https://www.cnblogs.com/lonelyxmas/p/10880717.html
https://blog.csdn.net/qq_36228442/article/details/89085373
consul是提供服務發現、簡單配置管理、分區部署的服務注冊發現解決方案。
主要特性:服務發現\健康檢查\基於Key-Value的配置\支持TLS安全通訊\支持多數據中心部署
consul的實例叫agent
agent有兩種運行模式:server和client
每個數據中心至少要有一個server,一般推薦3-5個server(避免單點故障)
client模式agent是一個輕量級進程,執行健康檢查,轉發查詢請求到server。
服務service是注冊到consul的外部應用,比如spring web server
以下為docker-compose.yaml文件
version: "3.0" services: consulserver: image: progrium/consul:latest hostname: consulserver ports: - "8300:8300" - "8400:8400" - "8500:8500" - "53" command: -server -ui-dir /ui -data-dir /tmp/consul --bootstrap-expect=3 consulserver1: image: progrium/consul:latest hostname: consulserver1 depends_on: - "consulserver" ports: - "8301:8300" - "8401:8400" - "8501:8500" - "53" command: -server -data-dir /tmp/consul -join consulserver consulserver2: image: progrium/consul:latest hostname: consulserver2 depends_on: - "consulserver" ports: - "8302:8300" - "8402:8400" - "8502:8500" - "53" command: -server -data-dir /tmp/consul -join consulserver
宿主機瀏覽器訪問:http://localhost:8500 或者 http://localhost:8501 或者 http://localhost:8502
創建test.json文件,以腳本形式注冊服務到consul:
test.json文件內容如下:
{ "ID": "test-service1", "Name": "test-service1", "Tags": [ "test", "v1" ], "Address": "127.0.0.1", "Port": 8000, "Meta": { "X-TAG": "testtag" }, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": "90m", "HTTP": "http://zhihu.com", "Interval": "10s" } }
通過 http 接口注冊服務(端口可以是8500. 8501, 8502等能夠正常訪問consul的就行):
curl -X PUT --data @test.json http://localhost:8500/v1/agent/service/register
二、k8s部署consul集群
參考文獻:https://www.cnblogs.com/tylerzhou/p/11161634.html
https://www.jianshu.com/p/b00de040d92e
由於node節點只有兩個,所以配置集群也兩個實例,測試時候,配置三個實例不能正常工作,所以配置倆個
1、先創建service資源

apiVersion: v1 kind: Service metadata: name: consul labels: name: 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 # port: 8301 # targetPort: 8301 # - name: serflan-udp # port: 8301 # targetPort: 8301 # protocol: "UDP" # - name: serfwan-tcp # port: 8302 # targetPort: 8302 # - name: serfwan-udp # port: 8302 # targetPort: 8302 # protocol: "UDP" # - name: server # port: 8300 # targetPort: 8300 # - name: consuldns # port: 8600 # targetPort: 8600 selector: app: consul
由於只暴露8500的ui端口,所以將其他端口都沒有創建service,service為clusterIP
2、創建statefulset資源

apiVersion: apps/v1 kind: StatefulSet metadata: name: consul spec: serviceName: consul replicas: 2 selector: matchLabels: app: consul template: metadata: labels: app: consul spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - consul topologyKey: kubernetes.io/hostname terminationGracePeriodSeconds: 10 containers: - name: consul image: consul:latest args: - "agent" - "-server" - "-bootstrap-expect=2" - "-ui" - "-data-dir=/consul/data" - "-bind=0.0.0.0" - "-client=0.0.0.0" - "-advertise=$(PODIP)" - "-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" 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
3、創建ingress,以使用域名訪問

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-consul namespace: default annotations: kubernets.io/ingress.class: "nginx" spec: rules: - host: consul.cabel.com http: paths: - path: backend: serviceName: consul servicePort: 8500
以上資源創建完成后就可以訪問了: