0


Kubernetes的有状态应用示例:ZooKeeper

文章目录

环境

  • RHEL 9.3
  • Docker Community 24.0.7
  • minikube v1.32.0

ZooKeeper简介

Apache ZooKeeper是一个分布式的开源协调服务,用于分布式系统。ZooKeeper允许你读、写数据以及发现数据更新。数据按层次结构组织在文件系统中,并复制到ensemble(ZooKeeper服务器集合)中所有的ZooKeeper服务器。对数据的所有操作都是原子的和顺序一致的。ZooKeeper通过Zab共识协议在ensemble的所有服务器之间复制状态机,来确保这个特性。

Ensemble使用Zab协议选举一个leader,在选举出leader前不能写入数据。选举出leader后,ensemble使用Zab来确保所有写操作被复制到一个quorum,然后这些写操作才会被确认并对客户端可见。如果没有遵照加权quorums,quorum是包含当前leader的ensemble的主要组件。 例如,如果ensemble有3个服务器,一个包含leader和另一个服务器的组件构成一个quorum。如果ensemble不能达成一个quorum,数据将不能被写入。

ZooKeeper在内存中保存它们的整个状态机,并把每个改变都写入一个持久的WAL(Write Ahead Log)。当一个服务器宕机时,它能够通过回放WAL恢复之前的状态。为了防止WAL无限制的增长,ZooKeeper服务器会定期的将内存状态快照保存到存储介质。这些快照能够直接加载到内存,快照之前的所有WAL条目都可以被丢弃。

准备

清理环境:

  1. minikube delete --all

重启电脑。

启动minikube:

  1. minikube start

确认环境干净:

  1. $ kubectl get all
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11m
  1. $ kubectl get pvc
  2. No resources found in default namespace.
  1. $ kubectl get pv
  2. No resources found

创建文件

  1. zookeeper.yaml

如下:

  1. apiVersion: v1
  2. kind: Service
  3. metadata:name: zk-hs
  4. labels:app: zk
  5. spec:ports:-port:2888name: server
  6. -port:3888name: leader-election
  7. clusterIP: None
  8. selector:app: zk
  9. ---apiVersion: v1
  10. kind: Service
  11. metadata:name: zk-cs
  12. labels:app: zk
  13. spec:ports:-port:2181name: client
  14. selector:app: zk
  15. ---apiVersion: policy/v1
  16. kind: PodDisruptionBudget
  17. metadata:name: zk-pdb
  18. spec:selector:matchLabels:app: zk
  19. maxUnavailable:1---apiVersion: apps/v1
  20. kind: StatefulSet
  21. metadata:name: zk
  22. spec:selector:matchLabels:app: zk
  23. serviceName: zk-hs
  24. replicas:3updateStrategy:type: RollingUpdate
  25. podManagementPolicy: OrderedReady
  26. template:metadata:labels:app: zk
  27. spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchExpressions:-key:"app"operator: In
  28. values:- zk
  29. topologyKey:"kubernetes.io/hostname"containers:-name: kubernetes-zookeeper
  30. imagePullPolicy: Always
  31. # image: "registry.k8s.io/kubernetes-zookeeper:1.0-3.4.10"image:"docker.io/kaiding1/kubernetes-zookeeper:1.0-3.4.10"resources:requests:memory:"1Gi"cpu:"0.5"ports:-containerPort:2181name: client
  32. -containerPort:2888name: server
  33. -containerPort:3888name: leader-election
  34. command:- sh
  35. --c
  36. - "start-zookeeper \
  37. --servers=3 \
  38. --data_dir=/var/lib/zookeeper/data \
  39. --data_log_dir=/var/lib/zookeeper/data/log \
  40. --conf_dir=/opt/zookeeper/conf \
  41. --client_port=2181 \
  42. --election_port=3888 \
  43. --server_port=2888 \
  44. --tick_time=2000 \
  45. --init_limit=10 \
  46. --sync_limit=5 \
  47. --heap=512M \
  48. --max_client_cnxns=60 \
  49. --snap_retain_count=3 \
  50. --purge_interval=12 \
  51. --max_session_timeout=40000 \
  52. --min_session_timeout=4000 \
  53. --log_level=INFO"
  54. readinessProbe:exec:command:- sh
  55. --c
  56. -"zookeeper-ready 2181"initialDelaySeconds:10timeoutSeconds:5livenessProbe:exec:command:- sh
  57. --c
  58. -"zookeeper-ready 2181"initialDelaySeconds:10timeoutSeconds:5volumeMounts:-name: datadir
  59. mountPath: /var/lib/zookeeper
  60. securityContext:runAsUser:1000fsGroup:1000volumeClaimTemplates:-metadata:name: datadir
  61. spec:accessModes:["ReadWriteOnce"]resources:requests:storage: 10Gi

