参考来源:
- 课程随堂笔记: Kubernetes全栈架构师:基于世界500强的k8s实战课程
什么是 Helm
Helm 是 Kubernetes 的包管理,是一个由 CNCF 孵化和管理的项目,用于对需要再 k8s 上部署的复杂应用进行定义,安装和更新。Helm 以 Chart 的方式对应用软件进行描述,可以方便地创建,版本化,共享和发布复杂的应用软件。
使用 Helm 安装中间件示例
使用 Helm 创建 Zookeeper 集群
添加 bitnami 和官方 helm 仓库
1
2
3
4
5
6
7
8
9
10
11# 添加 bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 添加 helm 官方仓库
helm repo add stable https://charts.helm.sh/stable
# 查看仓库列表
helm repo list
# 更新仓库
helm repo update使用 Helm 下载 Zookeeper 安装包
1
2
3
4
5# 查找 Zookeeper 包
helm search repo zookeeper
# 下载 Release 包
helm pull bitnami/zookeeper解压下载的 Release 包,修改 values.yaml 文件中相应的配置:
- replicaCount: 副本数,按需修改,这里部署集群,所以改成 3
- auth.enabled: 是否启用认证,使用默认的 false 即可;
- persistence: 数据持久化,生产环境一定要启用,并配置 persistence.storageClass,由于这里是测试实验,所以不启用持久化;
- image: 生产环境建议将镜像同步到本地,然后修改地址为本地 docker hub 的地址;
修改好 values.yaml 文件后,使用以下命令安装 Zookeeper
1
2
3
4
5
6
7
8# 创建 namespace
kubectl create ns public-service
# 安装 Zookeeper
helm install zookeeper -n public-service .
# 查看 Release 状态
helm list -n public-service查看 Zookeeper 部署状态
1
2
3
4
5
6
7
8
9
10# kubectl get pods -n public-service
NAME READY STATUS RESTARTS AGE
zookeeper-0 1/1 Running 0 30m
zookeeper-1 1/1 Running 0 30m
zookeeper-2 1/1 Running 0 30m
# kubectl get svc -n public-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zookeeper ClusterIP 10.103.94.80 <none> 2181/TCP,2888/TCP,3888/TCP 93s
zookeeper-headless ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 94szookeeper-headless: 集群内部通讯用的,不需要管,连接 Zookeeper 集群使用 svc zookeeper 进行连接即可。
使用 Helm 创建 Kafka 集群
之前是使用本地文件的方式安装 Zookeeper 集群,这里使用命令行在线安装的方式安装 kafka 集群,命令如下
1
2
3
4
5
6helm install kafka bitnami/kafka \
--set zookeeper.enabled=false \ # 由于使用外部的 Zookeeper 集群,所以 kafka 内置的 Zookeeper 不需要启用
--set replicaCount=3 \ # kafka 集群副本数
--set externalZookeeper.servers=zookeeper \ # 外置的 Zookeeper svc 地址
--set persistence.enabled=false \ # 持久化数据配置
-n public-service查看安装状态以及安装参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14# helm list -n public-service
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kafka public-service 1 2021-10-27 10:36:20.905148931 +0800 CST deployed kafka-14.2.4 2.8.1
zookeeper public-service 1 2021-10-27 09:59:55.207785006 +0800 CST deployed zookeeper-7.4.9 3.7.0
# helm get values kafka -n public-service
USER-SUPPLIED VALUES:
externalZookeeper:
servers: zookeeper
persistence:
enabled: false
replicaCount: 3
zookeeper:
enabled: falses查看 kafka 集群 pod 以及 svc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# kubectl get pods -n public-service
NAME READY STATUS RESTARTS AGE
kafka-0 1/1 Running 0 13m
kafka-1 1/1 Running 0 13m
kafka-2 1/1 Running 0 13m
zookeeper-0 1/1 Running 0 50m
zookeeper-1 1/1 Running 0 50m
zookeeper-2 1/1 Running 0 50m
# kubectl get svc -n public-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kafka ClusterIP 10.102.124.34 <none> 9092/TCP 20m
kafka-headless ClusterIP None <none> 9092/TCP,9093/TCP 20m
zookeeper ClusterIP 10.109.19.85 <none> 2181/TCP,2888/TCP,3888/TCP 56m
zookeeper-headless ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 56m验证 kafka 是否可用,创建一个 Pod kafka-client
1
2# kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:2.8.1-debian-10-r25 --namespace public-service --command sleep infinity
pod/kafka-client created打开两个窗口,分别模拟 producer 以及 consumer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# producer 终端执行以下命令
kubectl exec -ti -n public-service kafka-client -- bash # 进入 Pod
# 启动一个生产者,topic 选择 test
$ kafka-console-producer.sh \
--broker-list kafka-0.kafka-headless.public-service.svc.cluster.local:9092,kafka-1.kafka-headless.public-service.svc.cluster.local:9092,kafka-2.kafka-headless.public-service.svc.cluster.local:9092 \
--topic test
# consumer 终端执行以下命令
kubectl exec -ti -n public-service kafka-client -- bash # 进入 Pod
# 启动一个消费者
kafka-console-consumer.sh \
--bootstrap-server kafka.public-service.svc.cluster.local:9092 \
--topic test \
--from-beginning在生产者终端生产数据,随意输入任何字符,如下所示
1
2
3
4
5
6
7
8>add 1
>112
>sdasf
>wasascass
>wadas
>azcxcw
>wacc
>在消费者终端都能看到同样的数据,说明 kafka 集群可用
1
2
3
4
5
6
7add 1
112
sdasf
wasascass
wadas
azcxcw
wacc