14.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在删除后,不会删除持久卷,即数据不会被删除

欢迎关注公众号算法小生

猜你喜欢

转载自blog.csdn.net/SJshenjian/article/details/130791904