注:因为访问不了

  1. registry.k8s.io

,所以事先把image pull下来,并push到了可访问的位置。

部署

尝试1

  1. $ kubectl apply -f zookeeper.yaml
  2. service/zk-hs created
  3. service/zk-cs created
  4. poddisruptionbudget.policy/zk-pdb created
  5. statefulset.apps/zk created

检查pod:

  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. zk-0 1/1 Running 0 57s
  4. zk-1 0/1 Pending 0 35s

进入

  1. zk-0

pod:

  1. kubectl exec -it zk-0 -- bash

查看当前身份以及

  1. /var/lib/zookeeper

目录:

  1. zookeeper@zk-0:/$ whoami
  2. zookeeper
  1. zookeeper@zk-0:/$ ls-l /var/lib
  2. total 0
  3. drwxr-xr-x. 1 root root 42 Jun 13 2017 apt
  4. ......
  5. drwxrwxrwx. 3 root root 18 Feb 6 07:13 zookeeper
  1. zookeeper@zk-0:/$ ls-l /var/lib/zookeeper/
  2. total 0
  3. drwxr-xr-x. 4 zookeeper zookeeper 46 Feb 6 07:13 data

可见,

  1. /var/lib/zookeeper

目录是

  1. 777

,所以

  1. zookeeper

能在此创建目录。

退出容器,再次查看pod:

  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. zk-0 1/1 Running 0 7m37s
  4. zk-1 0/1 Pending 0 7m15s

可见,

  1. zk-1

始终处于

  1. Pending

状态。

  1. $ kubectl describe pod zk-1
  2. ......
  3. Events:
  4. Type Reason Age From Message
  5. -------------------------
  6. Warning FailedScheduling 8m4s default-scheduler 0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..
  7. Warning FailedScheduling 2m39s (x2 over 8m3s) default-scheduler 0/1 nodes are available: 1 node(s) didn't match pod anti-affinity rules. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod..

可见,在affinity规则下,没有符合条件的node。

尝试2

清理环境:

  1. $ kubectl delete -f zookeeper.yaml
  2. service "zk-hs" deleted
  3. service "zk-cs" deleted
  4. poddisruptionbudget.policy "zk-pdb" deleted
  5. statefulset.apps "zk" deleted
  1. $ kubectl get pvc
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. datadir-zk-0 Bound pvc-f4a42476-b3e7-48ca-ad8d-b8f6ec278f1e 10Gi RWO standard 15m
  4. datadir-zk-1 Bound pvc-924378b6-5810-4ebc-86a7-90037221381f 10Gi RWO standard 14m
  1. $ kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. pvc-924378b6-5810-4ebc-86a7-90037221381f 10Gi RWO Delete Bound default/datadir-zk-1 standard 14m
  4. pvc-f4a42476-b3e7-48ca-ad8d-b8f6ec278f1e 10Gi RWO Delete Bound default/datadir-zk-0 standard 15m
  1. $ kubectl delete pvc datadir-zk-0 datadir-zk-1
  2. persistentvolumeclaim "datadir-zk-0" deleted
  3. persistentvolumeclaim "datadir-zk-1" deleted

修改

  1. zookeeper.yaml

,把

  1. requiredDuringSchedulingIgnoredDuringExecution

改为

  1. preferredDuringSchedulingIgnoredDuringExecution

  1. ......spec:affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:100podAffinityTerm:labelSelector:matchExpressions:-key:"app"operator: In
  2. values:- zookeeper
  3. topologyKey:"kubernetes.io/hostname"......
  1. $ kubectl apply -f zookeeper2.yaml
  2. service/zk-hs created
  3. service/zk-cs created
  4. poddisruptionbudget.policy/zk-pdb created
  5. statefulset.apps/zk created
  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. zk-0 1/1 Running 0 2m1s
  4. zk-1 1/1 Running 0 99s
  5. zk-2 1/1 Running 0 77s
  1. $ kubectl get sts
  2. NAME READY AGE
  3. zk 3/3 6m31s

注:如果又遇到pod

  1. Pending

问题,有以下错误:

  1. Events:
  2. Type Reason Age From Message
  3. -------------------------
  4. Warning FailedScheduling <unknown> default-scheduler 0/1 nodes are available: 1 Insufficient memory.
  5. Warning FailedScheduling <unknown> default-scheduler 0/1 nodes are available: 1 Insufficient memory.

则需要先

  1. minikube delete

,然后在启动minikube时,增大内存,比如:

  1. minikube start--memory='7500mb'

