1 k8s所有节点导入镜像
[root@master231 ~]# wget http://192.168.21.253/Resources/Kubernetes/Case-Demo/zookeeper/oldboyedu-kubernetes-zookeeper-v1.0-3.4.10.tar.gz
[root@master231 ~]# scp oldboyedu-kubernetes-zookeeper-v1.0-3.4.10.tar.gz 10.0.0.232:~
[root@master231 ~]# scp oldboyedu-kubernetes-zookeeper-v1.0-3.4.10.tar.gz 10.0.0.233:~
其他所有节点要导入镜像:
[root@master231 ~]# docker load -i oldboyedu-kubernetes-zookeeper-v1.0-3.4.10.tar.gz
[root@worker232 ~]# docker load -i oldboyedu-kubernetes-zookeeper-v1.0-3.4.10.tar.gz
[root@worker233 ~]# docker load -i oldboyedu-kubernetes-zookeeper-v1.0-3.4.10.tar.gz
2 编写资源清单
[root@master231 statefulsets]# cat > 05-sts-zookeeper-cluster.yaml << ‘EOF’
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/v1
# 此类型用于定义可以对一组Pod造成的最大中断,说白了就是最大不可用的Pod数量。
# 一般情况下,对于分布式集群而言,假设集群故障容忍度为N,则集群最少需要2N+1个Pod。
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
# 匹配Pod
selector:
matchLabels:
app: zk
# 最大不可用的Pod数量。这意味着将来zookeeper集群,最少要2*1 +1 = 3个Pod数量。
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:
tolerations:
– key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: “app”
operator: In
values:
– zk
topologyKey: “kubernetes.io/hostname”
containers:
– name: kubernetes-zookeeper
imagePullPolicy: IfNotPresent
image: “registry.k8s.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
EOF
3 实时观察Pod状态
[root@master231 statefulsets]# kubectl apply -f 05-sts-zookeeper-cluster.yaml
service/zk-hs created
service/zk-cs created
poddisruptionbudget.policy/zk-pdb created
statefulset.apps/zk created
[root@master231 statefulsets]#
[root@master231 statefulsets]# kubectl get pods -o wide -w -l app=zk
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
zk-0 0/1 Pending 0 0s <none> <none> <none> <none>
zk-0 0/1 Pending 0 1s <none> worker233 <none> <none>
zk-0 0/1 ContainerCreating 0 1s <none> worker233 <none> <none>
zk-0 0/1 ContainerCreating 0 3s <none> worker233 <none> <none>
zk-0 0/1 Running 0 7s 10.100.140.125 worker233 <none> <none>
zk-0 1/1 Running 0 22s 10.100.140.125 worker233 <none> <none>
zk-1 0/1 Pending 0 0s <none> <none> <none> <none>
zk-1 0/1 Pending 0 0s <none> master231 <none> <none>
zk-1 0/1 ContainerCreating 0 0s <none> master231 <none> <none>
zk-1 0/1 ContainerCreating 0 1s <none> master231 <none> <none>
zk-1 0/1 Running 0 5s 10.100.160.189 master231 <none> <none>
zk-1 1/1 Running 0 21s 10.100.160.189 master231 <none> <none>
zk-2 0/1 Pending 0 0s <none> <none> <none> <none>
zk-2 0/1 Pending 0 0s <none> worker232 <none> <none>
zk-2 0/1 ContainerCreating 0 0s <none> worker232 <none> <none>
zk-2 0/1 ContainerCreating 0 1s <none> worker232 <none> <none>
zk-2 0/1 Running 0 5s 10.100.203.188 worker232 <none> <none>
zk-2 1/1 Running 0 21s 10.100.203.188 worker232 <none> <none>
…
4 检查后端的存储
[root@master231 statefulsets]# kubectl get po,pvc -l app=zk
NAME READY STATUS RESTARTS AGE
pod/zk-0 1/1 Running 0 72s
pod/zk-1 1/1 Running 0 61s
pod/zk-2 1/1 Running 0 50s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/datadir-zk-0 Bound pvc-8fa25151-0d0f-4493-97f6-62ff64bd6f09 10Gi RWO oldboyedu-sc-haha 3m32s
persistentvolumeclaim/datadir-zk-1 Bound pvc-630f592d-caf0-47e9-bfaa-9a9397c8344c 10Gi RWO oldboyedu-sc-haha 3m20s
persistentvolumeclaim/datadir-zk-2 Bound pvc-11cfccc3-7509-445b-ba7b-9072b20227b1 10Gi RWO oldboyedu-sc-haha 3m8s
[root@master231 statefulsets]#
5.验证集群是否正常
[root@master231 statefulsets]# for i in 0 1 2; do kubectl exec zk-$i — hostname; done
zk-0
zk-1
zk-2
[root@master231 statefulsets]#
[root@master231 statefulsets]# for i in 0 1 2; do echo “myid zk-$i”;kubectl exec zk-$i — cat /var/lib/zookeeper/data/myid; done
myid zk-0
1
myid zk-1
2
myid zk-2
3
[root@master231 statefulsets]#
[root@master231 statefulsets]# for i in 0 1 2; do kubectl exec zk-$i — hostname -f; done
zk-0.zk-hs.default.svc.oldboyedu.com
zk-1.zk-hs.default.svc.oldboyedu.com
zk-2.zk-hs.default.svc.oldboyedu.com
[root@master231 statefulsets]#
[root@master231 statefulsets]# kubectl exec zk-0 — cat /opt/zookeeper/conf/zoo.cfg
#This file was autogenerated DO NOT EDIT
clientPort=2181
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/data/log
tickTime=2000
initLimit=10
syncLimit=5
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
autopurge.snapRetainCount=3
autopurge.purgeInteval=12
server.1=zk-0.zk-hs.default.svc.oldboyedu.com:2888:3888
server.2=zk-1.zk-hs.default.svc.oldboyedu.com:2888:3888
server.3=zk-2.zk-hs.default.svc.oldboyedu.com:2888:3888
[root@master231 statefulsets]#
[root@master231 statefulsets]# kubectl exec zk-1 — cat /opt/zookeeper/conf/zoo.cfg
#This file was autogenerated DO NOT EDIT
clientPort=2181
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/data/log
tickTime=2000
initLimit=10
syncLimit=5
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
autopurge.snapRetainCount=3
autopurge.purgeInteval=12
server.1=zk-0.zk-hs.default.svc.oldboyedu.com:2888:3888
server.2=zk-1.zk-hs.default.svc.oldboyedu.com:2888:3888
server.3=zk-2.zk-hs.default.svc.oldboyedu.com:2888:3888
[root@master231 statefulsets]#
[root@master231 statefulsets]# kubectl exec zk-2 — cat /opt/zookeeper/conf/zoo.cfg
#This file was autogenerated DO NOT EDIT
clientPort=2181
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/data/log
tickTime=2000
initLimit=10
syncLimit=5
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
autopurge.snapRetainCount=3
autopurge.purgeInteval=12
server.1=zk-0.zk-hs.default.svc.oldboyedu.com:2888:3888
server.2=zk-1.zk-hs.default.svc.oldboyedu.com:2888:3888
server.3=zk-2.zk-hs.default.svc.oldboyedu.com:2888:3888
[root@master231 statefulsets]#
6 创建数据测试
6.1 在一个Pod写入数据
[root@master231 statefulsets]# kubectl exec -it zk-1 — zkCli.sh
…
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] [zk: localhost:2181(CONNECTED) 1] create /school oldboyedu Created /school
[zk: localhost:2181(CONNECTED) 2]
[zk: localhost:2181(CONNECTED) 2] create /school/linux97 XIXI Created /school/linux97
[zk: localhost:2181(CONNECTED) 3]
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper, school]
[zk: localhost:2181(CONNECTED) 4] [zk: localhost:2181(CONNECTED) 4] ls /school
[linux97]
[zk: localhost:2181(CONNECTED) 5] 6.2 在另一个Pod查看下数据 [root@master231 statefulsets]# kubectl exec -it zk-2 — zkCli.sh … [zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, school]
[zk: localhost:2181(CONNECTED) 1] get /school/linux97 XIXI cZxid = 0x100000003 ctime = Mon Jun 09 03:10:51 UTC 2025 mZxid = 0x100000003 mtime = Mon Jun 09 03:10:51 UTC 2025 pZxid = 0x100000003 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0
[zk: localhost:2181(CONNECTED) 2]
7 查看start-zookeeper 脚本逻辑 [root@master231 statefulsets]# kubectl exec -it zk-0 — bash zookeeper@zk-0:/$ zookeeper@zk-0:/$ which start-zookeeper /usr/bin/start-zookeeper zookeeper@zk-0:/$ zookeeper@zk-0:/$ wc -l /usr/bin/start-zookeeper 320 /usr/bin/start-zookeeper zookeeper@zk-0:/$ zookeeper@zk-0:/$ cat /usr/bin/start-zookeeper ;echo …. 8.删除资源 [root@master231 statefulsets]# kubectl delete -f 05-sts-zookeeper.yaml service “zk-hs” deleted service “zk-cs” deleted poddisruptionbudget.policy “zk-pdb” deleted statefulset.apps “zk” deleted [root@master231 statefulsets]#