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

发布于:2024-07-04 ⋅ 阅读:(19) ⋅ 点赞:(0)


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

在这里插入图片描述
完成