<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于 Kubernetes 部署 Zookeeper,太有意思了!

          共 10241字,需瀏覽 21分鐘

           ·

          2021-05-29 09:22

          點擊關注公眾號,Java干貨及時送達

          作者:fredalxin
          地址:https://fredal.xin/deploy-zk-with-k8s

          隨著云原生化流行的大趨勢,我們的基礎組件也需要逐漸上Kubernetes了。Apache Zookeeper作為目前最流行的分布式協(xié)調(diào)組件,在我們的微服務架構(gòu)中負責扮演注冊中心的角色。

          在Kubernetes中運行Zookeeper集群是很有意義的,可以利用其原生的彈性擴縮容、高可用特性。

          使用StatefulSet部署Zookeeper

          官方提供了使用statefulSet的方式來部署 Zookeeper 運行 Zookeeper,它會創(chuàng)建一個headless service,一個cluster service,一個podDisruptionBudget,一個statefulSet。

          apiVersion: v1
          kind: Service
          metadata:
            name: zk-hs
            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
            labels:
              app: zk
          spec:
            ports:
            - port: 2181
              name: client
            selector:
              app: zk
          ---
          apiVersion: policy/v1beta1
          kind: PodDisruptionBudget
          metadata:
            name: zk-pdb
          spec:
            selector:
              matchLabels:
                app: zk
            maxUnavailable: 1
          ---
          apiVersion: apps/v1
          kind: StatefulSet
          metadata:
            name: zk
          spec:
            selector:
              matchLabels:
                app: zk
            serviceName: zk-hs
            replicas: 3
            updateStrategy:
              type: RollingUpdate
            podManagementPolicy: OrderedReady
            template:
              metadata:
                labels:
                  app: zk
              spec:
                affinity:
                  podAntiAffinity:
                    requiredDuringSchedulingIgnoredDuringExecution:
                      - labelSelector:
                          matchExpressions:
                            - key: "app"
                              operator: In
                              values:
                              - zk
                        topologyKey: "kubernetes.io/hostname"
                containers:
                - name: kubernetes-zookeeper
                  imagePullPolicy: Always
                  image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
                  resources:
                    requests:
                      memory: "1Gi"
                      cpu: "0.5"
                  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
                securityContext:
                  runAsUser: 1000
                  fsGroup: 1000
            volumeClaimTemplates:
            - metadata:
                name: datadir
              spec:
                accessModes: [ "ReadWriteOnce" ]
                resources:
                  requests:
                    storage: 10Gi

          使用 kubectl apply應用這個配置文件,等待一會之后,發(fā)現(xiàn)pod和service都已創(chuàng)建成功。

          我們檢查一下zookeeper節(jié)點的狀態(tài):

          將zookeeper部署在kubernetes上一大優(yōu)點就是可以方便擴縮容,這邊我們以擴容成4個節(jié)點為例,kubectl edit sts zk,修改 replica:4以及 --server=4。可以看到經(jīng)過一段時間的滾動更新,最終擴容成了4個節(jié)點。

          使用Kubernetes Operator部署Zookeeper

          除了StatefulSet的方式外,我們還可以使用Kubernetes Operator的方式部署。目前我們可以參考使用pravega提供的operator。另外,關注公眾號Java技術棧,在后臺回復:面試,可以獲取我整理的 Zookeeper 系列面試題和答案,非常齊全。

          首先創(chuàng)建自定義的crd ZookeeperCluster

          kubectl create -f deploy/crds

          接著創(chuàng)建權限相關的,包括serviceAccount、Role和RoleBinding (注意需要修改一下權限相關的rbac.yaml的配置,如果你當前的namespace不是default,需要把namespcae: default去掉,不然權限驗證有問題)。

          kubectl create -f deploy/default_ns/rbac.yaml

          然后給operator創(chuàng)建deployment

          kubectl create -f deploy/default_ns/operator.yaml

          我們看到operator已經(jīng)創(chuàng)建好了:

          接下來我們自己編寫一個CR即可:

          apiVersion: zookeeper.pravega.io/v1beta1
          kind: ZookeeperCluster
          metadata:
            name: zookeeper
          spec:
            replicas: 3
            image:
              repository: pravega/zookeeper
              tag: 0.2.9
            storageType: persistence
            persistence:
              reclaimPolicy: Delete
              spec:
                storageClassName: "rbd"
                resources:
                  requests:
                    storage: 8Gi

          這里的storageClassName配合自建集群選擇了rbd。apply之后等一會兒可以看到zk已經(jīng)創(chuàng)建完畢。

          擴縮容的話也非常方便,還是以擴容4節(jié)點為例,直接patch我們創(chuàng)建的cr即可:

          kubectl patch zk zookeeper --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value":4}]'

          使用Kubernetes Kudo部署Zookeeper

          kudo 是一個適用于kubernetes operator的組裝器,也是官方推薦的。

          首先我們安裝一下kudo,在mac上安裝:

          brew install kudo

          安裝完之后進行初始化

          kubectl kudo init

          這個時候我們會發(fā)現(xiàn)kudo operator已經(jīng)裝好了:

          然后直接安裝一下zookeeper即可(kudo內(nèi)置了zookeeper operator),注意這里同樣聲明一下storage class為rbd。

          kubectl kudo install zookeeper --instance=zookeeper-instance -p STORAGE_CLASS=rbd

          擴縮容的話也非常方便:kubectl kudo update --instance=zookeeper-instance -p NODE_COUNT=4另外,關注公眾號Java技術棧,在后臺回復:面試,可以獲取我整理的 Zookeeper 系列面試題和答案,非常齊全。






          關注Java技術棧看更多干貨



          獲取 Spring Boot 實戰(zhàn)筆記!
          瀏覽 58
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天干天天舔 | 99综合| 亚洲免费在线视频播放 | 999热视频 | 亚洲成人精品在线观看 |