Helm方式部署 zookeeper+kafka 集群 ——2023.05

本文涉及的产品
云原生网关 MSE Higress,422元/月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Helm方式部署 zookeeper+kafka 集群 ——2023.05

版本概况


服务 版本
centos 7.9
kubernetes v1.20.15
helm v3.10.1
zookeeper 3.8.1
kafka 3.4.0


一、添加helm仓库


# 添加bitnami和官方helm仓库:
helm repo add bitnami https://charts.bitnami.com/bitnami
# 查看仓库
helm repo list


二、安装部署集群


安装方式有两种,在线安装和离线安装,在线安装方便快捷,但是无法修改参数。由于需要修改配置,故本文采用离线安装方式。


2.1 在线安装zookeeper+kafka集群


1. 部署zookeeper集群

# 部署zookeeper集群
helm install zookeeper bitnami/zookeeper \
  --set replicaCount=3 \
  --set auth.enabled=false \
  --set allowAnonymousLogin=true
# 查看
helm list


5c5725e790984a9eb24ce4cb27444a39.png

提示:

由于这个ApacheZookeeper集群不会公开,所以在部署时禁用了身份验证。对于生产环境,请考虑使用生产配置。

生产环境参考:https://github.com/bitnami/charts/tree/main/bitnami/zookeeper#production-configuration


2. 部署kafka集群

# 部署kafka集群
helm install kafka bitnami/kafka \
  --set zookeeper.enabled=false \
  --set replicaCount=3 \
  --set externalZookeeper.servers=ZOOKEEPER-SERVICE-NAME    # ZOOKEEPER-SERVICE-NAME  替换为上一步结束时获得的Apache ZOOKEEPER服务名称


2.2 离线安装zookeeper+kafka集群

由于在线安装,zookeeper的pod起不来,一直处于pending的状态,原因是因为pvc存储卷挂载的问题,所以这里选择把zookeeper和kafka的包下载下来,修改配置文件,然后进行离线安装。

我这里将zookeeper和kafka安装在default命名空间下,如果您想按在指定namespace下,命令后加-n [namespace] 就可以了。

1. 下载离线包

# 创建存放压缩包目录
mkdir /bsm/zookeeper-kafka && cd /bsm/zookeeper-kafka
# 拉取压缩包
helm pull bitnami/zookeeper
helm pull bitnami/kafka
# 解压
tar -zvxf kafka-22.1.2.tgz
tar -zvxf zookeeper-11.4.1.tgz


8b0111009738425cb8e2dd9dea1ef5dd.png

2. 部署zookeeper集群

  • 修改配置文件values.yaml
    主要修改内容:enabled设为false ;注释掉 storageClass: “”、existingClaim: “”
cd /bsm/zookeeper-kafka/zookeeper  
vim values.yaml
# 修改配置文件,主要修改存储storageclass(kafka的配置文件类似)
persistence:
  ## @param persistence.enabled Enable ZooKeeper data persistence using PVC. If false, use emptyDir
  ##
  enabled: false    # 测试环境可设置为false
  ## @param persistence.existingClaim Name of an existing PVC to use (only when deploying a single replica)
  ##
#  existingClaim: ""
  ## @param persistence.storageClass PVC Storage Class for ZooKeeper data volume
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
  ##   GKE, AWS & OpenStack)
  ##
#  storageClass: ""      # 注释掉storageClass。如果创建好了storageclass可打开注释,并写入storageClass的名称


  • 安装zookeeper集群
# 安装zookeeper
cd  /bsm/zookeeper-kafka/zookeeper
helm install zookeeper --set replicaCount=3 --set auth.enabled=false --set allowAnonymousLogin=true ./
# ./ 表示zookeeper的value.yaml文件所在路径

b5181659a8bb4957ba4dcfdb4b409597.png