查看存储:

  1. $ kubectl get pvc
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. datadir-zk-0 Bound pvc-7b501343-085f-48d8-b88a-ade5686b26c9 10Gi RWO standard 7m18s
  4. datadir-zk-1 Bound pvc-4af3ab29-a3c8-4b26-addf-40656e998021 10Gi RWO standard 6m56s
  5. datadir-zk-2 Bound pvc-60869d4a-389d-4f86-8446-4fda9858fe40 10Gi RWO standard 6m34s
  1. $ kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. pvc-4af3ab29-a3c8-4b26-addf-40656e998021 10Gi RWO Delete Bound default/datadir-zk-1 standard 6m58s
  4. pvc-60869d4a-389d-4f86-8446-4fda9858fe40 10Gi RWO Delete Bound default/datadir-zk-2 standard 6m36s
  5. pvc-7b501343-085f-48d8-b88a-ade5686b26c9 10Gi RWO Delete Bound default/datadir-zk-0 standard 7m20s

验证

进入容器:

  1. kubectl exec -it zk-0 -- bash

检查连通性:

  1. zookeeper@zk-0:/$ echo"Are you ok? $(echo ruok | nc 127.0.0.1 2181)"
  2. Are you ok? imok

检查模式:

  1. zookeeper@zk-0:/$ echo srvr | nc localhost 2181
  2. Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  3. Latency min/avg/max: 0/0/0
  4. Received: 123
  5. Sent: 122
  6. Connections: 1
  7. Outstanding: 0
  8. Zxid: 0x0
  9. Mode: follower
  10. Node count: 4

可见,pod

  1. zk-0

是一个follower。

退出容器,用同样的方法检查另外两个pod:

  1. zookeeper@zk-1:/$ echo srvr | nc localhost 2181 | grep -i mode
  2. Mode: leader
  1. zookeeper@zk-2:/$ echo srvr | nc localhost 2181 | grep -i mode
  2. Mode: follower

在leader pod里:

  1. zookeeper@zk-1:/$ echo dump | nc localhost 2181
  2. SessionTracker dump:
  3. Session Sets (0):
  4. ephemeral nodes dump:
  5. Sessions with Ephemerals (0):
  1. zookeeper@zk-1:/$ echo stat | nc localhost 2181
  2. Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  3. Clients:
  4. /127.0.0.1:60780[0](queued=0,recved=1,sent=0)
  5. Latency min/avg/max: 0/0/0
  6. Received: 221
  7. Sent: 220
  8. Connections: 1
  9. Outstanding: 0
  10. Zxid: 0x100000000
  11. Mode: leader
  12. Node count: 4
  1. zookeeper@zk-1:/$ echo envi | nc localhost 2181
  2. Environment:
  3. zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  4. host.name=zk-1.zk-hs.default.svc.cluster.local
  5. java.version=1.8.0_131
  6. java.vendor=Oracle Corporation
  7. java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  8. java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  9. java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  10. java.io.tmpdir=/tmp
  11. java.compiler=<NA>
  12. os.name=Linux
  13. os.arch=amd64
  14. os.version=5.14.0-362.18.1.el9_3.x86_64
  15. user.name=zookeeper
  16. user.home=/home/zookeeper
  17. user.dir=/
  1. zookeeper@zk-1:/$ echo conf | nc localhost 2181
  2. clientPort=2181
  3. dataDir=/var/lib/zookeeper/data/version-2
  4. dataLogDir=/var/lib/zookeeper/data/log/version-2
  5. tickTime=2000
  6. maxClientCnxns=60
  7. minSessionTimeout=4000
  8. maxSessionTimeout=40000
  9. serverId=2
  10. initLimit=10
  11. syncLimit=5
  12. electionAlg=3
  13. electionPort=3888
  14. quorumPort=2888
  15. peerType=0
  1. zookeeper@zk-1:/$ echo mntr | nc localhost 2181
  2. zk_version 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  3. zk_avg_latency 0
  4. zk_max_latency 0
  5. zk_min_latency 0
  6. zk_packets_received 242
  7. zk_packets_sent 241
  8. zk_num_alive_connections 1
  9. zk_outstanding_requests 0
  10. zk_server_state leader
  11. zk_znode_count 4
  12. zk_watch_count 0
  13. zk_ephemerals_count 0
  14. zk_approximate_data_size 27
  15. zk_open_file_descriptor_count 41
  16. zk_max_file_descriptor_count 1048576
  17. zk_followers 2
  18. zk_synced_followers 2
  19. zk_pending_syncs 0

事实上,在spec中,使用了

  1. zookeeper-ready 2181

