前言
本次的目的是通過使用k8s搭建一個(gè)三節(jié)點(diǎn)的zookeeper集群,因?yàn)?code>zookeeper集群需要用到存儲(chǔ),所以我們需要準(zhǔn)備三個(gè)持久卷(Persistent Volume) 簡(jiǎn)稱就是PV。
創(chuàng)建zk-pv
首先通過nfs創(chuàng)建三個(gè)共享目錄
mkdir -p /data/share/pv/{zk01,zk02,zk03}
分別對(duì)應(yīng)三節(jié)點(diǎn)zk集群中的三個(gè)pod的持久化目錄,創(chuàng)建好目錄之后編寫yaml創(chuàng)建zk-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: k8s-pv-zk01
namespace: tools
labels:
app: zk
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/share/pv/zk01
persistentVolumeReclaimPolicy: Recycle
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: k8s-pv-zk02
namespace: tools
labels:
app: zk
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/share/pv/zk02
persistentVolumeReclaimPolicy: Recycle
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: k8s-pv-zk03
namespace: tools
labels:
app: zk
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/share/pv/zk03
persistentVolumeReclaimPolicy: Recycle
---
使用如下命令創(chuàng)建zk-pk
kubectl create -f zk-pv.yaml
出現(xiàn)如下提示就代表創(chuàng)建成功

這是我們可以通過如下命令去查看創(chuàng)建成功的pv
kubectl get pv -o wide

創(chuàng)建ZK集群
我們選擇使用statefulset去部署zk集群的三節(jié)點(diǎn),并且使用剛剛創(chuàng)建的pv作為存儲(chǔ)設(shè)備。
zk.yaml
apiVersion: v1
kind: Service
metadata:
name: zk-hs
namespace: tools
labels:
app: zk
spec:
selector:
app: zk
clusterIP: None
ports:
- name: server
port: 2888
- name: leader-election
port: 3888
---
apiVersion: v1
kind: Service
metadata:
name: zk-cs
namespace: tools
labels:
app: zk
spec:
selector:
app: zk
type: NodePort
ports:
- name: client
port: 2181
nodePort: 21811
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
namespace: tools
spec:
selector:
matchLabels:
app: zk
maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zk
namespace: tools
spec:
selector:
matchLabels:
app: zk # has to match .spec.template.metadata.labels
serviceName: "zk-hs"
replicas: 3 # by default is 1
updateStrategy:
type: RollingUpdate
podManagementPolicy: Parallel
template:
metadata:
labels:
app: zk # has to match .spec.selector.matchLabels
spec:
containers:
- name: zk
imagePullPolicy: Always
image: leolee32/kubernetes-library:kubernetes-zookeeper1.0-3.4.10
resources:
requests:
memory: "500Mi"
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
volumeClaimTemplates:
- metadata:
name: datadir
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
使用kubectl apply -f zk.yaml部署

可以通過kubect get pods -n tool

可以查看到三個(gè)pod都是running狀態(tài)了,我們?cè)倏磗ervice狀態(tài) 可以通過kubect get svc -n tool

可以看到我們將2181端口通過nodePort映射給了21811暴露出去了。
驗(yàn)證Zk集群是否啟動(dòng)成功
我們可以通過kubectl exec -it zk-1 -n tools /bin/sh 進(jìn)入容器

說明當(dāng)前節(jié)點(diǎn)的ZK是一個(gè)follower節(jié)點(diǎn)
也可以通過以下命令直接查看所有zk節(jié)點(diǎn)的狀態(tài) for i in 0 1 2; do kubectl exec zk-$i -n tools zkServer.sh status; done

兩個(gè)follower節(jié)點(diǎn)一個(gè)leader 代表我們zk集群部署成功!??!