一、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
以上资源创建完成后就可以访问了: