基于 Kubernetes 部署 Zookeeper(StatefulSet方式)

这篇具有很好参考价值的文章主要介绍了基于 Kubernetes 部署 Zookeeper(StatefulSet方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

随着云原生化流行的大趋势,我们的基础组件也需要逐渐上Kubernetes了。Apache Zookeeper作为目前最流行的分布式协调组件,在我们的微服务架构中负责扮演注册中心的角色。

在Kubernetes中运行Zookeeper集群是很有意义的,可以利用其原生的弹性扩缩容、高可用特性。

先说下使用的k8s的版本是1.25.0,对于PodDisruptionBudget的apiVersion会有影响,某些更老的k8s版本,apiVersion是policy/v1bata,1.25.0的k8s对应的apiVersion是policy/v1。

使用StatefulSet部署Zookeeper

官方提供了使用statefulSet的方式来部署 Zookeeper 运行 Zookeeper,它会创建一个headless service,一个cluster service,一个podDisruptionBudget,一个statefulSet。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: zk-pv
spec:
  capacity:
    storage: 512Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data
---
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
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  selector:
    matchLabels:
      app: zk
  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:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: kubernetes-zookeeper
        imagePullPolicy: IfNotPresent
        image: "harbor.martin.cc/google_containers/kubernetes-zookeeper:1.0-3.4.10"
        resources:
          requests:
            memory: "0.5Gi"
            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: 512Mi

使用 kubectl apply应用这个配置文件,等待一会之后,发现pod和service都已创建成功。

kubectl get pod 查看到 zk-0 pod一直pending.

kubectl describe pod zk-0 看到事件原因是:

0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.

再使用:

kubectl logs -n kube-system kube-controller-manager-k8s-master01.example.local

查看controller-manager的pod日志:

I0513 08:13:08.710572       1 event.go:294] "Event occurred" object="default/datadir-zk-0" fieldPath="" kind="PersistentVolumeClaim" apiVersion="v1" type="Normal" reason="FailedBinding" message="no persistent volumes available for this claim and no storage class is set"

这么看,原来PV和 storage class 都没搞。这个网上的参考还是需要自己补充一下的,PV的API定义已经加到上面的资源清单了。

PV弄了个HostPath的。但是也不知道存在哪个节点上。

然后再执行kubectl apply -f zookeeper.yml创建,POD zk-0未启动成功,出来错误CrashLoopBackOff。通过kubectl logs zk-0查看POD日志:

#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.cluster.local:2888:3888
server.2=zk-1.zk-hs.default.svc.cluster.local:2888:3888
server.3=zk-2.zk-hs.default.svc.cluster.local:2888:3888
Creating ZooKeeper log4j configuration
mkdir: cannot create directory '/var/lib/zookeeper/data': Permission denied
chown: cannot access '/var/lib/zookeeper/data': No such file or directory
mkdir: cannot create directory '/var/lib/zookeeper/data': Permission denied
chown: invalid group: 'zookeeper:USER'
/usr/bin/start-zookeeper: line 176: /var/lib/zookeeper/data/myid: No such file or directory

有个疑问,这个日志是一直存着吗,还是POD没启动成功,我用kubectl delete -f zookeeper删除掉POD,再看下,还有没有这个日志。肯定没了:

kubectl logs zk-0
Error from server (NotFound): pods "zk-0" not found

原来是POD及容器对于卷的目录主机目录没有写与创建子目录的权限。把对应的目录POD部署节点的目录 /data/,权限修改成全部可以读写创建:

chmod 777 /data/

重启后,还是有问题:

发现pod zk-0启动成功了,但是到了zk-1启动失败,原来是每个pod要创建一个hostPath的PV。接下来创建两个zk-pv1,zk-pv2,在node2和node3上创建好对应的host文件夹/data/,并设置权限777。然后重启,三个pod都启动成功了。

恭喜自己,部署看起来是成功了,那么就真正测试一下部署好的zk集群吧。

要测试在 Kubernetes 上部署的 ZooKeeper 集群,可以执行以下步骤:

  1. 获取 ZooKeeper 的客户端工具,例如 ZooKeeper 命令行客户端 zkCli.sh。可以在 ZooKeeper 的官方网站下载安装包,并解压获取相关工具。

  2. 进入 Kubernetes 集群中的任意一个 Pod,可以使用 kubectl exec 命令进入 Pod 的容器内部。

    kubectl exec -it <pod-name> -- /bin/bash
  3. 在容器内部,使用 ZooKeeper 客户端工具连接到 ZooKeeper 集群。根据您的部署方式和服务发现配置,可以使用 Service 名称或 Pod IP 连接到 ZooKeeper。

    ./zkCli.sh -server <zk-service-name>:<zk-service-port>

    或者

    ./zkCli.sh -server <zk-pod-ip>:<zk-service-port>

    这里的 <zk-service-name> 是您 ZooKeeper 服务的名称,<zk-service-port> 是服务的端口号。如果您使用的是 StatefulSet 部署方式,可以使用 zk-{index}.<statefulset-name> 的方式连接到每个 ZooKeeper Pod。

  4. 连接成功后,您可以执行各种 ZooKeeper 的命令和操作,例如创建节点、设置数据、监听事件等。可以通过命令 help? 获取更多可用的命令列表和用法。

    [zk: <zk-service-name>:<zk-service-port>] help
    [zk: <zk-service-name>:<zk-service-port>] ?

    例如,可以使用以下命令创建一个节点并设置数据:

    [zk: <zk-service-name>:<zk-service-port>] create /test mydata

    然后使用以下命令获取节点的数据:

    [zk: <zk-service-name>:<zk-service-port>] get /test

    通过执行各种命令和操作,可以验证 ZooKeeper 集群的功能和可用性。

