部署说明

  • kafka & zookeeper 集群部署工具: confluentinc

    使用 helm 进行部署,并部署一个外置的 kafka 管理工具。

环境说明

  • 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

image-20210119114824466

转储为 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 .

image-20210118172146561

部署 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

image-20210118173830009

创建 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 无法正常被路由到。

image-20210119103314956

kafka manage 的使用

添加集群

image-20210119103428668

填入 kafka-box-cp-zookeeper.kafka-box-demo.svc.cluster.local k8s 中 完整地址

image-20210119103650670

image-20210119103744482

image-20210119103759271

Done

总结

在 k8s 中使用 confluentinc 部署 kafka 集群还是非常轻便的,但是目前还存在一个问题就是无法在 k8s 集群外部连接部署的 kafka 集群,因为集群使用 k8s 内部网络进行通讯,在外部的客户端无法访问 zookeeper 的地址,就算将 zookeeper 的监听端口改用 hostport 暴露出来,连接 zookeeper 中返回的 kafka 注册地址,也无法正常解析主机名和存在端口无法访问问题。唯一解决方法就是全部组件使用 host 网络模式 进行部署,貌似 confluentinc chart 中未有可配置项。如有深度定制的需求,可以更改 chart 中的渲染逻辑。