版本选择
使用 docker-compose 部署 Kafka:3.5。
从 3.3 版本后,Kafka 引入了 KRaft 来替换 ZooKeeper,以是我们不必再部署 zk 了。
单机部署
记得修改 KAFKA_CFG_ADVERTISED_LISTENERS 的 ip 为自己的
- version: "2"
- services:
- kafka:
- container_name: kafka
- image: 'bitnami/kafka:3.5'
- ports:
- - '19092:9092'
- - '19093:9093'
- environment:
- ### 通用配置
- # 允许使用kraft,即Kafka替代Zookeeper
- - KAFKA_ENABLE_KRAFT=yes
- - KAFKA_CFG_NODE_ID=1
- # kafka角色,做broker,也要做controller
- - KAFKA_CFG_PROCESS_ROLES=controller,broker
- # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
- - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
- # 定义安全协议
- - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- # 集群地址
- - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
- # 指定供外部使用的控制类请求信息
- - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- # 设置broker最大内存,和初始内存
- - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
- # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
- - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
- # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
- - ALLOW_PLAINTEXT_LISTENER=yes
- # 不允许自动创建主题
- - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
- # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
- - KAFKA_BROKER_ID=1
复制代码 集群部署
记得修改 KAFKA_CFG_ADVERTISED_LISTENERS 的 ip 地点为自己的
我们之后测试肯定用集群部署,就算是测试,也不用单机模式,单机就是玩具哈 = =
这里部署了 3 个 Broker,即 Kafka1、Kafka2 和 Kafka3
- version: "2"
- services:
- kafka1:
- container_name: kafka1
- image: 'bitnami/kafka:3.5'
- ports:
- - '19092:9092'
- - '19093:9093'
- environment:
- ### 通用配置
- # 允许使用kraft,即Kafka替代Zookeeper
- - KAFKA_ENABLE_KRAFT=yes
- - KAFKA_CFG_NODE_ID=1
- # kafka角色,做broker,也要做controller
- - KAFKA_CFG_PROCESS_ROLES=controller,broker
- # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
- - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
- # 定义安全协议
- - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- # 集群地址
- - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
- # 指定供外部使用的控制类请求信息
- - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- # 设置broker最大内存,和初始内存
- - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
- # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
- - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
- # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
- - ALLOW_PLAINTEXT_LISTENER=yes
- # 不允许自动创建主题
- - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
- # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
- - KAFKA_BROKER_ID=1
- volumes:
- - ./kafka/broker1:/bitnami/kafka:rw
- kafka2:
- container_name: kafka2
- image: 'bitnami/kafka:3.5'
- ports:
- - '29092:9092'
- - '29093:9093'
- environment:
- ### 通用配置
- # 允许使用kraft,即Kafka替代Zookeeper
- - KAFKA_ENABLE_KRAFT=yes
- - KAFKA_CFG_NODE_ID=2
- # kafka角色,做broker,也要做controller
- - KAFKA_CFG_PROCESS_ROLES=controller,broker
- # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
- - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:29092
- # 定义安全协议
- - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- # 集群地址
- - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
- # 指定供外部使用的控制类请求信息
- - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- # 设置broker最大内存,和初始内存
- - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
- # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
- - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
- # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
- - ALLOW_PLAINTEXT_LISTENER=yes
- # 不允许自动创建主题
- - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
- # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
- - KAFKA_BROKER_ID=2
- volumes:
- - ./kafka/broker2:/bitnami/kafka:rw
- kafka3:
- container_name: kafka3
- image: 'bitnami/kafka:3.5'
- ports:
- - '39092:9092'
- - '39093:9093'
- environment:
- ### 通用配置
- # 允许使用kraft,即Kafka替代Zookeeper
- - KAFKA_ENABLE_KRAFT=yes
- - KAFKA_CFG_NODE_ID=3
- # kafka角色,做broker,也要做controller
- - KAFKA_CFG_PROCESS_ROLES=controller,broker
- # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
- - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:39092
- # 定义安全协议
- - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- # 集群地址
- - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
- # 指定供外部使用的控制类请求信息
- - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- # 设置broker最大内存,和初始内存
- - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
- # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
- - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
- # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
- - ALLOW_PLAINTEXT_LISTENER=yes
- # 不允许自动创建主题
- - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
- # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
- - KAFKA_BROKER_ID=3
- volumes:
- - ./kafka/broker3:/bitnami/kafka:rw
复制代码 踩坑 volumes 权限问题
这里把镜像里的路径挂载到宿主机了,但是这里开启的时候会遇到一个权限报错:
- mkdir: cannot create directory '/bitnami/kafka/config': Permission denied
复制代码 第一次开启后,./kafka/… 下的目次都创建好了,此时需要给 1001 用户和组添加权限:
- sudo chown -R 1001:1001 kafka
复制代码 再次启动镜像就没问题了~
这个问题 stackoverflow 和 github issues 都有提及:
[bitnami/kafka] Cannot create directory ‘/bitnami/kafka/config’: Permission denied · Issue #41422 · bitnami/containers (github.com)
kubernetes - mkdir: cannot create directory ‘/bitnami/kafka/config’: Permission denied - Stack Overflow
在 issues 中有如许的回复:
Yes, if the directory from your host is mapped to the container using a volume, the owner of that directory should be the UID 1001
以是我们上面加了权限后,就可以正常运行了。
轻量级 Kafka 可视化工具 —— kafka-console-ui
这里我使用国内大佬开辟的一个管理平台:xxd763795151/kafka-console-ui: 一款快捷易用的轻量级kafka可视化管理平台 (github.com)
依然是使用 docker-compose 部署:
- version: '3'
- services:
- # 服务名
- kafka-console-ui:
- # 容器名
- container_name: "kafka-console-ui"
- # 端口
- ports:
- - "7766:7766"
- # 持久化
- # volumes:
- # - ./data:/app/data
- # - ./log:/app/log
- # 防止读写文件有问题
- privileged: true
- user: root
- # 镜像地址
- image: "wdkang/kafka-console-ui"
- expose:
- - "7766"
复制代码 设置集群
打开管理工具的运维界面kafka-console-ui,我这里部署在了本地
选择集群切换 -> 新增集群,填好设置后,选择切换,就可以管理我们的 kafka 集群了
*注意 & PS
- KAFKA_CFG_ADVERTISED_LISTENERS 外网访问的 ip 地点不能是 0.0.0.0
- KAFKA_BROKER_ID 必须与 KAFKA_CFG_NODE_ID 保持一致
- KAFKA_KRAFT_CLUSTER_ID 可以使用菜鸟工具生成一个 22 位随机字符
- 以上两个部署 kafka 的 yaml 文件中,都设置了 KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false,表示不主动创建 topic,必须手动创建,比如可以通过 kafka-console-ui 的 Topic 页签来操纵:
参考 & 致谢
docker安装kafka(Kraft集群版) - 掘金 (juejin.cn)
kubernetes - mkdir: cannot create directory ‘/bitnami/kafka/config’: Permission denied - Stack Overflow
[bitnami/kafka] Cannot create directory ‘/bitnami/kafka/config’: Permission denied · Issue #41422 · bitnami/containers (github.com)
kafka(kraft模式)3.*集群容器部署 docker-compose - mrdongdong - 博客园 (cnblogs.com)
Docker Hub
kafka-console-ui/document/deploy/docker部署.md at main · xxd763795151/kafka-console-ui (github.com)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |