Kafka系列之K8S部署集群

1. 部署方式选择

基于Kafka3.X后的集群搭建方式主要分为两种,一种是基于Zookeeper管理方式,一种是基于KRaft模式,本文主要介绍Kafka-KRaft集群模式搭建

纠正文章1.Kafka系列之K8S部署单节点中基于Zookeeper方式的部署方式错误,其实是基于KRaft启动的,所以不部署Zookeeper也可以,可以通过把连接ZK的环境去掉看是否可以启动成功验证

2.KRaft模式介绍

Apache Kafka 不依赖 Apache Zookeeper的版本,被社区称之为 Kafka Raft 元数据模式,简称KRaft模式。

KRaft运行模式的Kafka集群,不会将元数据存储在 Apache ZooKeeper中。即部署新集群的时候,无需部署ZooKeeper集群,因为Kafka将元数据存储在 Controller 节点的 KRaft Quorum中。KRaft可以带来很多好处,比如可以支持更多的分区,更快速的切换Controller,也可以避免Controller缓存的元数据和Zookeeper存储的数据不一致带来的一系列问题

3. 编写install.sh

我们基于Helm进行安装,在此不在讲解Helm安装方式

helm repo add bitnami https://charts.bitnami.com/bitnami
# 指定命名空间为middleware,如果卸载后再次安装,install改为upgrade
helm install kafka bitnami/kafka --namespace middleware
    --set kafkaVersion=3.4.0
    --set replicaCount=3
    --set kafka.persistence.enabled=false
    --set kafka.kafkaConfigOverrides=transaction.state.log.replication.factor=3
    --set kafka.kafkaConfigOverrides=transaction.state.log.min.isr=2
    --set kafka.kafkaConfigOverrides=default.replication.factor=3
    --set kafka.kafkaConfigOverrides=num.io.threads=8
    --set kafka.kafkaConfigOverrides=num.network.threads=3
    --set kafka.kafkaConfigOverrides=log.message.format.version=3.4
    --set kafka.kafkaConfigOverrides=inter.broker.protocol.version=3.4
    --set kafka.kafkaConfigOverrides=offsets.topic.replication.factor=3
    --set kafka.kafkaConfigOverrides=transaction.state.log.num.partitions=50
    --set-string labels.app.kubernetes.io/managed-by=Helm
    --set-string labels.meta.helm.sh/release-name=kafka
    --set-string labels.meta.helm.sh/release-namespace=middleware

打印日志

space=middleware
NAME: kafka
LAST DEPLOYED: Sun May 21 13:56:26 2023
NAMESPACE: middleware
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: kafka
CHART VERSION: 22.1.2
APP VERSION: 3.4.0

** 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:

    kafka.middleware.svc.cluster.local

Each Kafka broker can be accessed by producers via port 9092 on the following DNS name(s) from within your cluster:

    kafka-0.kafka-headless.middleware.svc.cluster.local:9092
    kafka-1.kafka-headless.middleware.svc.cluster.local:9092
    kafka-2.kafka-headless.middleware.svc.cluster.local:9092

To create a pod that you can use as a Kafka client run the following commands:

    kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.4.0-debian-11-r28 --namespace middleware --command -- sleep infinity
    kubectl exec --tty -i kafka-client --namespace middleware -- bash

    PRODUCER:
        kafka-console-producer.sh \
            --broker-list kafka-0.kafka-headless.middleware.svc.cluster.local:9092,kafka-1.kafka-headless.middleware.svc.cluster.local:9092,kafka-2.kafka-headless.middleware.svc.cluster.local:9092 \
            --topic test

    CONSUMER:
        kafka-console-consumer.sh \
            --bootstrap-server kafka.middleware.svc.cluster.local:9092 \
            --topic test \
            --from-beginning

4. 验证生产者与消费者

安装打印日志的提示,我们发送 算法小生 消息至test主题,并进行消费,OK

5. 节点部分失败模拟

我们手工删除kafka01,由于是Statefulsets部署方式:和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是, StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID

所在再次进行消费的时候,还可以看到 算法小生 仍然正常消费

6. 安装卸载uninstall.sh
#!/bin/bash

set -e

# 定义变量
NAMESPACE="middleware"
RELEASE_NAME="kafka"

# 删除Kafka实例
helm delete "$RELEASE_NAME" --namespace "$NAMESPACE"

# 等待Kafka实例完全删除
echo "等待Kafka实例删除..."
while kubectl get statefulsets -n "$NAMESPACE" | grep "$RELEASE_NAME"; do
  echo "等待Kafka实例删除..."
  sleep 5
done

echo "卸载完成"

注意:当我们执行install.sh后,再次执行消费test主题,也可以看到 算法小生 输出,这个证明了Statefulsets在删除后,不会删除持久卷,即数据不会被删除

欢迎关注公众号算法小生

K8S集群部署Kafka 3.8版本并采用KRaft模式,可按以下步骤进行: ### 安装Operator 安装operator,完成后执行命令: ```bash kubectl create -f ‘https://strimzi.io/install/latest?namespace=kafka-system’ -n kafka-system ``` 若k8s集群域名不是默认的`cluster.local`,需要在operator资源上使用`KUBERNETES_SERVICE_DNS_DOMAIN`环境变量覆盖原来的 [^1]。 ### 配置持久卷(可选) 可以使用如下的`kafka-pv.yaml`文件来创建持久卷: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: k8s-pv-kafka01 namespace: tools labels: app: kafka annotations: volume.beta.kubernetes.io/storage-class: "mykafka" spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /data/share/pv/kafka01 persistentVolumeReclaimPolicy: Recycle --- apiVersion: v1 kind: PersistentVolume metadata: name: k8s-pv-kafka02 namespace: tools labels: app: kafka annotations: volume.beta.kubernetes.io/storage-class: "mykafka" spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /data/share/pv/kafka02 persistentVolumeReclaimPolicy: Recycle --- apiVersion: v1 kind: PersistentVolume metadata: name: k8s-pv-kafka03 namespace: tools labels: app: kafka annotations: volume.beta.kubernetes.io/storage-class: "mykafka" spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /data/share/pv/kafka03 persistentVolumeReclaimPolicy: Recycle ``` 将上述内容保存为`kafka-pv.yaml`,然后执行`kubectl apply -f kafka-pv.yaml`来创建持久卷 [^3]。 ### 部署Kafka资源 按照官方步骤执行即可,参考如下配置文件: ```yaml apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: dual-role labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller - broker resources: requests: memory: 2Gi cpu: "1" limits: memory: 2Gi cpu: "1" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi class: disk-emqx deleteClaim: false kraftMetadata: shared --- apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster annotations: strimzi.io/node-pools: enabled strimzi.io/kraft: enabled spec: kafka: version: 3.8.0 metadataVersion: 3.8-IV0 listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true config: offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 default.replication.factor: 3 min.insync.replicas: 2 entityOperator: topicOperator: {} userOperator: {} ``` 将上述内容保存为`kafka-deployment.yaml`,然后执行`kubectl apply -f kafka-deployment.yaml`来部署Kafka资源 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小生Đ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值