文章目录
- zookeeper
- 什么是zookeeper
- 基本概念
- 主要功能
- 工作原理
- 使用场景
- 优点
- 缺点
- k8s集群部署zookeeper
- 环境
- 一、zookeeper部署YAML资源清单准备
- 二、zookeeper部署及部署验证
- 三、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.11 | master01 | 2cpu双核 | 4G | 100G |
192.168.10.12 | worker01 | 2cpu双核 | 4G | 100G |
192.168.10.13 | worker02 | 2cpu双核 | 4G | 100G |
192.168.10.18 | nfs | 1cpu一核 | 2G | 40G |
版本 centos7.9
已部署k8s-1.27
需要做的前置配置
storageclass
详情请看
链接: k8s练习–StorageClass详细解释与应用
区别仅有ip不一致,按本次ip来
Ingress(本章使用nodeport方式访问)
详情请看
链接: k8s学习–ingress详细解释与应用(nginx ingress controller))
本章不再过多叙述
一、zookeeper部署YAML资源清单准备
master节点配置
vim zookeeper.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: smart
---
apiVersion: v1
kind: Service
metadata:
name: zk-headless
namespace: smart
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-np
namespace: smart
labels:
app: zk
spec:
type: NodePort #对外发布访问
ports:
- port: 2181
targetPort: 2181
name: client
nodePort: 32181
selector:
app: zk
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
namespace: smart
spec:
selector:
matchLabels:
app: zk
maxUnavailable: 1 #允许失效pod的数量
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zookeeper
namespace: smart
spec:
serviceName: zk-headless
replicas: 3
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: zk
template:
metadata:
labels:
app: zk
spec:
affinity: #pod粘滞
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zk
topologyKey: "kubernetes.io/hostname"
containers:
- name: kubernetes-zookeeper
image: k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10
imagePullPolicy: Always
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
- name: localtime
mountPath: /etc/localtime
volumes:
- name: localtime
hostPath:
path: /etc/localtime #pod时间同步于宿主机时间
type: ''
volumeClaimTemplates:
- metadata:
name: datadir
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client"
resources:
requests:
storage: 1Gi
用于创建一个zookeeper群集
简单来说就是创建一个命令空间存放相关资源,两个service一个对内一个对外发布服务,还有一个statefulset控制器创建pod,特点是在每个节点至少部署一个,适用于有状态服务,比如说数据库之类
二、zookeeper部署及部署验证
应用yaml文件
kubectl apply -f zookeeper.yaml
Zookeeper运行pod数量一般为奇数,每节点上会运行一个pod,k8sworker节点如果不够,可能会出现如下现象
kubectl get pod -n smart -o wide
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。
如果希望将k8s-master也当作Node使用,可以执行如下命令:
查看master01调度控制(Taints污点设置,NoSchedule不被调度)
kubectl describe node master01 | grep Taints
可以看到是noscheduler
禁止调用
取消污点设置:
kubectl taint node master01 node-role.kubernetes.io/control-plane-
再查看就好了
kubectl get pod -n smart -o wide
注
如果发现pod只有一个且一直pending,那就是storageclass没有做好,nfs的pod没有或无法起来,pv无法调度存储设备的资源,请详细查看
链接: k8s练习–StorageClass详细解释与应用
查看statefulset应用\
kubectl get sts -n smart
查看service
kubectl get svc -n smart
如果想取消被调度,执行如下命令即可,不会影响已经被调度的pod
kubectl taint node master01 node-role.kubernetes.io/control-plane:NoSchedule
三、zookeeper应用验证
zookeeper访问连接信息验证
dig -t a zk-headless.smart.svc.cluster.local @10.96.0.10
dig -t a zk-np.smart.svc.cluster.local @10.96.0.10```
在kubernetes集群内访问验证
kubectl exec -it zookeeper-0 -n smart -- bash
root@zookeeper-0:/# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] create /key1 111
[zk: localhost:2181(CONNECTED) 1] get /key1
[zk: localhost:2181(CONNECTED) 2] quit
root@zookeeper-0:/# exit
在kubernetes集群外访问验证:
下载客户端软件
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
会提示,由于是虚拟机环境且只是查看能不能用,所以使用不安全的方式链接也无伤大雅
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz --no-check-certificate
tar xf apache-zookeeper-3.8.4-bin.tar.gz
cd apache-zookeeper-3.8.4-bin/
cd bin/
./zkCli.sh -server 192.168.10.11:32181
出现以下提示说明需要jdk包
安装jdk
呃呃呃,路径忘了,但包名是
jdk-8u191-linux-x64.tar.gz
可以自己试着找找,我上传的时候显示资源已存在,可以找一找
传到虚拟机内
tar xf jdk-8u191-linux-x64.tar.gz
mv jdk1.8.0_191/ /usr/local/jdk
echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile
source /etc/profile
cd /root/apache-zookeeper-3.8.4-bin/bin
./zkCli.sh -server 192.168.10.11:32181
[zk: 192.168.10.11:32181(CONNECTED) 2] create /key2 123
[zk: 192.168.10.11:32181(CONNECTED) 3] get /key2
[zk: 192.168.10.11:32181(CONNECTED) 4] quit
完成