今日天气
  1. 博客/

使用 Confluentinc 在 Kubernetes 集群中部署 Kafka 集群

·1133 字·3 分钟· ·
k8s kafka zookeeper helm
Johny
作者
Johny
熟练的 云原生搬砖师
Table of Contents

部署说明
#

  • 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 应用下载
#

git clone https://github.com/confluentinc/cp-helm-charts.git

部署镜像转储
#

将需要的 容器转储为 tar 包
#

镜像查看脚本

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 中还包涵了其他组件,有些组件 不是必要开启的,我们只需 针对性选择部署 即可。

此次 最小化部署 ,需要容器列表展示如下所示:

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 容器

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 为你实际使用的 容器私服

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 文件

cat cp-helm-charts/values.yaml

helm show values ./cp-helm-charts

创建 cp-deploy-helm.yaml helm 部署文件,将默认进行 配置覆盖

此次演示部署,依赖于一个 strage class 来进行 pv & pvc 的动态管理

使用离线部署,还需要将 镜像地址进行替换

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

创建命名空间, 并执行安装

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

创建资源部署文件
#

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

部署资源清单
#

kubectl apply -f kafka-manage.yaml

watch kubectl get pod -n kafka-box-demo

image-20210118173830009

创建 traefik ingress 资源对象
#

因默认的 kafka-manage 未做任何加密处理,同样我们使用 traefik 中的 BasicAuth 中间件来配置一层加密。

使用 htpasswd 生成用户及密码
#

yum install httpd-tools -y

htpasswd -nb admin ancun123 |base64  # 生成用户密码信息,并转换为 base64
YWRtaW46JGFwcjEkOHJjc2dCdE8kQS5zZnZ2a2JiUWljRlAyaHp2SzhELwoK

配置 traefik 资源清单文件
#

下面资源清单文件中,配置了 \ 转义符,直接复制至终端执行即可

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 中的渲染逻辑。

相关文章

部署 Nginx-Ingress 并配置暴露 kubernetes dashboard
·661 字·2 分钟·
k8s ingress helm dashboard
Rancher 单机部署,进行升级后,导致docker无法正常启动
·586 字·2 分钟·
k8s fix docker rancher
Coredns 出现间断性无法正常解析域名问题
·1536 字·4 分钟·
k8s coredns dns
初探 Traefik ingress gateway
·1594 字·4 分钟·
k8s devops traefik
Kubeadm 部署 kubernetes-v1.19.x 集群
·2153 字·5 分钟·
k8s kubeadm v1.19.x install
kubernetes 集群中 控制平面 组件频繁发生重启的问题排查记录
·688 字·2 分钟·
k8s coredns flannel fix