来作为

  1. readinessProbe

  1. livenessProbe

  1. ......readinessProbe:exec:command:- sh
  2. --c
  3. -"zookeeper-ready 2181"initialDelaySeconds:10timeoutSeconds:5livenessProbe:exec:command:- sh
  4. --c
  5. -"zookeeper-ready 2181"initialDelaySeconds:10timeoutSeconds:5......

查看

  1. zookeeper-ready

  1. zookeeper@zk-1:/$ which zookeeper-ready
  2. /usr/bin/zookeeper-ready
  1. zookeeper@zk-1:/$ cat/usr/bin/zookeeper-ready
  2. #!/usr/bin/env bash# Copyright 2017 The Kubernetes Authors.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# zkOk.sh uses the ruok ZooKeeper four letter work to determine if the instance# is health. The $? variable will be set to 0 if server responds that it is # healthy, or 1 if the server fails to respond.
  3. OK=$(echo ruok | nc 127.0.0.1 $1)if["$OK" == "imok"]; then
  4. exit 0
  5. elseexit 1
  6. fi

可见,它就是用上面的方法来检测连通性的。

深入了解ZooKeeper

leader和follower

每个ZooKeeper ensemble里的服务器节点都有一个唯一的ID与其网络地址关联。每个node都知道该ID。

hostname:

  1. $ for i in 0 1 2;do kubectl exec zk-$i-- hostname; done
  2. zk-0
  3. zk-1
  4. zk-2

ZooKeeper node在数据目录的

  1. myid

文件中存储其服务器ID(本例中数据目录是

  1. /var/lib/zookeeper

)。

  1. $ for i in 0 1 2;doecho"myid zk-$i"; kubectl exec zk-$i--cat/var/lib/zookeeper/data/myid; done
  2. myid zk-0
  3. 1
  4. myid zk-1
  5. 2
  6. myid zk-2
  7. 3

注意:Kubernetes从0开始计数,而ZooKeeper是从1开始计数。

查看FQDN(Fully Qualified Domain Name):

  1. $ for i in 0 1 2;do kubectl exec zk-$i-- hostname -f; done
  2. zk-0.zk-hs.default.svc.cluster.local
  3. zk-1.zk-hs.default.svc.cluster.local
  4. zk-2.zk-hs.default.svc.cluster.local

ZooKeeper headless service为StatefulSet中的每个pod创建一个域名。

Kubernetes DNS中的A记录将FQDN解析为pod的IP地址。将来如果pod被重新调度或者升级,则A记录会放置新的IP地址,但是名字保持不变。

ZooKeeper使用一个

  1. zoo.cfg

的配置文件(

  1. /opt/zookeeper/conf/zoo.cfg

)。我们来查看该文件:

  1. $ kubectl exec zk-0 --cat/opt/zookeeper/conf/zoo.cfg
  2. #This file was autogenerated DO NOT EDIT
  3. clientPort=2181
  4. dataDir=/var/lib/zookeeper/data
  5. dataLogDir=/var/lib/zookeeper/data/log
  6. tickTime=2000
  7. initLimit=10
  8. syncLimit=5
  9. maxClientCnxns=60
  10. minSessionTimeout=4000
  11. maxSessionTimeout=40000
  12. autopurge.snapRetainCount=3
  13. autopurge.purgeInteval=12
  14. server.1=zk-0.zk-hs.default.svc.cluster.local:2888:3888
  15. server.2=zk-1.zk-hs.default.svc.cluster.local:2888:3888
  16. server.3=zk-2.zk-hs.default.svc.cluster.local:2888:3888

该文件是由

  1. start-zookeeper

创建的:

  1. ......- sh
  2. --c
  3. - "start-zookeeper \
  4. --servers=3 \
  5. --data_dir=/var/lib/zookeeper/data \
  6. --data_log_dir=/var/lib/zookeeper/data/log \
  7. --conf_dir=/opt/zookeeper/conf \
  8. ......

测试

使用ZooKeeper的命令行工具

  1. zkCli.sh

来测试。它可以:

  • 创建znode
  • 获取数据
  • 监视znode变化
  • 把数据放置于znode
  • 为znode创建子节点
  • 列出子节点
  • 检查状态
  • 删除znode

ZooKeeper里的znode既像文件(可以有内容),也像目录(可以有子znode)。

我们来把

  1. world

写入

  1. zk-0

  1. /hello

