Kubernetes StatefulSet with zookeeper

介绍

官方文档https://kubernetes.io/zh/docs/tutorials/stateful-application/zookeeper/

在部署之前,你需要熟悉以下Kubernetes概念

根据官方要求,zookeeper部署在Kubernetes集群需要具备如下要求

    • node节点资源至少四个节点的集群,每个节点至少 2 CPUs 和 4 GiB 内存

如果在云平台部署zookeeper集群,需要学习相关云厂商的持久化存储,如何与Kubernetes集群融合

配置过程


 整个部署分为以下几个步骤(为了细化官方文档部署过程,以下具体的分段),官方文档给出的example.yaml有缺少遗漏的部分,在下文一一指出,如下

  1. 创建StorageClass
  2. 创建PersistentVolumeClaim
  3. 创建Headless Service
  4. 创建PodDisruptionBudget
  5. 创建StatefulSets

具体配置

  1. 配置文件
    apiVersion: v1
    kind: Service
    metadata:
      name: zk-hs
      namespace: prod
      labels:
        app: zk
    spec:
      ports:
      - port: 2888
        name: server
      - port: 3888
        name: leader-election
      clusterIP: None
      selector:
        app: zk
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: zk-cs
      namespace: prod
      labels:
        app: zk
    spec:
      ports:
      - port: 2181
        name: client
      selector:
        app: zk
    ---
    apiVersion: policy/v1beta1
    kind: PodDisruptionBudget
    metadata:
      name: zk-pdb
      namespace: prod
    spec:
      selector:
        matchLabels:
          app: zk
      maxUnavailable: 1
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: prod-zk
      namespace: prod
    spec:
      selector:
        matchLabels:
          app: zk
      serviceName: zk-hs
      replicas: 3
      updateStrategy:
        type: RollingUpdate
      podManagementPolicy: OrderedReady
      template:
        metadata:
          labels:
            app: zk
        spec:
          tolerations:
            - operator: Exists
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: kubernetes.io/resource
                    operator: In
                    values:
                    - prod-data
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: "app"
                        operator: In
                        values:
                        - zk
                  topologyKey: "kubernetes.io/hostname"
          containers:
          - name: prod-zk
            imagePullPolicy: Always
            image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
            resources:
              requests:
                memory: "1Gi"
                cpu: "0.5"
              limits:
                cpu: "1"
                memory: "2Gi"
            ports:
            - containerPort: 2181
              name: client
            - containerPort: 2888
              name: server
            - containerPort: 3888
              name: leader-election
            command:
            - sh
            - -c
            - "start-zookeeper 
              --servers=3 
              --data_dir=/var/lib/zookeeper/data 
              --data_log_dir=/var/lib/zookeeper/data/log 
              --conf_dir=/opt/zookeeper/conf 
              --client_port=2181 
              --election_port=3888 
              --server_port=2888 
              --tick_time=2000 
              --init_limit=10 
              --sync_limit=5 
              --heap=512M 
              --max_client_cnxns=60 
              --snap_retain_count=3 
              --purge_interval=12 
              --max_session_timeout=40000 
              --min_session_timeout=4000 
              --log_level=INFO"
            readinessProbe:
              exec:
                command:
                - sh
                - -c
                - "zookeeper-ready 2181"
              initialDelaySeconds: 10
              timeoutSeconds: 5
            livenessProbe:
              exec:
                command:
                - sh
                - -c
                - "zookeeper-ready 2181"
              initialDelaySeconds: 10
              timeoutSeconds: 5
            volumeMounts:
            - name: datadir
              mountPath: /var/lib/zookeeper
          # 如果是简单的测试sattefulSet安装zookeeper集群,使用临时存储即可
          # StatefulSet 控制器为 StatefulSet 中的每个 Pod 生成一个 PersistentVolumeClaim
          #volumes:
          #- name: datadir
          #  emptyDir: {}
          securityContext:
            runAsUser: 1000
            fsGroup: 1000
      # 正式环境,需要部署持久化存储
      volumeClaimTemplates:
      - metadata:
          name: datadir
          annotations:
            volume.alpha.kubernetes.io/storage-class: anything
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 20Gi
          storageClassName: alicloud-disk-essd
  2. 修改时区(lens编辑)
    # 时区调整
        volumeMounts:
    ...
                - name: localtime
                  mountPath: /etc/localtime
    ---------------------------------------------------
    
          volumes:
            - name: localtime
              hostPath:
                path: /etc/localtime
                type: ''
原文地址:https://www.cnblogs.com/apink/p/15191368.html