1. 部署方式選擇
基于Kafka3.X后的集群搭建方式主要分為兩種,一種是基于Zookeeper管理方式,一種是基于KRaft模式,本文主要介紹Kafka-KRaft集群模式搭建
糾正文章1.Kafka系列之K8S部署單節(jié)點中基于Zookeeper方式的部署方式錯誤,其實是基于KRaft啟動的,所以不部署Zookeeper也可以,可以通過把連接ZK的環(huán)境去掉看是否可以啟動成功驗證
2.KRaft模式介紹
Apache Kafka 不依賴 Apache Zookeeper的版本,被社區(qū)稱之為 Kafka Raft 元數(shù)據(jù)模式,簡稱KRaft模式。
KRaft運行模式的Kafka集群,不會將元數(shù)據(jù)存儲在 Apache ZooKeeper中。即部署新集群的時候,無需部署ZooKeeper集群,因為Kafka將元數(shù)據(jù)存儲在 Controller 節(jié)點的 KRaft Quorum中。KRaft可以帶來很多好處,比如可以支持更多的分區(qū),更快速的切換Controller,也可以避免Controller緩存的元數(shù)據(jù)和Zookeeper存儲的數(shù)據(jù)不一致帶來的一系列問題
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. 驗證生產(chǎn)者與消費者
安裝打印日志的提示,我們發(fā)送 算法小生 消息至test主題,并進行消費,OK
5. 節(jié)點部分失敗模擬
我們手工刪除kafka01,由于是Statefulsets部署方式:和 Deployment 類似, StatefulSet 管理基于相同容器規(guī)約的一組 Pod。但和 Deployment 不同的是, StatefulSet 為它們的每個 Pod 維護了一個有粘性的 ID。這些 Pod 是基于相同的規(guī)約來創(chuàng)建的, 但是不能相互替換:無論怎么調度,每個 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 "卸載完成"
注意:當我們執(zhí)行install.sh后,再次執(zhí)行消費test主題,也可以看到 算法小生 輸出,這個證明了Statefulsets在刪除后,不會刪除持久卷,即數(shù)據(jù)不會被刪除文章來源:http://www.zghlxwxcb.cn/news/detail-690769.html
歡迎關注公眾號算法小生文章來源地址http://www.zghlxwxcb.cn/news/detail-690769.html
到了這里,關于14.Kafka系列之K8S部署集群的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!