部署说明
环境说明
- kubernetes version: v1.17.4
- helm version: v3.3.1
- traefik version: v2.3.6
- docker version: 18.09.6
- k8s strage class: nfs
- kafka dashboard: kafka-manager
集群部署
Helm 应用下载
1
|
git clone https://github.com/confluentinc/cp-helm-charts.git
|
部署镜像转储
将需要的 容器转储为 tar 包
镜像查看脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
cat print-image-list.sh # 匹配出 chart 中需要的容器
#!/bin/bash
for APP_IMAGE_EACH in `cat values.yaml charts/cp-kafka/values.yaml |grep -A 1 image:|awk '{print $2}'`;do
count=$(( $count + 1 ))
if [ $(( $count%2)) -eq 1 ]
then
if [ -z "$LIST" ]
then
LIST="$APP_IMAGE_EACH"
else
LIST="$LIST\n$APP_IMAGE_EACH"
fi
else
LIST="$LIST:$APP_IMAGE_EACH"
fi
done
echo -e "$LIST"
chmod a+x print-image-list.sh
./print-image-list.sh > image-list.txt
|
转储为 tar 包
因 chart 中还包涵了其他组件,有些组件 不是必要开启的
,我们只需 针对性选择部署
即可。
此次 最小化部署
,需要容器列表展示如下所示:
1
2
3
4
5
|
cat image-list.txt
confluentinc/cp-zookeeper:6.0.1
confluentinc/cp-enterprise-kafka:6.0.1
solsson/kafka-prometheus-jmx-exporter@sha256:6f82e2b0464f50da8104acd7363fb9b995001ddff77d248379f8788e78946143
sheepkiller/kafka-manager:latest
|
包涵 kafka manage
容器
1
2
3
4
5
|
pack_List=''
for i in `cat image-list.txt`;do docker pull "$i";pack_List="$pack_List $i";done
docker save $(echo ${pack_List}) | gzip --stdout > confluentinc-Minimal.tar
|
加载 tar包中的容器,并上传至私服
更具 具体情况 替换掉
idocker.io
为你实际使用的 容器私服
。
1
2
3
|
docker load --input confluentinc-Minimal.tar
for i in `cat image-list.txt`;do docker tag "$i" idocker.io/"$i";docker push idocker.io/'$i';done
|
创建 helm 部署文件
打印 默认
的 values.yaml 文件
1
2
3
|
cat cp-helm-charts/values.yaml
helm show values ./cp-helm-charts
|
创建 cp-deploy-helm.yaml
helm 部署文件,将默认进行 配置覆盖
此次演示部署,依赖于一个 strage class
来进行 pv & pvc 的动态管理
如 使用离线部署
,还需要将 镜像地址进行替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
cat > cp-deploy-helm.yaml << EOF
cp-kafka-rest:
enabled: false
cp-kafka-connect:
enabled: false
cp-schema-registry:
enabled: false
cp-ksql-server:
enabled: false
cp-kafka:
replicas: "3"
persistence:
enabled: true
size: "5Gi"
storageClass: "nfs-retain"
cp-zookeeper:
persistence:
enabled: true
dataDirSize: "10Gi"
dataDirStorageClass: "nfs-retain"
dataLogDirSize: "10Gi"
dataLogDirStorageClass: "nfs-retain"
cp-control-center:
enabled: false
EOF
|
创建命名空间, 并执行安装
1
2
3
|
kubectl create ns kafka-box-demo
helm upgrade --install kafka-box -f ./cp-deploy-helm.yaml -n kafka-box-demo .
|
部署 kafka 工具
部署 kafka
管理工具kafka-manage
, 我们这里采用 容器化部署,使用别人制作好的容器即 sheepkiller/kafka-manager
创建资源部署文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
cat > kafka-manage.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-manage
namespace: kafka-box-demo # 同上面的 kafka 集群设置同一个命名空间
spec:
selector:
matchLabels:
app: kafka-manage
template:
metadata:
labels:
app: kafka-manage
spec:
containers:
- env:
- name: APPLICATION_SECRET
value: letmein
- name: ZK_HOSTS
value: kafka-box-cp-zookeeper:2181
image: sheepkiller/kafka-manager
imagePullPolicy: Always
name: kafka-manage
resources:
limits:
memory: "1024Mi"
cpu: "500m"
ports:
- containerPort: 9000
---
apiVersion: v1
kind: Service
metadata:
name: kafka-manage
namespace: kafka-box-demo # 同上面的 kafka 集群设置同一个命名空间
spec:
ports:
- name: http-kafka-manage
port: 9000
protocol: TCP
targetPort: 9000
selector:
app: kafka-manage
EOF
|
部署资源清单
1
2
3
|
kubectl apply -f kafka-manage.yaml
watch kubectl get pod -n kafka-box-demo
|
创建 traefik ingress 资源对象
因默认的 kafka-manage 未做任何加密处理,同样我们使用 traefik 中的 BasicAuth
中间件来配置一层加密。
使用 htpasswd
生成用户及密码
1
2
3
4
|
yum install httpd-tools -y
htpasswd -nb admin ancun123 |base64 # 生成用户密码信息,并转换为 base64
YWRtaW46JGFwcjEkOHJjc2dCdE8kQS5zZnZ2a2JiUWljRlAyaHp2SzhELwoK
|
配置 traefik 资源清单文件
下面资源清单文件中,配置了 \
转义符,直接复制至终端执行即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
cat <<EOF | kubectl apply -f -
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: kafka-manage-auth
namespace: kafka-box-demo
spec:
basicAuth:
secret: authsecret
removeHeader: true
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: stripprefix
namespace: kafka-box-demo
spec:
stripPrefix:
forceSlash: false
prefixes:
- /kafka-manage
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: kafka-manage
namespace: kafka-box-demo
spec:
entryPoints:
- web
routes:
- match: Host(\`kafka.dt.com\`) # 访问 kafka.dt.com 路由到 kafka manage
kind: Rule
services:
- name: kafka-manage # kafka-manage service 名称
port: 9000 # service 的端口,配置端口名称无效
middlewares:
- name: kafka-manage-auth
- name: stripprefix
EOF
|
因此容器内的服务无法,修改 baseurl
, 比如配置添加 PathPrefix
匹配路径,会导致 前端的 css & js
无法正常被路由到。
kafka manage 的使用
添加集群
填入 kafka-box-cp-zookeeper.kafka-box-demo.svc.cluster.local
k8s 中 完整地址
Done
总结
在 k8s 中使用 confluentinc 部署 kafka 集群还是非常轻便的,但是目前还存在一个问题就是无法在 k8s 集群外部连接部署的 kafka 集群,因为集群使用 k8s 内部网络进行通讯,在外部的客户端无法访问 zookeeper 的地址,就算将 zookeeper 的监听端口改用 hostport 暴露出来,连接 zookeeper 中返回的 kafka 注册地址,也无法正常解析主机名和存在端口无法访问问题。唯一解决方法就是全部组件使用 host 网络模式
进行部署,貌似 confluentinc
chart 中未有可配置项。如有深度定制的需求,可以更改 chart 中的渲染逻辑。