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

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

隨着雲原生化流行的大趨勢,我們的基礎組件也需要逐漸上Kubernetes了。Apache Zookeeper作爲目前最流行的分佈式協調組件,在我們的微服務架構中負責扮演註冊中心的角色。

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

使用StatefulSet部署Zookeeper

官方提供了使用statefulSet的方式來部署 Zookeeper 運行 Zookeeper,它會創建一個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應用這個配置文件,等待一會之後,發現pod和service都已創建成功。

我們檢查一下zookeeper節點的狀態:

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

使用Kubernetes Operator部署Zookeeper

除了StatefulSet的方式外,我們還可以使用Kubernetes Operator的方式部署。目前我們可以參考使用pravega提供的operator。

首先創建自定義的crd ZookeeperCluster

kubectl create -f deploy/crds

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

kubectl create -f deploy/default_ns/rbac.yaml

然後給operator創建deployment

kubectl create -f deploy/default_ns/operator.yaml

我們看到operator已經創建好了:

接下來我們自己編寫一個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已經創建完畢。

擴縮容的話也非常方便,還是以擴容4節點爲例,直接patch我們創建的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

這個時候我們會發現kudo operator已經裝好了:

然後直接安裝一下zookeeper即可(kudo內置了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

近期熱文推薦:

1.600+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章