KubeSphere 部署 Kafka 集群实战指南

devtools/2024/10/18 1:44:41/

本文档将详细阐述如何利用 Helm 这一强大的工具,快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群。

实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同)

主机名IPCPU内存系统盘数据盘用途
ksp-registry192.168.9.904840200Harbor 镜像仓库
ksp-control-1192.168.9.914840100KubeSphere/k8s-control-plane
ksp-control-2192.168.9.924840100KubeSphere/k8s-control-plane
ksp-control-3192.168.9.934840100KubeSphere/k8s-control-plane
ksp-worker-1192.168.9.9481640100k8s-worker/CI
ksp-worker-2192.168.9.9581640100k8s-worker
ksp-worker-3192.168.9.9681640100k8s-worker
ksp-storage-1192.168.9.974840400+ElasticSearch/Longhorn/Ceph/NFS
ksp-storage-2192.168.9.984840300+ElasticSearch/Longhorn/Ceph
ksp-storage-3192.168.9.994840300+ElasticSearch/Longhorn/Ceph
ksp-gpu-worker-1192.168.9.10141640100k8s-worker(GPU NVIDIA Tesla M40 24G)
ksp-gpu-worker-2192.168.9.10241640100k8s-worker(GPU NVIDIA Tesla P100 16G)
ksp-gateway-1192.168.9.1032440自建应用服务代理网关/VIP:192.168.9.100
ksp-gateway-2192.168.9.1042440自建应用服务代理网关/VIP:192.168.9.100
ksp-mid192.168.9.1054840100部署在 k8s 集群之外的服务节点(Gitlab 等)
合计15681526002100+

实战环境涉及软件版本信息

  • 操作系统:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • Bitnami Kafka Helm Charts:29.3.13
  • Kafka: 3.7.1

1. 前提条件

目前在 K8s 集群部署 Kafka 的主流方案有以下几种:

  • 手写资源配置清单(麻烦,涉及的组件、配置多)
  • Kafka Helm chart (Bitnami 出品,简单可定制,但是需要花时间成本学习可配置参数)

经过细致的调研、思考,本文选择采用 Bitnami 的 Kafka Helm chart 进行部署。Bitnami 提供的 Helm chart 以其稳定性和易用性著称,是快速部署 Kafka 到 Kubernetes 集群的理想选择。

编写本文的目的是为了验证 Kafka Helm chart 的部署可行性,并评估其在实际应用中的表现。为了确保过程的顺利和提高成功几率,以下部署配置进行了适度简化,某些配置并不符合生产环境的标准

  • 外部访问安全协议,使用了 PLAINTEXT ,关闭了访问认证,默认值为 SASL_PLAINTEXT生产环境务必开启认证。
  • 外部访问使用了 NodePort 模式
  • 默认 StorageClass 使用了 NFS
  • 没有考虑数据持久化的配置

对于计划在生产环境部署的用户,我建议详细参考 Bitnami 官方文档,以获取更全面的配置指导和最佳实践。我认为生产环境应该考虑的几项配置如下:

  • 外部访问安全协议,选择PLAINTEXT, SASL_PLAINTEXT, SASL_SSLSSL 中的哪种方式加密认证方式,
  • 数据、日志持久化配置
  • k8s 集群外部访问 Kafka 的方式,NodePort 是否合适?是否需要使用 LoadBalancer、Ingress
  • 内否启用内置的监控 Metrics
  • 是否利用 Helm 生成 Kubectl 可用的资源配置清单,离线部署

2. 使用 Helm 安装 Kafka 集群

2.1 安装 Kafka Helm Chart

  • 添加 Kafka Helm repository
helm repo add bitnami https://charts.bitnami.com/bitnami
  • 更新本地 charts
helm repo update bitnami                