# 查看pod状态:
[root@k8s-master1 rabbitmq]# kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
zookeeper-0                               1/1     Running   0          85s
zookeeper-1                               1/1     Running   0          85s
zookeeper-2                               1/1     Running   0          84s

3. 安装kafka集群

  • 修改配置文件values.yaml
    主要修改内容:enabled设为false ;注释掉 storageClass: “”、existingClaim: “”;kraft.enable 修改为 false
cd /bsm/zookeeper-kafka/kafka
vim values.yaml
修改一:
persistence:
  ## @param persistence.enabled Enable Kafka data persistence using PVC, note that ZooKeeper persistence is unaffected
  ##
  enabled: false    #改为false
  ## @param persistence.existingClaim A manually managed Persistent Volume and Claim
  ## If defined, PVC must be created manually before volume will be bound
  ## The value is evaluated as a template
  ##
#  existingClaim: ""
  ## @param persistence.storageClass PVC Storage Class for Kafka data volume
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ## set, choosing the default provisioner.
  ##
#  storageClass: ""
  ## @param persistence.accessModes Persistent Volume Access Modes
修改二:
  kraft:
  ## @param kraft.enabled Switch to enable or disable the Kraft mode for Kafka
  ##
  enabled: false    #改为false
  ## @param kraft.processRoles Roles of your Kafka nodes. Nodes can have 'broker', 'controller' roles or both of them.
  ##
  processRoles: broker,controller


  • 安装 kafka 集群
# 安装zookeeper
cd  /bsm/zookeeper-kafka/kafka
helm install kafka --set zookeeper.enabled=false --set replicaCount=3 --set externalZookeeper.servers=ZOOKEEPER-SERVICE-NAME ./      
# ZOOKEEPER-SERVICE-NAME  替换为上一步结束时获得的Apache ZOOKEEPER服务名称
# ./ 表示kafka的value.yaml文件所在路径

b9aff4d14583411e9113fb5798dd542f.png

# 查看:
[root@k8s-master1 kafka]# kubectl get pods 
NAME                                      READY   STATUS    RESTARTS   AGE
kafka-0                                   1/1     Running   0          3m58s
kafka-1                                   1/1     Running   0          3m58s
kafka-2                                   1/1     Running   0          3m58s

报错:

Error: INSTALLATION FAILED: execution error at (kafka/templates/NOTES.txt:314:4):

VALUES VALIDATION:

kafka: Kraft mode

You cannot use Kraft mode and Zookeeper at the same time. They are mutually exclusive. Disable zookeeper in ‘.Values.zookeeper.enabled’ and delete values from ‘.Values.externalZookeeper.servers’ if you want to use Kraft mode

原因:

新版kafka新增了一个kraft模式,他与zookeeper是冲突的,不能同时使用,所以如果使用指定的zookeeper,kraft模式要关闭。

解决办法:

修改kafka的配置文件“value.yaml”,将 kraft.enable 的值改为false


三、验证kafka与zookeeper是否绑定


查看kafka日志中有以下信息:

kubectl logs -f kafka-0  | grep socket

2a089d2adb27434597b3763738323078.png

四、测试集群


# 进入kafka的pod创建一个topic
[root@k8s-master1 kafka]# kubectl exec -it kafka-0 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
I have no name!@kafka-0:/$ kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic testtopic
heCreated topic testtopic.
# 启动一个消费者
[root@k8s-master1 ~]# kubectl exec -it kafka-0 bash
I have no name!@kafka-0:/$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testtopic
# 新开一个窗口,进入kafka的pod,启动一个生产者,输入消息;在消费者端可以收到消息
[root@k8s-master1 ~]# kubectl exec -it kafka-0 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
I have no name!@kafka-0:/$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic testtopic


在生产者页面输入信息,可以在消费者页面查看到。

702f3ddec06842dab7140b3e4b8bd945.png

ce0cadd8d1a54f36b627a97618a824ec.png

部署成功。


附:可改善地方