里。

  1. $ kubectl exec zk-0 zkCli.sh create /hello world
  2. kubectl exec [POD][COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD]--[COMMAND] instead.
  3. Connecting to localhost:2181
  4. 2024-02-06 08:35:34,023 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  5. 2024-02-06 08:35:34,027 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-0.zk-hs.default.svc.cluster.local
  6. 2024-02-06 08:35:34,027 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  7. 2024-02-06 08:35:34,028 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  8. 2024-02-06 08:35:34,028 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  9. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  10. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  11. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  12. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  13. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  14. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  15. 2024-02-06 08:35:34,029 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  16. 2024-02-06 08:35:34,030 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  17. 2024-02-06 08:35:34,030 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  18. 2024-02-06 08:35:34,030 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  19. 2024-02-06 08:35:34,031 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  20. 2024-02-06 08:35:34,051 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  21. 2024-02-06 08:35:34,096 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  22. 2024-02-06 08:35:34,114 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x18d7d581b330000, negotiated timeout = 30000
  23. WATCHER::
  24. WatchedEvent state:SyncConnected type:None path:null
  25. Created /hello

然后从另一个pod读取该值:

  1. $ kubectl exec zk-1 -- zkCli.sh get /hello
  2. Connecting to localhost:2181
  3. 2024-02-06 08:36:34,736 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  4. 2024-02-06 08:36:34,738 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-1.zk-hs.default.svc.cluster.local
  5. 2024-02-06 08:36:34,738 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  6. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  7. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  8. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  9. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  10. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  11. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  12. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  13. 2024-02-06 08:36:34,740 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  14. 2024-02-06 08:36:34,741 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  15. 2024-02-06 08:36:34,741 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  16. 2024-02-06 08:36:34,741 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  17. 2024-02-06 08:36:34,741 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  18. 2024-02-06 08:36:34,742 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  19. 2024-02-06 08:36:34,755 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  20. 2024-02-06 08:36:34,820 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  21. 2024-02-06 08:36:34,833 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x28d7d581b360000, negotiated timeout = 30000
  22. WATCHER::
  23. WatchedEvent state:SyncConnected type:None path:null
  24. world
  25. cZxid = 0x100000002
  26. ctime = Tue Feb 06 08:35:34 UTC 2024
  27. mZxid = 0x100000002
  28. mtime = Tue Feb 06 08:35:34 UTC 2024
  29. pZxid = 0x100000002
  30. cversion = 0
  31. dataVersion = 0
  32. aclVersion = 0
  33. ephemeralOwner = 0x0
  34. dataLength = 5
  35. numChildren = 0

事实上,ZooKeeper ensemble里的每个服务器都可以读取

  1. /hello

  1. $ for i in 0 1 2;do kubectl exec zk-$i-- zkCli.sh get /hello | grep world; done
  2. world
  3. cZxid = 0x100000002
  4. ctime = Tue Feb 06 08:35:34 UTC 2024
  5. mZxid = 0x100000002
  6. mtime = Tue Feb 06 08:35:34 UTC 2024
  7. pZxid = 0x100000002
  8. cversion = 0
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 5
  13. numChildren = 0
  14. world
  15. cZxid = 0x100000002
  16. ctime = Tue Feb 06 08:35:34 UTC 2024
  17. mZxid = 0x100000002
  18. mtime = Tue Feb 06 08:35:34 UTC 2024
  19. pZxid = 0x100000002
  20. cversion = 0
  21. dataVersion = 0
  22. aclVersion = 0
  23. ephemeralOwner = 0x0
  24. dataLength = 5
  25. numChildren = 0
  26. cZxid = 0x100000002
  27. world
  28. ctime = Tue Feb 06 08:35:34 UTC 2024
  29. mZxid = 0x100000002
  30. mtime = Tue Feb 06 08:35:34 UTC 2024
  31. pZxid = 0x100000002
  32. cversion = 0
  33. dataVersion = 0
  34. aclVersion = 0
  35. ephemeralOwner = 0x0
  36. dataLength = 5
  37. numChildren = 0

容忍node故障

