0. 前言
从 3.3.1
开始,KRaft
模式生产可用,使用 KRaft
版的 Kafka
, 不在需要维护 Zookeeper
。 这咱们得整一手,用不用另说,先部署起来。就像面试:
面试官:有没有高并发高可用的经验?我们系统服务xx人,每年为用户提供xx服务。
我:那必须的,不止玩过高并发高可用,还有自动扩容缩容,滚动更新(其实就用了K8S)
入职:QPS 25
更新日志:Apache Kafka
1. 准备
K8S
kubectl
helm
2. 方案选择
Kafka
镜像用的比较多的有两家:
- confluentinc/cp-kafka - Docker Image
- bitnami/kafka - Docker Image
- wurstmeister/kafka 已经搜索不到了 Page Not Found (docker.com)
那咱不得好好评估评估? bitnami/kafka
就是原生的 Kafka
,confluentinc
是在原生 Kafka
的基础上加了一些东西,但他还是兼容原生 Kafka
,有兴趣的自己去看,我没兴趣。
Confluent Platform | Confluent Documentation
我一个 Kafka
都搞不明白,还要我再去看附加的东西?没门。
最主要的是人家只想做一个单纯的小男生呀,绝不是因为 bitnami
配备了能一键部署 K8S Kafka
集群 的 helm chart
,才选择使用 bitnami
的。
3. 利用 helm 搭建 Kafka 集群
charts/bitnami/kafka at main · bitnami/charts (github.com)
有了这东西不比自己坑次坑次写 kubectl
配置文件强?
我上来就是一个 values.yaml
(不改默认的也行,就是连接的时候要配置认证)
yaml
image:
registry: docker.io
repository: bitnami/kafka
tag: 3.6.1-debian-11-r3
pullPolicy: IfNotPresent
listeners:
client:
containerPort: 9092
# 客户端需不需要认证主要是这里
protocol: PLAINTEXT
name: CLIENT
controller:
name: CONTROLLER
containerPort: 9093
protocol: PLAINTEXT
sslClientAuth: ""
interbroker:
containerPort: 9094
protocol: PLAINTEXT
name: INTERNAL
sslClientAuth: ""
external:
containerPort: 9095
protocol: PLAINTEXT
name: EXTERNAL
sslClientAuth: ""
controller:
# 默认controller可以兼职broker,为了测试集群,设2。为什么不3?等下把我机器卡死了怎么办?
replicaCount: 2
broker:
replicaCount: 0
service:
type: ClusterIP
ports:
client: 9092
controller: 9093
interbroker: 9094
external: 9095
kraft:
enabled: true
反手一个helm 命令:
shell
# 提醒开启oci配置,就加上这个
export HELM_EXPERIMENTAL_OCI=1
helm install kafka-cluster oci://registry-1.docker.io/bitnamicharts/kafka --version "26.0.0" -n "集群需要部署的k8s命名空间" -f values.yaml
等一小会就完成了,这不比直接用 kubectl
香?
连service都给你整好了
4. 顺便搭建个 Kafka-UI
测试一下能不能连接上,Kafka-ui 看起来不错,测试的同时还能得到一个操作kafka的系统,盘它。
揍四他:provectus/kafka-ui: Open-Source Web UI for Apache Kafka Management (github.com) (唯一的缺点是不需要登录就能访问页面了)
这次我们直接用 kubectl
来干了,不是因为我突然装逼给你手写 yaml
文件,而是人家不屑于提供 helm chart
,这东西太简单了。简单到我都能操作。
我上来就是一个 kubectl yaml
:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-ui-deployment
namespace: 命名空间
labels:
app: kafka-ui
spec:
# 就一个ui页面还要啥?
replicas: 1
selector:
matchLabels:
app: kafka-ui
template:
metadata:
labels:
app: kafka-ui
spec:
containers:
- name: kafka-ui
image: provectuslabs/kafka-ui:53a6553765a806eda9905c43bfcfe09da6812035
env:
- name: KAFKA_CLUSTERS_0_NAME
value: "Kafka Cluster"
- name: KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS
value: kafka-cluster-controller-0.kafka-cluster-controller-headless.命名空间.svc.cluster.local:9092,kafka-cluster-controller-1.kafka-cluster-controller-headless.命名空间.svc.cluster.local:9092
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1024Mi"
cpu: "1000m"
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: kafka-ui-service
namespace: 命名空间
spec:
selector:
app: kafka-ui
type: NodePort
ports:
- protocol: TCP
port: 8080 # 有域名配置个ingress来访问,就不用nodeport了
targetPort: 8080
nodePort: 30180 # node port可以通过集群IP+端口访问
这波完美
Ref
confluentinc/cp-kafka - Docker Image
Confluent Platform | Confluent Documentation
charts/bitnami/kafka at main · bitnami/charts (github.com)
charts/bitnami/kafka/values.yaml at main · bitnami/charts (github.com)
provectus/kafka-ui: Open-Source Web UI for Apache Kafka Management (github.com)