k8s部署kafka+zookeeper

Posted 想花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s部署kafka+zookeeper相关的知识,希望对你有一定的参考价值。

因为kafka依赖于zk

决定在一个pod中部署这两个容器
先拉取images
docker pull wurstmeister/zookeeper:3.4.13
docker pull wurstmeister/kafka:2.13-2.8.1

关于消费者组知识

  1. 作用:提高消费速度,容错
  2. 原理:消费者组内成员消费的实际是消费topic下的某个分区,例如同一个topic和消费组下,消费者A对应分区0,消费者B对应分区1。这是默认的配置。若A想消费分区1,可以把消费者B宕机。

有坑注意!

  1. 需要挂载zk和kafka的数据到宿主机。否则重启镜像数据就没了!
  2. 配置kafka的文件注意KAFKA_LISTENERSKAFKA_ADVERTISED_LISTENERS如果都配置成为localhost,因为我们是部署到k8s中,外网访问可不能使用localhost,需要指定主机配置:
  - name: KAFKA_ADVERTISED_LISTENERS  #环境变量名称
    value: "PLAINTEXT://node101:30701" #环境变量的值 指向Broker的可用地址列表,这个地方必须和外网配置的连接kafka保持一致
  - name: KAFKA_LISTENERS  #环境变量名称 kafka的broker将监听地址
    value: "PLAINTEXT://0.0.0.0:9092"
 

yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: kafka
  name: ssx-kafka-dm
  namespace: ssx
spec:
  replicas: 1 
  selector: #标签选择器,与上面的标签共同作用
    matchLabels: #选择包含标签app:mysql的资源
       app: kafka
  template: #这是选择或创建的Pod的模板
    metadata: #Pod的元数据
      labels: #Pod的标签,上面的selector即选择包含标签app:mysql的Pod
        app: kafka
    spec: #期望Pod实现的功能(即在pod中部署)
      hostAliases: #给pod添加hosts网络
      - ip: "192.168.0.101"
        hostnames:
        - "node101"
      - ip: "192.168.0.102"
        hostnames:
        - "node102"
      - ip: "192.168.0.103"
        hostnames:
        - "node103"
      containers: #生成container,注意此pod部署了zookeeper和kafka.因为后者依赖前者。逻辑上来说需要有启动顺序,如果kafka启动报错未连接到zk,但是kebernetes会重启kafka容器
      - name: ssx-zookeeper-c
        image: wurstmeister/zookeeper:3.4.13  #配置阿里的镜像,直接pull即可
        ports:
        - containerPort: 2181  # 开启本容器的80端口可访问 对外提供服务client客户端
        - containerPort: 2888  # 开启本容器的80端口可访问 集群内部通讯
        - containerPort: 3888  # 开启本容器的80端口可访问 选举leader
        volumeMounts:
        - mountPath: /opt/zookeeper-3.4.13/conf   #这是mysql容器内保存数据的默认路径
          name: c-v-path-zookeeper-conf
        - mountPath: /opt/zookeeper-3.4.13/data   #这是mysql容器内保存数据的默认路径
          name: c-v-path-zookeeper-data
        - mountPath: /etc/localtime   #时间同步
          name: c-v-path-lt

      - name: ssx-kafka-c
        image: wurstmeister/kafka:2.13-2.8.1  #配置阿里的镜像,直接pull即可
        ports:
        - containerPort: 9092  # 开启本容器的80端口可访问
        env:   #容器运行前需设置的环境变量列表
        - name: KAFKA_BROKER_ID  #环境变量名称
          value: "0" #环境变量的值 这是mysqlroot的密码 因为是纯数字,需要添加双引号 不然编译报错
        - name: KAFKA_ZOOKEEPER_CONNECT  #环境变量名称
          value: "localhost:2181" #环境变量的值 这是mysqlroot的密码 因为是纯数字,需要添加双引号 不然编译报错
        - name: KAFKA_ADVERTISED_LISTENERS  #环境变量名称
          value: "PLAINTEXT://node101:30701" #环境变量的值 这是mysqlroot的密码 因为是纯数字,需要添加双引号 不然编译报错
        - name: KAFKA_LISTENERS  #环境变量名称
          value: "PLAINTEXT://0.0.0.0:9092" #环境变量的值 这是mysqlroot的密码 因为是纯数字,需要添加双引号 不然编译报错
        volumeMounts:
        - mountPath: /kafka  #无用,我先看看那些挂载需要
          name: c-v-path-kafka
        - mountPath: /etc/localtime   #时间同步
          name: c-v-path-lt

      volumes:
      - name: c-v-path-zookeeper-conf #和上面保持一致 这是本地的文件路径,上面是容器内部的路径
        hostPath:
          path: /home/app/apps/k8s/for_docker_volume/kafka/zookeeper/conf  #此路径需要实现创建 注意要给此路径授权777权限 不然pod访问不到
      - name: c-v-path-zookeeper-data  #和上面保持一致 这是本地的文件路径,上面是容器内部的路径
        hostPath:
          path: /home/app/apps/k8s/for_docker_volume/kafka/zookeeper/data  #此路径需要实现创建 注意要给此路径授权777权限 不然pod访问不到
      - name: c-v-path-kafka #和上面保持一致 这是本地的文件路径,上面是容器内部的路径
        hostPath:
          path: /home/app/apps/k8s/for_docker_volume/kafka/kafka  #此路径需要实现创建 注意要给此路径授权777权限 不然pod访问不到
      - name: c-v-path-lt
        hostPath:
          path: /etc/localtime   #时间同步
      nodeSelector: #把此pod部署到指定的node标签上
        kubernetes.io/hostname: node101
---
apiVersion: v1
kind: Service
metadata:
  labels:
   app: kafka
  name: ssx-kafka-sv
  namespace: ssx
spec:
  ports:
  - port: 9000 #我暂时不理解,这个设置 明明没用到?
    name: ssx-kafka-last9000
    protocol: TCP
    targetPort: 2181 # 容器nginx对外开放的端口 上面的dm已经指定了
    nodePort: 30700 #外网访问的端口 k8s集群 nodePort 分配的端口范围为:30000-32767

  - port: 9010 #我暂时不理解,这个设置 明明没用到?
    name: ssx-kafka-last9300
    protocol: TCP
    targetPort: 9092 # 容器nginx对外开放的端口 上面 的dm已经指定了
    nodePort: 30701 #外网访问的端口 k8s集群 nodePort 分配的端口范围为:30000-32767

  selector:
    app: kafka
  type: NodePort 

springboot配置连接信息

spring.kafka.bootstrap-servers=node101:30701

以上是关于k8s部署kafka+zookeeper的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper和Kafka on k8s 部署

Zookeeper和Kafka on k8s 部署

云原生zookeeper + kafka on k8s 环境部署

k8s 使用普通用户部署kafka2.4.0集群思路整理

k8s安装kafka

K8s部署Zookeeper集群