生産環境のKubergnetes Conselの最優秀実践


生産環境のKubergnetes Conselの最優秀実践
本ガイドは、Consul agentのK 8 sでの運転方式であり、Server端は物理機での運行を推奨しています。Conslのインストール方法は本人のもう一つのブログConslクラスタを参照してインストールしてください。ここではあまり説明しません。
本方案は生産環境で検証されましたが、使用問題はまだ発見されていません。
KubergnetesでのConsul agentの運転の問題と対処方法
問題
  • 業務はどうやってConsel agentを接続しますか?(Conslはどのクライアントから登録されたサービスがどのクライアントからキャンセルされるかという特性があります。)
  • Consel agentが起動すると、ホスト名、IPなどの情報に基づいてdataディレクトリの下で自分のnode-indなどのメタデータが生成される。ダタディレクトリが永続化されていない場合、ホストネットワークは使用されていません。Podが更新されると、ホスト名とIPアドレスが変更されます。Conslに同一のIPアドレスが二つのホスト名に対応する場合が発生します。サービス登録が問題になります。
  • 第2の状況は生産環境において何度も発生しています。同僚がホスト名を変更するとConslクラスタの中で同じIPが二つのホスト名に対応する場合があります。サービス運転に異常をきたす。
  • 解決方法
  • Consul-agentはDaement Setとして動作し、ホストネットワークを利用する。ホスト名とIPアドレスはそのまま維持します。Conslのメタデータを宿泊ホストのディレクトリに永続化し、このようにConslが更新されると、このディレクトリを再読み込みします。node-iなどのメタデータは再生成されません。
  • は、Deploymentの環境変数を注入することにより、Consl agentのIPアドレス(すなわち、物理マシンIPアドレス)を注入する。プログラムはConslに接続する必要があります。直接に本機の環境変数の取得値を調べて接続します。
  • 設定
    ConfigMap配置
    ~]# cat consul-client-configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: consul-client
      namespace: consul
    data:
      consul.json: |
        {
            "datacenter": "dc1",
            "client_addr": "0.0.0.0",
            "bind_addr": "{{ GetInterfaceIP \"eth0\" }}",
            "data_dir": "/consul/data",
            "retry_interval": "20s",
            "retry_join": ["10.111.67.1","10.111.67.2","10.111.67.3","10.111.67.4","10.111.67.5"],
            "enable_local_script_checks": true,
            "log_file": "/var/log/",
            "log_level": "trace",
            "pid_file": "/var/run/consul.pid",
            "performance": {
                "raft_multiplier": 1
            },
            "telemetry": {
                "prometheus_retention_time": "300s",
                "disable_hostname": true
            }
        }
      create-consul-registration.sh: |
        #!/bin/sh
        ADDR=`ip addr show|awk -F '[ /]+' '/eth[0-9]|em[0-9]/ && /inet/ {print $3}'`
        CONSUL_CONF_DIR='/consul/config'
        CONSUL_REDISTER_FILE="$CONSUL_CONF_DIR/consul-members-registration.json"
    
        if [[ -n "$ADDR" && -d $CONSUL_CONF_DIR ]];then
        cat > ${CONSUL_REDISTER_FILE} <
  • consul.jsonはConslプロファイル
  • である。
  • create-consul-registration.shはサービスを生成するために自動的にスクリプトを登録します。主にConslConslモニタを監視します。Consl Prometheusモニタ
  • を参照してください。
    Daemoneセット
    ~]# cat consul-client-daemonset.yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: consul-client
      namespace: consul
      labels:
        app: consul
        environment: prod
        component: client
    spec:
      minReadySeconds: 60
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: consul
          environment: prod
          commponent: client
      updateStrategy:
        rollingUpdate:
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          namespace: consul
          labels:
            app: consul
            environment: prod
            commponent: client
        spec:
          containers:
          - env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            - name: POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            name: consul-client
            image: consul:1.5.1
            imagePullPolicy: IfNotPresent
            command:
            - "consul"
            - "agent"
            - "-config-dir=/consul/config"
            lifecycle:
              postStart:
                exec:
                  command:
                  - /bin/sh
                  - -c
                  - |
                    /consul/create-consul-registration.sh
                    consul reload
              preStop:
                exec:
                  command:
                  - /bin/sh
                  - -c
                  - consul leave
            ports:
            - name: http-api
              hostPort: 8500
              containerPort: 8500
              protocol: TCP
            - name: dns-tcp
              hostPort: 8600
              containerPort: 8600
              protocol: TCP
            - name: dns-udp
              hostPort: 8600
              containerPort: 8600
              protocol: UDP
            - name: server-rpc
              hostPort: 8300
              containerPort: 8300
              protocol: TCP
            - name: serf-lan-tcp
              hostPort: 8301
              containerPort: 8301
              protocol: TCP
            - name: serf-lan-udp
              hostPort: 8301
              containerPort: 8301
              protocol: UDP
            - name: serf-wan-tcp
              hostPort: 8302
              containerPort: 8302
              protocol: TCP
            - name: serf-wan-udp
              hostPort: 8302
              containerPort: 8302
              protocol: UDP
            volumeMounts:
            - name: consul-config
              mountPath: /consul/config/consul.json
              subPath: consul.json
            - name: consul-members
              mountPath: /consul/create-consul-registration.sh
              subPath: create-consul-registration.sh
            - name: consul-data-dir
              mountPath: /consul/data
            - name: localtime
              mountPath: /etc/localtime
            livenessProbe:
              tcpSocket:
                port: 8500
              initialDelaySeconds: 30
              periodSeconds: 10
              successThreshold: 1
              failureThreshold: 3
              timeoutSeconds: 1
            readinessProbe:
              httpGet:
               path: /v1/status/leader
               port: 8500
              initialDelaySeconds: 60
              periodSeconds: 10
              successThreshold: 1
              failureThreshold: 3
              timeoutSeconds: 1
            resources:
              requests:
                memory: "1024Mi"
                cpu: "1000m"
              limits:
                memory: "1024Mi"
                cpu: "1000m"
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          hostNetwork: true
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
          - name: consul-config
            configMap:
              name: consul-client
              items:
              - key: consul.json
                path: consul.json
          - name: consul-members
            configMap:
              name: consul-client
              defaultMode: 0755
              items:
              - key: create-consul-registration.sh
                path: create-consul-registration.sh
          - name: consul-data-dir
            hostPath:
              path: /data/consul/data
              type: DirectoryOrCreate
          - name: localtime
            hostPath:
              path: /etc/localtime
              type: File
  • commandコマンドはConslデフォルト起動パラメータ
  • をカバーするために実行されます。
  • lifecycle.postStartは、起動後にサービスを実行するための登録スクリプト
  • です。
  • lifecycle.pre StopはConsl停止する前にConslクラスタから
  • を除去する。
  • hostNetworkは、シンクホストネットワーク名空間
  • を使用する。
  • volumes.name.locatimeは物理マシンタイムゾーン(デフォルトのミラーは0タイムゾーン)を使用する
  • である。
    Deploymentの設定
    ~]# cat deployment.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: business
        environment: prod
        release: release
      name: business
      namespace: prod-platform
    spec:
      progressDeadlineSeconds: 600
      replicas: 3
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: business
          environment: prod
          release: release
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 0
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: business
            environment: prod
            release: release
        spec:
          shareProcessNamespace: true
          containers:
          - env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            - name: POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            - name: CONSUL_HTTP_ADDR
              value: "$(HOST_IP):8500"
            image: registry-vpc.cn-hangzhou.aliyuncs.com/prod/prod-business:v1
            imagePullPolicy: Always
            name: usercancel
            ports:
            - containerPort: 8999
            - containerPort: 9988
            livenessProbe:
              tcpSocket:
                port: 8999
              initialDelaySeconds: 10
              periodSeconds: 10
              successThreshold: 1
              failureThreshold: 3
              timeoutSeconds: 1
            readinessProbe:
              httpGet:
                path: /health
                port: 8999
              initialDelaySeconds: 15
              periodSeconds: 10
              successThreshold: 1
              failureThreshold: 3
              timeoutSeconds: 1
            resources:
              requests:
                memory: "512Mi"
                cpu: "500m"
              limits:
                memory: "1024Mi"
                cpu: "1000m"
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - name: data-vol
              mountPath: /logs
              subPath: logs
            - name: data-vol
              mountPath: /coredump
              subPath: coredump
          - env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: HOST_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            - name: POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            image: registry-vpc.cn-hangzhou.aliyuncs.com/devops/filebeat:7.4.2-1
            imagePullPolicy: IfNotPresent
            name: filebeat
            resources:
              requests:
                memory: "256Mi"
                cpu: "250m"
              limits:
                memory: "512Mi"
                cpu: "500m"
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - name: filebeat-config
              mountPath: /usr/share/filebeat/filebeat.yml
              subPath: filebeat.yml
            - name: data-vol
              mountPath: /logs
              subPath: logs
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
          - name: data-vol
            persistentVolumeClaim:
              claimName: pvc-nas-prod-platform-business
          - name: filebeat-config
            configMap:
              name: business
              items:
              - key: filebeat.yml
                path: filebeat.yml
  • containers.env.name.sonsL_HTTP_ADDRに対応する値はConslのアドレスであり、サービスは環境変数CONSUL_のみを取得する必要がある。HTTP_ADDRは取得できます