Consul简介

Consul是一个服务发现和注册的工具,其具有分布式、高扩展性能特点
Consul主要包含如下功能:

  • 服务发现: 支持 http 和 dns 两种协议的服务注册和发现方式
  • 监控检查: 支持多种方式的健康检查
  • Key/Value存储: 支持通过HTTP API实现分布式KV数据存储
  • 多数据中心支持:支持任意数量数据中心

官方架构图:
consul-1

使用场景

  • docker 实例的注册与配置共享
  • coreos 实例的注册与配置共享
  • vitess 集群
  • SaaS 应用的配置共享
  • 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件

优势

  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft
  • 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持
  • 支持健康检查. etcd 不提供此功能
  • 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议
  • 官方提供web管理界面, etcd 无此功能

角色

  • client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
  • server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个

k8s部署consul

创建consul statefulset

[root@k8s01 consul]# vim consul.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: consul
  namespace: tools-env
spec:
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  serviceName: consul
  selector:
    matchLabels:
      app: consul
  template:
    metadata:
      labels:
        app: consul
    spec:
      terminationGracePeriodSeconds: 10
      securityContext:
        fsGroup: 1000
      containers:
        - name: consul
          image: consul:1.12.1
          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: 10Gi

[root@k8s01 consul]# kubectl apply -f consul.yaml 
statefulset.apps/consul created

创建consul service

[root@k8s01 consul]# vim consul-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: consul
  namespace: tools-env
  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
---
apiVersion: v1
kind: Service
metadata:
  name: consul-web
  namespace: tools-env
  labels:
    name: consul
spec:
  ports:
    - name: http
      port: 8500
      targetPort: 8500
      nodePort: 38500
  type: NodePort
  selector:
    app: consul
    
[root@k8s01 consul]# kubectl apply -f consul-svc.yaml 
service/consul created
service/consul-web created    

创建consul ingress

[root@k8s01 consul]# vim consul-ing.yaml 
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: consul
  namespace: tools-env
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: consul.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: consul
              servicePort: 80

consul web界面访问

浏览器访问域名或者IP:38500
consul-2

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Tools Kubernetes Kubernetes Tools
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