隨著云原生化流行的大趨勢(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)建成功昧辽。
我們檢查一下zookeeper節(jié)點(diǎn)的狀態(tài):
將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)痢甘。
使用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)建好了:
接下來我們自己編寫一個(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)建完畢衣厘。
擴(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)裝好了:
然后直接安裝一下zookeeper即可(kudo內(nèi)置了zookeeper operator)坤检,注意這里同樣聲明一下storage class為rbd兴猩。
kubectl kudo install zookeeper --instance=zookeeper-instance -p STORAGE_CLASS=rbd
擴(kuò)縮容的話也非常方便:
kubectl kudo update --instance=zookeeper-instance -p NODE_COUNT=4
。