docker-compose部署kafka单机和集群

打印 上一主题 下一主题

主题 912|帖子 912|积分 2740

版本选择

使用 docker-compose 部署 Kafka:3.5。
从 3.3 版本后,Kafka 引入了 KRaft 来替换 ZooKeeper,以是我们不必再部署 zk 了。
单机部署

记得修改 KAFKA_CFG_ADVERTISED_LISTENERS 的 ip 为自己的
  1. version: "2"
  2. services:
  3.   kafka:
  4.     container_name: kafka
  5.     image: 'bitnami/kafka:3.5'
  6.     ports:
  7.       - '19092:9092'
  8.       - '19093:9093'
  9.     environment:
  10.       ### 通用配置
  11.       # 允许使用kraft,即Kafka替代Zookeeper
  12.       - KAFKA_ENABLE_KRAFT=yes
  13.       - KAFKA_CFG_NODE_ID=1
  14.       # kafka角色,做broker,也要做controller
  15.       - KAFKA_CFG_PROCESS_ROLES=controller,broker
  16.       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
  17.       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
  18.       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
  19.       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
  20.       # 定义安全协议
  21.       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
  22.       # 集群地址
  23.       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
  24.       # 指定供外部使用的控制类请求信息
  25.       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  26.       # 设置broker最大内存,和初始内存
  27.       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
  28.       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
  29.       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
  30.       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
  31.       - ALLOW_PLAINTEXT_LISTENER=yes
  32.       # 不允许自动创建主题
  33.       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
  34.       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
  35.       - KAFKA_BROKER_ID=1
复制代码
集群部署

记得修改 KAFKA_CFG_ADVERTISED_LISTENERS 的 ip 地点为自己的
我们之后测试肯定用集群部署,就算是测试,也不用单机模式,单机就是玩具哈 = =
这里部署了 3 个 Broker,即 Kafka1、Kafka2 和 Kafka3
  1. version: "2"
  2. services:
  3.   kafka1:
  4.     container_name: kafka1
  5.     image: 'bitnami/kafka:3.5'
  6.     ports:
  7.       - '19092:9092'
  8.       - '19093:9093'
  9.     environment:
  10.       ### 通用配置
  11.       # 允许使用kraft,即Kafka替代Zookeeper
  12.       - KAFKA_ENABLE_KRAFT=yes
  13.       - KAFKA_CFG_NODE_ID=1
  14.       # kafka角色,做broker,也要做controller
  15.       - KAFKA_CFG_PROCESS_ROLES=controller,broker
  16.       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
  17.       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
  18.       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
  19.       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
  20.       # 定义安全协议
  21.       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
  22.       # 集群地址
  23.       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  24.       # 指定供外部使用的控制类请求信息
  25.       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  26.       # 设置broker最大内存,和初始内存
  27.       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
  28.       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
  29.       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
  30.       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
  31.       - ALLOW_PLAINTEXT_LISTENER=yes
  32.       # 不允许自动创建主题
  33.       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
  34.       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
  35.       - KAFKA_BROKER_ID=1
  36.     volumes:
  37.       - ./kafka/broker1:/bitnami/kafka:rw
  38.   kafka2:
  39.     container_name: kafka2
  40.     image: 'bitnami/kafka:3.5'
  41.     ports:
  42.       - '29092:9092'
  43.       - '29093:9093'
  44.     environment:
  45.       ### 通用配置
  46.       # 允许使用kraft,即Kafka替代Zookeeper
  47.       - KAFKA_ENABLE_KRAFT=yes
  48.       - KAFKA_CFG_NODE_ID=2
  49.       # kafka角色,做broker,也要做controller
  50.       - KAFKA_CFG_PROCESS_ROLES=controller,broker
  51.       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
  52.       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
  53.       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
  54.       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:29092
  55.       # 定义安全协议
  56.       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
  57.       # 集群地址
  58.       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  59.       # 指定供外部使用的控制类请求信息
  60.       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  61.       # 设置broker最大内存,和初始内存
  62.       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
  63.       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
  64.       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
  65.       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
  66.       - ALLOW_PLAINTEXT_LISTENER=yes
  67.       # 不允许自动创建主题
  68.       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
  69.       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
  70.       - KAFKA_BROKER_ID=2
  71.     volumes:
  72.       - ./kafka/broker2:/bitnami/kafka:rw
  73.   kafka3:
  74.     container_name: kafka3
  75.     image: 'bitnami/kafka:3.5'
  76.     ports:
  77.       - '39092:9092'
  78.       - '39093:9093'
  79.     environment:
  80.       ### 通用配置
  81.       # 允许使用kraft,即Kafka替代Zookeeper
  82.       - KAFKA_ENABLE_KRAFT=yes
  83.       - KAFKA_CFG_NODE_ID=3
  84.       # kafka角色,做broker,也要做controller
  85.       - KAFKA_CFG_PROCESS_ROLES=controller,broker
  86.       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
  87.       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
  88.       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
  89.       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:39092
  90.       # 定义安全协议
  91.       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
  92.       # 集群地址
  93.       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  94.       # 指定供外部使用的控制类请求信息
  95.       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  96.       # 设置broker最大内存,和初始内存
  97.       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
  98.       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
  99.       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
  100.       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
  101.       - ALLOW_PLAINTEXT_LISTENER=yes
  102.       # 不允许自动创建主题
  103.       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
  104.       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
  105.       - KAFKA_BROKER_ID=3
  106.     volumes:
  107.       - ./kafka/broker3:/bitnami/kafka:rw
复制代码
踩坑 volumes 权限问题

这里把镜像里的路径挂载到宿主机了,但是这里开启的时候会遇到一个权限报错:
  1. mkdir: cannot create directory '/bitnami/kafka/config': Permission denied
复制代码
第一次开启后,./kafka/… 下的目次都创建好了,此时需要给 1001 用户和组添加权限:
  1. 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 部署:
  1. version: '3'
  2. services:
  3.   # 服务名
  4.   kafka-console-ui:
  5.     # 容器名
  6.     container_name: "kafka-console-ui"
  7.     # 端口
  8.     ports:
  9.       - "7766:7766"
  10.     # 持久化
  11.     # volumes:
  12.       # - ./data:/app/data
  13.       # - ./log:/app/log
  14.     # 防止读写文件有问题
  15.     privileged: true
  16.     user: root
  17.     # 镜像地址
  18.     image: "wdkang/kafka-console-ui"
  19.     expose:
  20.       - "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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表