0


k8s学习--k8s群集部署zookeeper应用及详细解释

文章目录


zookeeper

什么是zookeeper

ZooKeeper 是一个开源的分布式协调服务,主要用于分布式应用程序中,管理数据、同步服务以及维护配置信息。它是由 Apache Software Foundation 管理和维护的。

基本概念

ZNode: ZooKeeper 的数据存储单元,类似于文件系统中的文件和目录。ZNode 可以存储数据和子节点。

Zookeeper Ensemble: 一个 ZooKeeper 服务通常由多个 ZooKeeper 服务器(节点)组成,称为一个 ensemble。通常会有一个主节点(Leader)和若干个跟随节点(Follower)。

Session: 客户端与 ZooKeeper 服务器之间的会话。每个客户端会话都有一个唯一的会话 ID。

主要功能

命名服务(Naming Service): 类似于 DNS,允许分布式应用程序使用路径来访问资源和服务。

配置管理(Configuration Management): 存储和更新配置信息,使得分布式应用程序的各个部分能够同步读取最新的配置。

分布式同步(Distributed Synchronization): 支持分布式锁和队列,帮助多个进程协调对共享资源的访问。

组服务(Group Services): 用于维护分布式系统中群组成员的列表,监控集群中节点的状态。

工作原理

ZooKeeper 采用了一个简单的、基于全局数据一致性的模型:

Leader Election: 当 ZooKeeper 集群启动时,节点之间通过投票选举出一个 Leader。Leader 负责处理所有写请求,而读请求可以由任何节点处理。

Watches: 客户端可以在 ZNode 上设置 watch,当 ZNode 的数据或子节点变化时,ZooKeeper 会通知客户端。

Atomic Broadcast (Zab): ZooKeeper 使用一种叫做 Zab 协议的原子广播协议,确保所有服务器上的数据一致性。所有的写操作都会被记录为事务日志,并通过 Zab 协议广播给其他节点。

使用场景

分布式锁: 使用临时 ZNode 实现分布式锁,确保多个进程不会同时访问共享资源。

集群管理: 在分布式系统中,使用 ZooKeeper 监控集群中的节点,处理节点的动态增加和减少。

配置管理: 存储和分发分布式应用程序的配置参数,确保所有节点使用相同的配置。

命名服务: 管理分布式系统中服务的命名和查找。

优点

高可用性: ZooKeeper 采用分布式架构,保证了高可用性和容错能力。

高性能: ZooKeeper 的读性能非常高,适合高读负载的场景。

一致性: 提供严格的数据一致性,确保分布式系统中各个节点的数据一致。

缺点

单点瓶颈: Leader 处理所有写请求,可能成为性能瓶颈。

复杂性: 部署和管理 ZooKeeper 集群需要一定的技术门槛。

k8s集群部署zookeeper

环境

虚拟机
Ip主机名cpu内存硬盘192.168.10.11master012cpu双核4G100G192.168.10.12worker012cpu双核4G100G192.168.10.13worker022cpu双核4G100G192.168.10.18nfs1cpu一核2G40G
版本 centos7.9
已部署k8s-1.27

需要做的前置配置
storageclass
详情请看
链接: k8s练习–StorageClass详细解释与应用
区别仅有ip不一致,按本次ip来

Ingress(本章使用nodeport方式访问)
详情请看
链接: k8s学习–ingress详细解释与应用(nginx ingress controller))

本章不再过多叙述

一、zookeeper部署YAML资源清单准备

master节点配置

  1. vim zookeeper.yaml
  1. ---
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: smart
  6. ---
  7. apiVersion: v1
  8. kind: Service
  9. metadata:
  10. name: zk-headless
  11. namespace: smart
  12. labels:
  13. app: zk
  14. spec:
  15. ports:
  16. - port: 2888
  17. name: server
  18. - port: 3888
  19. name: leader-election
  20. clusterIP: None #无头服务集群内访问
  21. selector:
  22. app: zk
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27. name: zk-np
  28. namespace: smart
  29. labels:
  30. app: zk
  31. spec:
  32. type: NodePort #对外发布访问
  33. ports:
  34. - port: 2181
  35. targetPort: 2181
  36. name: client
  37. nodePort: 32181
  38. selector:
  39. app: zk
  40. ---
  41. apiVersion: policy/v1
  42. kind: PodDisruptionBudget
  43. metadata:
  44. name: zk-pdb
  45. namespace: smart
  46. spec:
  47. selector:
  48. matchLabels:
  49. app: zk
  50. maxUnavailable: 1 #允许失效pod的数量
  51. ---
  52. apiVersion: apps/v1
  53. kind: StatefulSet
  54. metadata:
  55. name: zookeeper
  56. namespace: smart
  57. spec:
  58. serviceName: zk-headless
  59. replicas: 3
  60. updateStrategy:
  61. type: RollingUpdate
  62. selector:
  63. matchLabels:
  64. app: zk
  65. template:
  66. metadata:
  67. labels:
  68. app: zk
  69. spec:
  70. affinity: #pod粘滞
  71. podAntiAffinity:
  72. requiredDuringSchedulingIgnoredDuringExecution:
  73. - labelSelector:
  74. matchExpressions:
  75. - key: "app"
  76. operator: In
  77. values:
  78. - zk
  79. topologyKey: "kubernetes.io/hostname"
  80. containers:
  81. - name: kubernetes-zookeeper
  82. image: k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10
  83. imagePullPolicy: Always
  84. resources:
  85. requests:
  86. memory: "1Gi"
  87. cpu: "0.5"
  88. ports:
  89. - containerPort: 2181
  90. name: client
  91. - containerPort: 2888
  92. name: server
  93. - containerPort: 3888
  94. name: leader-election
  95. command:
  96. - sh
  97. - -c
  98. - "start-zookeeper \
  99. --servers=3 \
  100. --data_dir=/var/lib/zookeeper/data \
  101. --data_log_dir=/var/lib/zookeeper/data/log \
  102. --conf_dir=/opt/zookeeper/conf \
  103. --client_port=2181 \
  104. --election_port=3888 \
  105. --server_port=2888 \
  106. --tick_time=2000 \
  107. --init_limit=10 \
  108. --sync_limit=5 \
  109. --heap=512M \
  110. --max_client_cnxns=60 \
  111. --snap_retain_count=3 \
  112. --purge_interval=12 \
  113. --max_session_timeout=40000 \
  114. --min_session_timeout=4000 \
  115. --log_level=INFO"
  116. readinessProbe:
  117. exec:
  118. command:
  119. - sh
  120. - -c
  121. - "zookeeper-ready 2181"
  122. initialDelaySeconds: 10
  123. timeoutSeconds: 5
  124. livenessProbe:
  125. exec:
  126. command:
  127. - sh
  128. - -c
  129. - "zookeeper-ready 2181"
  130. initialDelaySeconds: 10
  131. timeoutSeconds: 5
  132. volumeMounts:
  133. - name: datadir
  134. mountPath: /var/lib/zookeeper
  135. - name: localtime
  136. mountPath: /etc/localtime
  137. volumes:
  138. - name: localtime
  139. hostPath:
  140. path: /etc/localtime #pod时间同步于宿主机时间
  141. type: ''
  142. volumeClaimTemplates:
  143. - metadata:
  144. name: datadir
  145. annotations:
  146. volume.alpha.kubernetes.io/storage-class: anything
  147. spec:
  148. accessModes: [ "ReadWriteOnce" ]
  149. storageClassName: "nfs-client"
  150. resources:
  151. requests:
  152. storage: 1Gi