2.2 安装 Kafka

  • 官方默认安装命令(仅供参考,本文未用
helm install my-release oci://registry-1.docker.io/bitnamicharts/kafka
  • 按规划设置自定义配置项,执行下面的安装命令:
helm install opsxlab bitnami/kafka \--namespace opsxlab --create-namespace \--set replicaCount=3 \--set global.imageRegistry="registry.opsxlab.cn:8443" \--set global.defaultStorageClass="nfs-sc" \--set externalAccess.enabled=true \--set externalAccess.controller.service.type=NodePort \--set externalAccess.controller.service.nodePorts[0]='31211' \--set externalAccess.controller.service.nodePorts[1]='31212' \--set externalAccess.controller.service.nodePorts[2]='31213' \--set externalAccess.controller.service.useHostIPs=true \--set listeners.client.protocol=PLAINTEXT \--set listeners.external.protocol=PLAINTEXT

自定义配置说明:

  • 指定并自动创建命名空间 opsxlab
  • 设置组件的镜像地址,本文为了演示修改方法,使用了内部的镜像仓库,实际使用中请修改为自己的镜像仓库地址
  • 设置默认的持久化存储类为 nfs-sc,适用于 K8s 有多种存储类,需要部署到指定存储类的场景
  • 开启外部访问,并设置相关参数
  • 加密认证方式选择了 PLAINTEXT

正确执行后,输出结果如下 :

$ helm install opsxlab bitnami/kafka \--set externalAccess.controller.service.nodePorts[1]='31212' \
>   --namespace opsxlab --create-namespace \
>   --set replicaCount=3 \
>   --set global.imageRegistry="registry.opsxlab.cn:8443" \
>   --set global.defaultStorageClass="nfs-sc" \
>   --set externalAccess.enabled=true \
>   --set externalAccess.controller.service.type=NodePort \
>   --set externalAccess.controller.service.nodePorts[0]='31211' \
>   --set externalAccess.controller.service.nodePorts[1]='31212' \
>   --set externalAccess.controller.service.nodePorts[2]='31213' \
>   --set externalAccess.controller.service.useHostIPs=true \
>   --set listeners.client.protocol=PLAINTEXT \
>   --set listeners.external.protocol=PLAINTEXT
NAME: opsxlab
LAST DEPLOYED: Wed Jul 30 22:08:38 2024
NAMESPACE: opsxlab
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: kafka
CHART VERSION: 29.3.13
APP VERSION: 3.7.1
---------------------------------------------------------------------------------------------WARNINGBy specifying "serviceType=LoadBalancer" and not configuring the authenticationyou have most likely exposed the Kafka service externally without anyauthentication mechanism.For security reasons, we strongly suggest that you switch to "ClusterIP" or"NodePort". As alternative, you can also configure the Kafka authentication.---------------------------------------------------------------------------------------------** Please be patient while the chart is being deployed **Kafka can be accessed by consumers via port 9092 on the following DNS name from within your cluster:opsxlab-kafka.opsxlab.svc.cluster.localEach Kafka broker can be accessed by producers via port 9092 on the following DNS name(s) from within your cluster:opsxlab-kafka-controller-0.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092opsxlab-kafka-controller-1.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092opsxlab-kafka-controller-2.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092To create a pod that you can use as a Kafka client run the following commands:kubectl run opsxlab-kafka-client --restart='Never' --image registry.opsxlab.cn:8443/bitnami/kafka:3.7.1-debian-12-r4 --namespace opsxlab --command -- sleep infinitykubectl exec --tty -i opsxlab-kafka-client --namespace opsxlab -- bashPRODUCER:kafka-console-producer.sh \--broker-list opsxlab-kafka-controller-0.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,opsxlab-kafka-controller-1.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,opsxlab-kafka-controller-2.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092 \--topic testCONSUMER:kafka-console-consumer.sh \--bootstrap-server opsxlab-kafka.opsxlab.svc.cluster.local:9092 \--topic test \--from-beginning
To connect to your Kafka controller+broker nodes from outside the cluster, follow these instructions:Kafka brokers domain: You can get the external node IP from the Kafka configuration file with the following commands (Check the EXTERNAL listener)1. Obtain the pod name:kubectl get pods --namespace opsxlab -l "app.kubernetes.io/name=kafka,app.kubernetes.io/instance=opsxlab,app.kubernetes.io/component=kafka"2. Obtain pod configuration:kubectl exec -it KAFKA_POD -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listenersKafka brokers port: You will have a different node port for each Kafka broker. You can get the list of configured node ports using the command below:echo "$(kubectl get svc --namespace opsxlab -l "app.kubernetes.io/name=kafka,app.kubernetes.io/instance=opsxlab,app.kubernetes.io/component=kafka,pod" -o jsonpath='{.items[*].spec.ports[0].nodePort}' | tr ' ' '\n')"WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:- controller.resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

2.3 查看安装结果

Helm 安装命令成功执行后,观察 Pod 运行状态。

kubectl get pods -n opsxlab

安装成功后,输出结果如下 :

$ kubectl get pods -n opsxlab
NAME                         READY   STATUS    RESTARTS   AGE
opsxlab-kafka-controller-0   1/1     Running   0          1m17s
opsxlab-kafka-controller-1   1/1     Running   0          1m17s
opsxlab-kafka-controller-2   1/1     Running   0          1m17s

KubeSphere 管理控制台查看部署的组件信息。

  • StatefulSet(1个

  • Services(5个

3. 验证测试 Kafka 服务可用性

分别在 K8s 集群内和集群外验证 Kafka 服务的可用性。

k8s-集群内部验证">3.1 K8s 集群内部验证

在 K8s 集群内的验证过程,可以参考 Helm 部署 Kafka 时给出的提示信息。

  1. 创建测试 Pod
kubectl run opsxlab-kafka-client --restart='Never' --image registry.opsxlab.cn:8443/bitnami/kafka:3.7.1-debian-12-r4 --namespace opsxlab --command -- sleep infinity
  1. 打开测试 Pod 终端
kubectl exec --tty -i opsxlab-kafka-client --namespace opsxlab -- bash
  1. 执行命令,生产数据
kafka-console-producer.sh \--broker-list opsxlab-kafka-controller-0.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,opsxlab-kafka-controller-1.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,opsxlab-kafka-controller-2.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092 \--topic test
  1. 再打开一个测试 Pod 终端,消费数据

再打开一个终端后,先执行 第 2 步打开测试 Pod 终端的命令,然后再执行下面的命令。

kafka-console-consumer.sh \--bootstrap-server opsxlab-kafka.opsxlab.svc.cluster.local:9092 \--topic test \--from-beginning
  1. 生产并消费数据测试

在生产者一侧随便输入测试数据,观察消费者一侧是否正确收到信息。

生产者侧:

I have no name!@opsxlab-kafka-client:/$ kafka-console-producer.sh   --broker-list opsxlab-kafka-controller-0.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,opsxlab-kafka-controller-1.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,opsxlab-kafka-controller-2.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092   --topic test
>cluster kafka test 1
>cluster kafka test 2

消费者侧:

I have no name!@opsxlab-kafka-client:/$ kafka-console-consumer.sh \--bootstrap-server opsxlab-kafka.opsxlab.svc.cluster.local:9092 \--topic test \--from-beginningcluster kafka test 1
cluster kafka test 2

k8s-集群外部验证">3.2 k8s 集群外部验证

为了更严谨的测试 Kafka 在 K8s 集群外的可用性,我在 K8s 集群外找了一台机器,安装 JDK 和 Kafka。安装方式上 JDK 选择了 Yum 安装 openjdk,Kafka 则选用了官方提供的二进制包。

实际测试时还可以选择 Docker 镜像或是在 K8s 集群上再创建一个 Pod,测试时连接 K8s 节点的宿主机 IP 和 NodePort。

  1. 准备外部测试环境
# 安装 JDK
yum install java-1.8.0-openjdk# 下载 Kafka
cd /srv
wget https://downloads.apache.org/kafka/3.7.1/kafka_2.13-3.7.1.tgz# 解压
tar xvf kafka_2.13-3.7.1.tgz
cd /srv/kafka_2.13-3.7.1/bin
  1. 获取 Kafka 外部访问配置信息

一共 3个 Kafka Pod,每个 Pod 的 advertised.listeners 配置不同,在 K8s 控制节点,分别执行下面的命令:

kubectl exec -n opsxlab -it opsxlab-kafka-controller-0 -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listeners
kubectl exec -n opsxlab -it opsxlab-kafka-controller-1 -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listeners
kubectl exec -n opsxlab -it opsxlab-kafka-controller-2 -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listeners

正确执行后,输出结果如下 :

$ kubectl exec -n opsxlab -it opsxlab-kafka-controller-0 -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listeners
Defaulted container "kafka" out of: kafka, kafka-init (init)
advertised.listeners=CLIENT://opsxlab-kafka-controller-0.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,INTERNAL://opsxlab-kafka-controller-0.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9094,EXTERNAL://192.168.9.125:31211$ kubectl exec -n opsxlab -it opsxlab-kafka-controller-1 -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listeners
Defaulted container "kafka" out of: kafka, kafka-init (init)
advertised.listeners=CLIENT://opsxlab-kafka-controller-1.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,INTERNAL://opsxlab-kafka-controller-1.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9094,EXTERNAL://192.168.9.124:31212$ kubectl exec -n opsxlab -it opsxlab-kafka-controller-2 -- cat /opt/bitnami/kafka/config/server.properties | grep advertised.listeners
Defaulted container "kafka" out of: kafka, kafka-init (init)
advertised.listeners=CLIENT://opsxlab-kafka-controller-2.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9092,INTERNAL://opsxlab-kafka-controller-2.opsxlab-kafka-controller-headless.opsxlab.svc.cluster.local:9094,EXTERNAL://192.168.9.126:31213
  1. 外部节点连接 Kafka 测试

跟 K8s 集群内部验证测试过程一样,打开两个终端,运行生产者和消费者脚本。执行下面的命令验证测试(细节略过,直接上结果)。

外部生产者侧:

$ ./kafka-console-producer.sh --broker-list 192.168.9.125:31211  --topic test
>external kafka test 3
>external kafka test 4

外部消费者侧:

$ ./kafka-console-consumer.sh --bootstrap-server 192.168.9.125:31211  --topic test --from-beginningcluster kafka test 1
cluster kafka test 2
external kafka test 3
external kafka test 4

注意: 外部消费者能消费到所有数据,包括集群内部测试时生成的数据。

集群内消费者侧: 集群内的消费者,同样能获取外部生产者产生的数据。

I have no name!@opsxlab-kafka-client:/$ kafka-console-consumer.sh \--bootstrap-server opsxlab-kafka.opsxlab.svc.cluster.local:9092 \--topic test \--from-beginningcluster kafka test 1
cluster kafka test 2
external kafka test 3
external kafka test 4

免责声明:

  • 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境由此引发的任何问题,作者概不负责

本文由博客一文多发平台 OpenWrite 发布!


http://www.ppmy.cn/devtools/93977.html

相关文章

Linux命令更新-用户登录信息及失败记录查询

前言 Linux系统中,用户登录信息和登录失败记录对于系统安全和故障排查至关重要。通过系统提供的命令,我们可以详细查看用户的登录历史、登录失败次数、登录时间等信息。本文将详细介绍常用的Linux命令,并结合示例进行说明。 1. 查看当前登录…

AIGC实践|AI助力一张照片生成百变写真

前言: 在之前的文章中,我们已经领略了 AI 在动态有声绘本、小游戏开发、视频短片制作以及包装设计等领域的神奇应用,在本篇文章中,我将尝试利用AI辅助,使用一张照片生成个性化写真集。充分满足工作艺术照、各地郊游打…

数据结构--双指针与LeetCodeHOT100

文章目录 1. 引言简介目的 2. 双指针技术概述定义类型优势 3. 双指针技术的应用场景滑动窗口有序数组链表问题 4. 判断是否适合使用双指针1. 问题要求2. 数据结构特性3. 问题类型4. 算法效率5. 特定问题模式6. 代码可读性和维护性7. 实际应用案例8. 测试和验证 5. 一些双指针的…

使用 Node.js 模拟执行 JavaScript

准备工作 正确安装好 Node.js ,安装好之后,能正常使用 node 和 npm 两个命令 模拟执行 关于案例分析 写文章-CSDN创作中心 这里就不做分析了,直接使用 我们的目的是: 使用 node.js 加载 Crypto 库, 并执行 getToken 方法 …

月薪5W的项目经理是如何面试的?这份面试攻略请收好!

面试是项目经理求职必须经历的一关,但很多经验不够丰富的项目经理不知道面试会问些什么问题,也不知道要怎么回答,无疑会直接影响面试企业的判断,使项目经理求职受阳.所以,项目经理想要顺利求职,还是有必要掌…

# [0813] Task01 Datawhale AI 夏令营 —— 数据合成与清洗

参考教程链接:注意查看 评论区相关内容 Q & A 汇总 赛事链接:天池 Better Synth 多模态大模型数据合成挑战赛 算力资源 挺烧钱的。。 之前的教程有些问题没考虑到,排坑花了 200 了。。 跑通 baseline 至少需要 120G 内存以上的 A10&am…

Qt读写sysfs

本文介绍Qt读写sysfs。 在嵌入式Linux系统上开发Qt应用程序,经常会涉及到外设的控制,比如GPIO,PWM的控制,Linux环境下可以像操作文件一样操作它们,这通常会涉及到sysfs的读写。本文以读写GPIO为例,简要介绍…

Linux部署MySQL8.0

目录 一、部署前准备1.1、查看系统版本和位数(32位或64位)1.2、下载对应安装包 二、开始部署1、将安装包解压并且移动到目标安装目录2、准备MySQL数据和日志等存储文件夹3、准备MySQL配置文件 my.cnf4、创建mysql单独用户组和用户,将安装目录…