持久化存储,配置文件value.yaml中storageclass参数未设定,亲和力未设定,测试环境要求没有那么多,生产环境大家可以按需配置。


卸载应用

helm uninstall kafka -n [namespace]
helm uninstall zookeeper  -n [namespace]


参考文章:

bitnami官网:https://docs.bitnami.com/tutorials/deploy-scalable-kafka-zookeeper-cluster-kubernetes

csdn文章:https://blog.csdn.net/heian_99/article/details/114840056

相关文章
|
7天前
|
消息中间件 存储 算法
深度揭秘!Kafka和ZooKeeper之间的相爱相杀
**摘要:** 本文介绍了Kafka和ZooKeeper的角色及其关系。Kafka是分布式流处理平台,用于实时数据管道和流应用;ZooKeeper是分布式协调服务,处理同步和集群协调。在Kafka中,ZooKeeper存储元数据,管理集群成员,选举Controller。随着KIP-500提案,Kafka计划移除对ZooKeeper的依赖,转向基于Raft的共识机制,以简化架构、提高性能和一致性。此外,文章提到了etcd作为基于Raft的元数据存储系统的应用。本文旨在帮助读者理解ZooKeeper在Kafka面试中的重要性,并了解Kafka的未来发展方向。
24 2
|
7天前
|
消息中间件 监控 Java
使用 JMX 监控 Kafka 集群性能指标
使用 JMX 监控 Kafka 集群性能指标
14 1
|
1月前
|
消息中间件 运维 数据管理
Kafka 如何基于 KRaft 实现集群最终一致性协调
Kafka 3.3.1 引入了 KRaft 元数据管理组件,替代 Zookeeper,以简化集群一致性维护,支持更大规模集群并减轻运维复杂性。在 Zookeeper 模式下,需同时运维 ZK 和 Broker,而 KRaft 模式仅需 3 个节点即可构成最小生产集群,且通信协调基于 Raft 协议,增强了一致性。KRaft 模式中,Controller 使用单线程处理请求,通过 KRaft 保持内存状态与多节点一致性。此外,Broker 根据 KRaft 记录更新元数据,实现声明式管理,提高集群协调效率。KRaft 的引入是集群协调机制的演进,采用事件驱动模型实现元数据的一致性。
36 1
Kafka 如何基于 KRaft 实现集群最终一致性协调
|
5天前
|
消息中间件 NoSQL Kafka
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(2)
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(2)
|
5天前
|
消息中间件 应用服务中间件 Kafka
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(1)
日志收集平台项目nginx、kafka、zookeeper、filebeat搭建的基本配置(1)
|
5天前
|
消息中间件 Kafka
kafka配置中启动zookeeper时没有启动成功的解决办法
kafka配置中启动zookeeper时没有启动成功的解决办法
|
5天前
|
消息中间件 存储 负载均衡
Kafka高可用性指南:提高数据一致性和集群容错能力!
**Kafka高可用性概览** - 创建Topic时设置`--replication-factor 3`确保数据冗余和高可用。 - 分配角色:Leader处理读写,Follower同步数据,简化管理和客户端逻辑。 - ISR(In-Sync Replicas)保持与Leader同步的副本列表,确保数据一致性和可靠性。 - 设置`acks=all`保证消息被所有副本确认,防止数据丢失,增强一致性。 - 通过这些机制,Kafka实现了分布式环境中的数据可靠性、一致性及服务的高可用性。
27 0
|
7天前
|
消息中间件 监控 Kafka
查询Kafka集群中消费组(group)信息和对应topic的消费情况
查询Kafka集群中消费组(group)信息和对应topic的消费情况
17 0
|
17天前
|
Java 网络安全
分布式系统详解--框架(Zookeeper-简介和集群搭建)
分布式系统详解--框架(Zookeeper-简介和集群搭建)
109 0
|
1月前
|
消息中间件 数据可视化 Java
Kafka集群搭建可视化指南
Kafka集群搭建可视化指南
50 0