用于创建一个zookeeper群集
简单来说就是创建一个命令空间存放相关资源,两个service一个对内一个对外发布服务,还有一个statefulset控制器创建pod,特点是在每个节点至少部署一个,适用于有状态服务,比如说数据库之类

二、zookeeper部署及部署验证

应用yaml文件

  1. kubectl apply -f zookeeper.yaml

Zookeeper运行pod数量一般为奇数,每节点上会运行一个pod,k8sworker节点如果不够,可能会出现如下现象

  1. kubectl get pod -n smart -o wide

在这里插入图片描述
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。
如果希望将k8s-master也当作Node使用,可以执行如下命令:
查看master01调度控制(Taints污点设置,NoSchedule不被调度)

  1. kubectl describe node master01 | grep Taints

可以看到是noscheduler
禁止调用
在这里插入图片描述

取消污点设置:

  1. kubectl taint node master01 node-role.kubernetes.io/control-plane-

在这里插入图片描述
再查看就好了

  1. kubectl get pod -n smart -o wide

在这里插入图片描述


如果发现pod只有一个且一直pending,那就是storageclass没有做好,nfs的pod没有或无法起来,pv无法调度存储设备的资源,请详细查看
链接: k8s练习–StorageClass详细解释与应用

查看statefulset应用\

  1. kubectl get sts -n smart

在这里插入图片描述

查看service

  1. kubectl get svc -n smart

在这里插入图片描述
如果想取消被调度,执行如下命令即可,不会影响已经被调度的pod

  1. kubectl taint node master01 node-role.kubernetes.io/control-plane:NoSchedule

三、zookeeper应用验证

zookeeper访问连接信息验证

  1. dig -t a zk-headless.smart.svc.cluster.local @10.96.0.10
  2. dig -t a zk-np.smart.svc.cluster.local @10.96.0.10```

在这里插入图片描述
在这里插入图片描述

在kubernetes集群内访问验证

  1. kubectl exec -it zookeeper-0 -n smart -- bash
  2. root@zookeeper-0:/# zkCli.sh
  3. [zk: localhost:2181(CONNECTED) 0] create /key1 111
  4. [zk: localhost:2181(CONNECTED) 1] get /key1
  5. [zk: localhost:2181(CONNECTED) 2] quit
  6. root@zookeeper-0:/# exit

在这里插入图片描述
在kubernetes集群外访问验证:
下载客户端软件

  1. wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

会提示,由于是虚拟机环境且只是查看能不能用,所以使用不安全的方式链接也无伤大雅
在这里插入图片描述

  1. wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz --no-check-certificate
  2. tar xf apache-zookeeper-3.8.4-bin.tar.gz
  3. cd apache-zookeeper-3.8.4-bin/
  4. cd bin/
  5. ./zkCli.sh -server 192.168.10.11:32181

出现以下提示说明需要jdk包
在这里插入图片描述

安装jdk
呃呃呃,路径忘了,但包名是
jdk-8u191-linux-x64.tar.gz
可以自己试着找找,我上传的时候显示资源已存在,可以找一找
传到虚拟机内

  1. tar xf jdk-8u191-linux-x64.tar.gz
  2. mv jdk1.8.0_191/ /usr/local/jdk
  3. echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile
  4. source /etc/profile
  5. cd /root/apache-zookeeper-3.8.4-bin/bin
  6. ./zkCli.sh -server 192.168.10.11:32181
  1. [zk: 192.168.10.11:32181(CONNECTED) 2] create /key2 123
  2. [zk: 192.168.10.11:32181(CONNECTED) 3] get /key2
  3. [zk: 192.168.10.11:32181(CONNECTED) 4] quit

在这里插入图片描述
完成


本文转载自: https://blog.csdn.net/lwxvgdv/article/details/140016404
版权归原作者 爱吃龙利鱼 所有, 如有侵权,请联系我们删除。

“k8s学习--k8s群集部署zookeeper应用及详细解释”的评论:

还没有评论