我们来看一下共识算法。删除一个服务器,然后尝试向ZooKeeper ensemble中写入数据,由于还有两个ZooKeeper服务器,所以写入操作还能继续工作。

  1. $ kubectl delete --force=true --grace-period=0 pod zk-2 &
  2. sleep 1; kubectl delete --force=true --grace-period=0 pod zk-2 &
  3. sleep 1
  4. kubectl exec zk-0 zkCli.sh set/hello world_should_work
  5. sleep 1
  6. kubectl exec zk-1 zkCli.sh get /hello
  7. [1] 148438
  8. Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  9. pod "zk-2" force deleted
  10. [1]+ Done kubectl delete --force=true --grace-period=0 pod zk-2
  11. [1] 148686
  12. Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  13. pod "zk-2" force deleted
  14. [1]+ Done kubectl delete --force=true --grace-period=0 pod zk-2
  15. kubectl exec [POD][COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD]--[COMMAND] instead.
  16. Connecting to localhost:2181
  17. 2024-02-06 08:45:21,133 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  18. 2024-02-06 08:45:21,135 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-0.zk-hs.default.svc.cluster.local
  19. 2024-02-06 08:45:21,135 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  20. 2024-02-06 08:45:21,137 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  21. 2024-02-06 08:45:21,137 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  22. 2024-02-06 08:45:21,137 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  23. 2024-02-06 08:45:21,137 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  24. 2024-02-06 08:45:21,138 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  25. 2024-02-06 08:45:21,138 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  26. 2024-02-06 08:45:21,138 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  27. 2024-02-06 08:45:21,140 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  28. 2024-02-06 08:45:21,140 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  29. 2024-02-06 08:45:21,140 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  30. 2024-02-06 08:45:21,140 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  31. 2024-02-06 08:45:21,140 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  32. 2024-02-06 08:45:21,141 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  33. 2024-02-06 08:45:21,157 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  34. 2024-02-06 08:45:21,201 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  35. 2024-02-06 08:45:21,206 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x18d7d581b330003, negotiated timeout = 30000
  36. WATCHER::
  37. WatchedEvent state:SyncConnected type:None path:null
  38. cZxid = 0x100000002
  39. ctime = Tue Feb 06 08:35:34 UTC 2024
  40. mZxid = 0x100000017
  41. mtime = Tue Feb 06 08:45:21 UTC 2024
  42. pZxid = 0x100000002
  43. cversion = 0
  44. dataVersion = 1
  45. aclVersion = 0
  46. ephemeralOwner = 0x0
  47. dataLength = 17
  48. numChildren = 0
  49. kubectl exec [POD][COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD]--[COMMAND] instead.
  50. Connecting to localhost:2181
  51. 2024-02-06 08:45:22,821 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  52. 2024-02-06 08:45:22,824 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-1.zk-hs.default.svc.cluster.local
  53. 2024-02-06 08:45:22,824 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  54. 2024-02-06 08:45:22,827 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  55. 2024-02-06 08:45:22,827 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  56. 2024-02-06 08:45:22,827 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  57. 2024-02-06 08:45:22,827 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  58. 2024-02-06 08:45:22,827 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  59. 2024-02-06 08:45:22,827 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  60. 2024-02-06 08:45:22,828 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  61. 2024-02-06 08:45:22,828 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  62. 2024-02-06 08:45:22,828 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  63. 2024-02-06 08:45:22,828 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  64. 2024-02-06 08:45:22,828 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  65. 2024-02-06 08:45:22,828 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  66. 2024-02-06 08:45:22,830 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  67. 2024-02-06 08:45:22,845 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  68. 2024-02-06 08:45:22,897 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  69. 2024-02-06 08:45:22,905 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x28d7d581b360005, negotiated timeout = 30000
  70. WATCHER::
  71. WatchedEvent state:SyncConnected type:None path:null
  72. cZxid = 0x100000002
  73. world_should_work
  74. ctime = Tue Feb 06 08:35:34 UTC 2024
  75. mZxid = 0x100000017
  76. mtime = Tue Feb 06 08:45:21 UTC 2024
  77. pZxid = 0x100000002
  78. cversion = 0
  79. dataVersion = 1
  80. aclVersion = 0
  81. ephemeralOwner = 0x0
  82. dataLength = 17
  83. numChildren = 0

验证:

  1. $ for i in 0 1 2;do kubectl exec zk-$i-- zkCli.sh get /hello | grep world; done
  2. cZxid = 0x100000002
  3. world_should_work
  4. ctime = Tue Feb 06 08:35:34 UTC 2024
  5. mZxid = 0x100000017
  6. mtime = Tue Feb 06 08:45:21 UTC 2024
  7. pZxid = 0x100000002
  8. cversion = 0
  9. dataVersion = 1
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 17
  13. numChildren = 0
  14. cZxid = 0x100000002
  15. world_should_work
  16. ctime = Tue Feb 06 08:35:34 UTC 2024
  17. mZxid = 0x100000017
  18. mtime = Tue Feb 06 08:45:21 UTC 2024
  19. pZxid = 0x100000002
  20. cversion = 0
  21. dataVersion = 1
  22. aclVersion = 0
  23. ephemeralOwner = 0x0
  24. dataLength = 17
  25. numChildren = 0
  26. cZxid = 0x100000002
  27. world_should_work
  28. ctime = Tue Feb 06 08:35:34 UTC 2024
  29. mZxid = 0x100000017
  30. mtime = Tue Feb 06 08:45:21 UTC 2024
  31. pZxid = 0x100000002
  32. cversion = 0
  33. dataVersion = 1
  34. aclVersion = 0
  35. ephemeralOwner = 0x0
  36. dataLength = 17
  37. numChildren = 0