请注意,上述命令中的 <zk-service-name><zk-service-port> 需要替换为实际的 ZooKeeper 服务名称和端口。具体的连接信息取决于您的部署方式和配置。

都是验证通过的,说明安装成功了,Oh Yeah!

附:安装的容器镜像描述信息:

The ZooKeeper package is installed into the /opt/zookeeper directory, all configuration is sym linked into the /usr/etc/zookeeper/, and all executables are sym linked into /usr/bin. The ZooKeeper data directories are contained in /var/lib/zookeeper. This is identical to the RPM distribution that users should be familiar with.

所以 /var/lib/zookeeper这个文件夹是放数据的,所以我们就明白为什么要把这个文件夹放到PV了。文章来源地址https://www.toymoban.com/news/detail-478455.html

到了这里,关于基于 Kubernetes 部署 Zookeeper(StatefulSet方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何调整 Kubernetes StatefulSet 卷的大小

    Kubernetes StatefulSet用于在集群内部署有状态应用程序。StatefulSet 中的每个 Pod 都可以访问即使在重新调度后仍坚持使用的本地持久卷。这使得 Pod 能够维护与其集合中的邻居不同的单独状态。 不幸的是,这些卷有一个很大的限制:Kubernetes 没有提供从 StatefulSet 对象调整它们大小

    2024年02月07日
    浏览(74)
  • 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset

    该篇文章已经被专栏《从零开始学k8s》收录 上一篇文章:kubernetes持久化存储下 点击跳转 StatefulSet 是为了管理有状态服务的问题而设计的 对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续

    2024年02月03日
    浏览(33)
  • 【探索 Kubernetes|作业管理篇 系列 13】StatefulSet 拓扑状态

    大家好,我是秋意零。 在上一篇中,我们讲解了 Deployment 这种无状态的控制器;而如果要部署有状态的应用,那么 Deployment 显然是达不到我们的需求的。 今天讲解的是 StatefulSet 有状态控制器。 最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬多多支持! 获取

    2024年02月11日
    浏览(46)
  • 【探索 Kubernetes|作业管理篇 系列 14】StatefulSet 存储状态

    大家好,我是秋意零。 在上一篇中,我们讲解了 StatefulSet 的拓扑状态;我们发现,它的拓扑状态,就是顺序启动/删除、Pod 名称+编号命名、将 Pod 名称设为 Hostname 名称、通过 Service 无头服务的 DNS 记录访问。 今天,就来看看 StatefulSet 的存储状态。 最近搞了一个扣扣群,旨在

    2024年02月11日
    浏览(44)
  • 【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

    官方中文参考文档 1、StatefulSet Pod控制器特性 StatefulSet(简写sts)也是K8S集群中的一种Pod资源管理器,与deployment Pod控制器不同的是,StatefulSet用于管理无状态程序,特性如下: 稳定的网络标识符:管理的Pod都拥有一个稳定的网络标识符。可以通过网络标识符进行访问。 有序部署

    2024年02月13日
    浏览(36)
  • 【K8S】Kubernetes 中有状态的资源对象——StatefulSet

    现在基本上很多服务中的应用都是有状态的,比如MySQL数据库、Redis等,因为其中的数据在不断地变化,所以这些应用每个时刻都处于一个不同的状态。或者一个系统中存在多个不同的应用,这些应用存在一定的依赖关系。例如一个博客服务,该服务中包含了Redis缓存和MySQL数

    2024年02月04日
    浏览(48)
  • Helm方式部署 zookeeper+kafka 集群 ——2023.05

    服务 版本 centos 7.9 kubernetes v1.20.15 helm v3.10.1 zookeeper 3.8.1 kafka 3.4.0 安装方式有两种,在线安装和离线安装,在线安装方便快捷,但是无法修改参数。由于需要修改配置,故本文采用离线安装方式。 2.1 在线安装zookeeper+kafka集群 1. 部署zookeeper集群 提示: 由于这个ApacheZookeeper集群

    2024年02月09日
    浏览(50)
  • (六)Kubernetes - 手动部署(二进制方式安装)

    可参考以下链接,了解nginx和keepalived,不看也不影响部署 CHAPTER 3 Web HA集群部署 - Keepalived CHAPTER 1 Web Server - nginx 安装配置 Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡。 Keepalived是一个主流高可用软件,基于VIP绑定实现服务器双机热备,在

    2024年02月04日
    浏览(46)
  • kubernetes 二进制方式部署 1.27.1

    序号 名称 IP地址 CPU/颗 内存/GB 硬盘/GB 描述 1 k8s-master01 192.168.1.11 4 4 100 kube-apiserver、kube-controller-manager、kube-scheduler、etcd、 kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx 2 k8s-master02 192.168.1.12 4 4 100 kube-apiserver、kube-controller-manager、kube-scheduler、etcd、 kubelet、kube-proxy、nfs-cl

    2024年02月10日
    浏览(46)
  • 飞天使-k8s知识点20-kubernetes实操5-pod更新与暂停-statefulset

    资源调度 Deployment:扩缩容 资源调度 Deployment:更新的暂停与恢复 资源调度 StatefulSet:定义一个有状态服务 headless service 金丝雀发布 参考文档:https://support.huaweicloud.com/basics-cce/kubernetes_0015.html

    2024年02月20日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包