版本選擇
使用 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服務(wù)端socket監(jiān)聽端口(Docker內(nèi)部的ip地址和端口)
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 定義外網(wǎng)訪問地址(宿主機ip地址和端口)ip不能是0.0.0.0
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
# 定義安全協(xié)議
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 集群地址
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
# 指定供外部使用的控制類請求信息
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 設(shè)置broker最大內(nèi)存,和初始內(nèi)存
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 使用Kafka時的集群id,集群內(nèi)的Kafka都要用這個id做初始化,生成一個UUID即可(22byte)
- KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
# 允許使用PLAINTEXT監(jiān)聽器,默認false,不建議在生產(chǎn)環(huán)境使用
- ALLOW_PLAINTEXT_LISTENER=yes
# 不允許自動創(chuàng)建主題
- 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服務(wù)端socket監(jiān)聽端口(Docker內(nèi)部的ip地址和端口)
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 定義外網(wǎng)訪問地址(宿主機ip地址和端口)ip不能是0.0.0.0
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
# 定義安全協(xié)議
- 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
# 設(shè)置broker最大內(nèi)存,和初始內(nèi)存
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 使用Kafka時的集群id,集群內(nèi)的Kafka都要用這個id做初始化,生成一個UUID即可(22byte)
- KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
# 允許使用PLAINTEXT監(jiān)聽器,默認false,不建議在生產(chǎn)環(huán)境使用
- ALLOW_PLAINTEXT_LISTENER=yes
# 不允許自動創(chuàng)建主題
- 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服務(wù)端socket監(jiān)聽端口(Docker內(nèi)部的ip地址和端口)
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 定義外網(wǎng)訪問地址(宿主機ip地址和端口)ip不能是0.0.0.0
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:29092
# 定義安全協(xié)議
- 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
# 設(shè)置broker最大內(nèi)存,和初始內(nèi)存
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 使用Kafka時的集群id,集群內(nèi)的Kafka都要用這個id做初始化,生成一個UUID即可(22byte)
- KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
# 允許使用PLAINTEXT監(jiān)聽器,默認false,不建議在生產(chǎn)環(huán)境使用
- ALLOW_PLAINTEXT_LISTENER=yes
# 不允許自動創(chuàng)建主題
- 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服務(wù)端socket監(jiān)聽端口(Docker內(nèi)部的ip地址和端口)
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 定義外網(wǎng)訪問地址(宿主機ip地址和端口)ip不能是0.0.0.0
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:39092
# 定義安全協(xié)議
- 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
# 設(shè)置broker最大內(nèi)存,和初始內(nèi)存
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 使用Kafka時的集群id,集群內(nèi)的Kafka都要用這個id做初始化,生成一個UUID即可(22byte)
- KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
# 允許使用PLAINTEXT監(jiān)聽器,默認false,不建議在生產(chǎn)環(huán)境使用
- ALLOW_PLAINTEXT_LISTENER=yes
# 不允許自動創(chuàng)建主題
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
# broker.id,必須唯一,且與KAFKA_CFG_NODE_ID一致
- KAFKA_BROKER_ID=3
volumes:
- ./kafka/broker3:/bitnami/kafka:rw
踩坑 volumes 權(quán)限問題
這里把鏡像里的路徑掛載到宿主機了,但是這里開啟的時候會遇到一個權(quán)限報錯:
mkdir: cannot create directory '/bitnami/kafka/config': Permission denied
第一次開啟后,./kafka/… 下的目錄都創(chuàng)建好了,此時需要給 1001 用戶和組添加權(quán)限:
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
所以我們上面加了權(quán)限后,就可以正常運行了。
輕量級 Kafka 可視化工具 —— kafka-console-ui
這里我使用國內(nèi)大佬開發(fā)的一個管理平臺:xxd763795151/kafka-console-ui: 一款快捷易用的輕量級kafka可視化管理平臺 (github.com)
依然是使用 docker-compose 部署:
version: '3'
services:
# 服務(wù)名
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
外網(wǎng)訪問的 ip 地址不能是 0.0.0.0 -
KAFKA_BROKER_ID
必須與KAFKA_CFG_NODE_ID
保持一致 -
KAFKA_KRAFT_CLUSTER_ID
可以使用菜鳥工具生成一個 22 位隨機字符 -
以上兩個部署 kafka 的 yaml 文件中,都設(shè)置了
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
,表示不自動創(chuàng)建 topic,必須手動創(chuàng)建,比如可以通過 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文章來源:http://www.zghlxwxcb.cn/news/detail-788848.html
kafka-console-ui/document/deploy/docker部署.md at main · xxd763795151/kafka-console-ui (github.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-788848.html
到了這里,關(guān)于docker-compose部署kafka單機和集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!