写入操作还能工作,是因为ZooKeeper ensemble的quorum(法定人数),如果删除两个服务器,就没有quorum了。

  1. $ kubectl delete --force=true --grace-period=0 pod zk-2 &
  2. kubectl delete --force=true --grace-period=0 pod zk-1 &
  3. sleep 1; kubectl delete --force=true --grace-period=0 pod zk-2 &
  4. sleep 1; kubectl delete --force=true --grace-period=0 pod zk-1 &
  5. sleep 1
  6. kubectl exec zk-0 zkCli.sh set/hello world_should_not_work
  7. sleep 1
  8. kubectl exec zk-0 zkCli.sh get /hello
  9. sleep 20 # If you are running manually use kubectl get pods to see status of pods restarting
  10. kubectl exec zk-0 zkCli.sh get /hello
  11. [1] 159326
  12. [2] 159327
  13. Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  14. Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  15. pod "zk-2" force deleted
  16. pod "zk-1" force deleted
  17. [1]- Done kubectl delete --force=true --grace-period=0 pod zk-2
  18. [2]+ Done kubectl delete --force=true --grace-period=0 pod zk-1
  19. [1] 159519
  20. Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  21. Error from server (NotFound): pods "zk-2" not found
  22. [1]+Exit 1 kubectl delete --force=true --grace-period=0 pod zk-2
  23. [1] 159526
  24. Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
  25. pod "zk-1" force deleted
  26. [1]+ Done kubectl delete --force=true --grace-period=0 pod zk-1
  27. kubectl exec [POD][COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD]--[COMMAND] instead.
  28. Connecting to localhost:2181
  29. 2024-02-06 08:51:54,920 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  30. 2024-02-06 08:51:54,923 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-0.zk-hs.default.svc.cluster.local
  31. 2024-02-06 08:51:54,923 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  32. 2024-02-06 08:51:54,925 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  33. 2024-02-06 08:51:54,925 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  34. 2024-02-06 08:51:54,925 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  35. 2024-02-06 08:51:54,925 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  36. 2024-02-06 08:51:54,925 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  37. 2024-02-06 08:51:54,925 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  38. 2024-02-06 08:51:54,926 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  39. 2024-02-06 08:51:54,926 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  40. 2024-02-06 08:51:54,926 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  41. 2024-02-06 08:51:54,926 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  42. 2024-02-06 08:51:54,926 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  43. 2024-02-06 08:51:54,926 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  44. 2024-02-06 08:51:54,929 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  45. 2024-02-06 08:51:54,949 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  46. 2024-02-06 08:51:55,025 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  47. 2024-02-06 08:51:55,036 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x18d7d581b330005, negotiated timeout = 30000
  48. WATCHER::
  49. WatchedEvent state:SyncConnected type:None path:null
  50. cZxid = 0x100000002
  51. ctime = Tue Feb 06 08:35:34 UTC 2024
  52. mZxid = 0x100000022
  53. mtime = Tue Feb 06 08:51:55 UTC 2024
  54. pZxid = 0x100000002
  55. cversion = 0
  56. dataVersion = 2
  57. aclVersion = 0
  58. ephemeralOwner = 0x0
  59. dataLength = 21
  60. numChildren = 0
  61. kubectl exec [POD][COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD]--[COMMAND] instead.
  62. Connecting to localhost:2181
  63. 2024-02-06 08:51:56,664 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  64. 2024-02-06 08:51:56,666 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-0.zk-hs.default.svc.cluster.local
  65. 2024-02-06 08:51:56,666 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  66. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  67. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  68. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  69. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  70. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  71. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  72. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  73. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  74. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  75. 2024-02-06 08:51:56,668 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  76. 2024-02-06 08:51:56,669 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  77. 2024-02-06 08:51:56,669 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  78. 2024-02-06 08:51:56,670 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  79. 2024-02-06 08:51:56,690 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  80. 2024-02-06 08:51:56,748 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  81. 2024-02-06 08:51:56,755 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x18d7d581b330006, negotiated timeout = 30000
  82. WATCHER::
  83. WatchedEvent state:SyncConnected type:None path:null
  84. world_should_not_work
  85. cZxid = 0x100000002
  86. ctime = Tue Feb 06 08:35:34 UTC 2024
  87. mZxid = 0x100000022
  88. mtime = Tue Feb 06 08:51:55 UTC 2024
  89. pZxid = 0x100000002
  90. cversion = 0
  91. dataVersion = 2
  92. aclVersion = 0
  93. ephemeralOwner = 0x0
  94. dataLength = 21
  95. numChildren = 0
  96. kubectl exec [POD][COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD]--[COMMAND] instead.
  97. Connecting to localhost:2181
  98. 2024-02-06 08:52:17,354 [myid:]- INFO [main:Environment@100]- Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  99. 2024-02-06 08:52:17,355 [myid:]- INFO [main:Environment@100]- Client environment:host.name=zk-0.zk-hs.default.svc.cluster.local
  100. 2024-02-06 08:52:17,356 [myid:]- INFO [main:Environment@100]- Client environment:java.version=1.8.0_131
  101. 2024-02-06 08:52:17,357 [myid:]- INFO [main:Environment@100]- Client environment:java.vendor=Oracle Corporation
  102. 2024-02-06 08:52:17,357 [myid:]- INFO [main:Environment@100]- Client environment:java.home=/usr/lib/jvm/java-8-openjdk-amd64/jre
  103. 2024-02-06 08:52:17,357 [myid:]- INFO [main:Environment@100]- Client environment:java.class.path=/usr/bin/../build/classes:/usr/bin/../build/lib/*.jar:/usr/bin/../share/zookeeper/zookeeper-3.4.10.jar:/usr/bin/../share/zookeeper/slf4j-log4j12-1.6.1.jar:/usr/bin/../share/zookeeper/slf4j-api-1.6.1.jar:/usr/bin/../share/zookeeper/netty-3.10.5.Final.jar:/usr/bin/../share/zookeeper/log4j-1.2.16.jar:/usr/bin/../share/zookeeper/jline-0.9.94.jar:/usr/bin/../src/java/lib/*.jar:/usr/bin/../etc/zookeeper:
  104. 2024-02-06 08:52:17,357 [myid:]- INFO [main:Environment@100]- Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
  105. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:java.io.tmpdir=/tmp
  106. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:java.compiler=<NA>
  107. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:os.name=Linux
  108. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:os.arch=amd64
  109. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:os.version=5.14.0-362.18.1.el9_3.x86_64
  110. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:user.name=zookeeper
  111. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:user.home=/home/zookeeper
  112. 2024-02-06 08:52:17,358 [myid:]- INFO [main:Environment@100]- Client environment:user.dir=/
  113. 2024-02-06 08:52:17,359 [myid:]- INFO [main:ZooKeeper@438]- Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@22d8cfe0
  114. 2024-02-06 08:52:17,374 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032]- Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
  115. 2024-02-06 08:52:17,436 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876]- Socket connection established to localhost/127.0.0.1:2181, initiating session
  116. 2024-02-06 08:52:17,444 [myid:]- INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299]- Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x18d7d581b330007, negotiated timeout = 30000
  117. WATCHER::
  118. WatchedEvent state:SyncConnected type:None path:null
  119. cZxid = 0x100000002
  120. world_should_not_work
  121. ctime = Tue Feb 06 08:35:34 UTC 2024
  122. mZxid = 0x100000022
  123. mtime = Tue Feb 06 08:51:55 UTC 2024
  124. pZxid = 0x100000002
  125. cversion = 0
  126. dataVersion = 2
  127. aclVersion = 0
  128. ephemeralOwner = 0x0
  129. dataLength = 21
  130. numChildren = 0

可见,还是写入了。我测试了几次,都是这样。难道是因为pod恢复的太快了?

持久化存储

删除StatefulSet:

  1. kubectl delete statefulset zk

验证:

  1. $ kubectl get pod
  2. No resources found in default namespace.

重建StatefulSet:

  1. $ kubectl apply -f zookeeper2.yaml
  2. service/zk-hs unchanged
  3. service/zk-cs unchanged
  4. poddisruptionbudget.policy/zk-pdb configured
  5. statefulset.apps/zk created
  1. $ kubectl exec zk-0 -- zkCli.sh get /hello
  2. ......
  3. WATCHER::
  4. WatchedEvent state:SyncConnected type:None path:null
  5. ccccc
  6. ......

注:

  1. ccccc

是最近一次写入的数据。

可见,重建StatefulSet和其pod之后,原来的数据还在。

当ZooKeeper的StatefulSet的pod被重新调度或者升级时,会将PV mount到ZooKeeper服务器的数据目录。持久化数据仍然保存在那里。对于Cassandra或者Consul或者etcd或其它任何数据库也都一样。

参考

  • https://github.com/cloudurable/kube-zookeeper-statefulsets/wiki/Tutorial-Part-1:--Managing-Kubernetes-StatefulSets-using-ZooKeeper-and-Minikube
  • https://kubernetes.io/docs/tutorials/stateful-application/zookeeper

本文转载自: https://blog.csdn.net/duke_ding2/article/details/136057094
版权归原作者 蓝黑2020 所有, 如有侵权,请联系我们删除。

“Kubernetes的有状态应用示例:ZooKeeper”的评论:

还没有评论