基于Kubernetes部署Apache Zookeeper

隨著云原生化流行的大趨勢(shì)废士,我們的基礎(chǔ)組件也需要逐漸上Kubernetes了。Apache Zookeeper作為目前最流行的分布式協(xié)調(diào)組件轴合,在我們的微服務(wù)架構(gòu)中負(fù)責(zé)扮演注冊(cè)中心的角色葵萎。在Kubernetes中運(yùn)行Zookeeper集群是很有意義的,可以利用其原生的彈性擴(kuò)縮容吮龄、高可用特性。

使用StatefulSet部署Zookeeper

官方提供了使用statefulSet的方式來部署Zookeeper運(yùn)行Zookeeper咆疗,它會(huì)創(chuàng)建一個(gè)headless service漓帚,一個(gè)cluster service,一個(gè)podDisruptionBudget午磁,一個(gè)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應(yīng)用這個(gè)配置文件,等待一會(huì)之后迅皇,發(fā)現(xiàn)pod和service都已創(chuàng)建成功昧辽。

image

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

將zookeeper部署在kubernetes上一大優(yōu)點(diǎn)就是可以方便擴(kuò)縮容,這邊我們以擴(kuò)容成4個(gè)節(jié)點(diǎn)為例登颓,kubectl edit sts zk搅荞,修改replica:4以及--server=4。可以看到經(jīng)過一段時(shí)間的滾動(dòng)更新咕痛,最終擴(kuò)容成了4個(gè)節(jié)點(diǎn)痢甘。

image

使用Kubernetes Operator部署Zookeeper

除了StatefulSet的方式外,我們還可以使用Kubernetes Operator的方式部署茉贡。目前我們可以參考使用pravega提供的operator塞栅。
首先創(chuàng)建自定義的crd ZookeeperCluster
kubectl create -f deploy/crds
接著創(chuàng)建權(quán)限相關(guān)的,包括serviceAccount腔丧、Role和RoleBinding (注意需要修改一下權(quán)限相關(guān)的rbac.yaml的配置放椰,如果你當(dāng)前的namespace不是default,需要把namespcae: default去掉愉粤,不然權(quán)限驗(yàn)證有問題)砾医。
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)建好了:

image

接下來我們自己編寫一個(gè)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之后等一會(huì)兒可以看到zk已經(jīng)創(chuàng)建完畢衣厘。


image

擴(kuò)縮容的話也非常方便藻烤,還是以擴(kuò)容4節(jié)點(diǎn)為例,直接patch我們創(chuàng)建的cr即可:
kubectl patch zk zookeeper --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value":4}]'

使用Kubernetes Kudo 部署Zookeeper

kudo是一個(gè)適用于kubernetes operator的組裝器头滔,也是官方推薦的怖亭。

首先我們安裝一下kudo,在mac上安裝:
brew install kudo
安裝完之后進(jìn)行初始化
kubectl kudo init
這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn)kudo operator已經(jīng)裝好了:

image

然后直接安裝一下zookeeper即可(kudo內(nèi)置了zookeeper operator)坤检,注意這里同樣聲明一下storage class為rbd兴猩。
kubectl kudo install zookeeper --instance=zookeeper-instance -p STORAGE_CLASS=rbd
image

擴(kuò)縮容的話也非常方便:
kubectl kudo update --instance=zookeeper-instance -p NODE_COUNT=4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末早歇,一起剝皮案震驚了整個(gè)濱河市倾芝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箭跳,老刑警劉巖晨另,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谱姓,居然都是意外死亡借尿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門屉来,熙熙樓的掌柜王于貴愁眉苦臉地迎上來路翻,“玉大人,你說我怎么就攤上這事茄靠∶酰” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵慨绳,是天一觀的道長(zhǎng)掉冶。 經(jīng)常有香客問我真竖,道長(zhǎng),這世上最難降的妖魔是什么厌小? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任恢共,我火速辦了婚禮,結(jié)果婚禮上召锈,老公的妹妹穿的比我還像新娘旁振。我一直安慰自己获询,他們只是感情好涨岁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吉嚣,像睡著了一般梢薪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尝哆,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天秉撇,我揣著相機(jī)與錄音,去河邊找鬼秋泄。 笑死琐馆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恒序。 我是一名探鬼主播瘦麸,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼歧胁!你這毒婦竟也來了滋饲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤喊巍,失蹤者是張志新(化名)和其女友劉穎屠缭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崭参,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呵曹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了何暮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢并。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖郭卫,靈堂內(nèi)的尸體忽然破棺而出砍聊,到底是詐尸還是另有隱情,我是刑警寧澤贰军,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布玻蝌,位于F島的核電站蟹肘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俯树。R本人自食惡果不足惜帘腹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望许饿。 院中可真熱鬧阳欲,春花似錦、人聲如沸陋率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓦糟。三九已至筒愚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菩浙,已是汗流浹背巢掺。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劲蜻,地道東北人陆淀。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像先嬉,于是被迫代替她去往敵國(guó)和親轧苫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容