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
关于消费者组知识
- 作用:提高消费速度,容错
- 原理:消费者组内成员消费的实际是消费topic下的某个分区,例如同一个topic和消费组下,消费者A对应分区0,消费者B对应分区1。这是默认的配置。若A想消费分区1,可以把消费者B宕机。
有坑注意!
- 需要挂载zk和kafka的数据到宿主机。否则重启镜像数据就没了!
- 配置kafka的文件注意
KAFKA_LISTENERS
和KAFKA_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的主要内容,如果未能解决你的问题,请参考以下文章