Kafka docker 容器化部署
Kafka標(biāo)準(zhǔn)軟件基于Bitnami Kafka 構(gòu)建。當(dāng)前版本為3.6.1
你可以通過輕云UC部署工具直接安裝部署,也可以手動按如下文檔操作,該項(xiàng)目已經(jīng)全面開源,可以從如下環(huán)境獲取
配置文件地址: https://gitee.com/qingplus/qingcloud-platform
簡介
Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)(消息引擎系統(tǒng))甚侣,它是最初由Linkedin公司開發(fā),是一個分布式间学、支持分區(qū)的(partition)殷费、多副本的(replica)印荔,它的最大的特性就是可以實(shí)時的處理大量數(shù)據(jù)以滿足各種需求場景:比如基于hadoop的批處理系統(tǒng)、低延遲的實(shí)時系統(tǒng)详羡、Storm/Spark流式處理引擎仍律,web/nginx日志、訪問日志实柠,消息服務(wù)等等染苛,用scala語言編寫,Linkedin于2010年貢獻(xiàn)給了Apache基金會并成為頂級開源項(xiàng)目主到。
配置
可以使用以下環(huán)境變量通過 Apache Kafka Docker 設(shè)置配置:
- KAFKA_CERTIFICATE_PASSWORD:證書的密碼茶行。沒有默認(rèn)值。
- KAFKA_HEAP_OPTS:Apache Kafka 的 Java 堆大小登钥。默認(rèn)值:-Xmx1024m -Xms1024m畔师。
- KAFKA_ZOOKEEPER_PROTOCOL:Zookeeper 連接的身份驗(yàn)證協(xié)議。允許的協(xié)議:PLAINTEXT牧牢、SASL看锉、SSL和SASL_SSL。默認(rèn)值:純文本塔鳍。
- KAFKA_ZOOKEEPER_USER:用于 SASL 身份驗(yàn)證的 Apache Kafka Zookeeper 用戶伯铣。沒有默認(rèn)值。
- KAFKA_ZOOKEEPER_PASSWORD:用于 SASL 身份驗(yàn)證的 Apache Kafka Zookeeper 用戶密碼轮纫。沒有默認(rèn)值腔寡。
- KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD:Apache Kafka Zookeeper密鑰庫文件密碼和密鑰密碼。沒有默認(rèn)值掌唾。
- KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD:Apache Kafka Zookeeper 信任庫文件密碼放前。沒有默認(rèn)值。
- KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME:驗(yàn)證 TLS 證書上的 Zookeeper 主機(jī)名糯彬。默認(rèn)值:true凭语。
- KAFKA_ZOOKEEPER_TLS_TYPE:選擇要使用的 TLS 證書格式。允許值:JKS, PEM. 默認(rèn)值:JKS撩扒。
- KAFKA_CFG_LISTENERS:Kafkalisteners配置覆蓋似扔。沒有默認(rèn)值。
- KAFKA_CFG_ADVERTISED_LISTENERS:Kafkaadvertised.listeners配置覆蓋搓谆。沒有默認(rèn)值炒辉。
- KAFKA_CFG_SASL_ENABLED_MECHANISMS:將 SASL 用于客戶端、代理間或 Zookeeper 通信時允許的機(jī)制挽拔。允許的值:PLAIN辆脸、SCRAM-SHA-256或SCRAM-SHA-512這些值的逗號分隔組合但校。默認(rèn)值:PLAIN螃诅、SCRAM-SHA-256、SCRAM-SHA-512。注意:KRaft <= 3.4 尚不支持 SCRAM 機(jī)制术裸,因此此列表將自動縮減為僅PLAINSASL 機(jī)制倘是。
- KAFKA_TLS_CLIENT_AUTH:設(shè)置 的值ssl.client.auth。允許值:required, requested, none. 默認(rèn)值:必填袭艺。
- KAFKA_TLS_<uppercase_listener_name>_CLIENT_AUTHlistener.name.<listener>.ssl.client.auth:設(shè)置用于通過 SASL 配置 mTLS的值搀崭。允許值:required, requested, none.
- KAFKA_TLS_TYPE:選擇要使用的 TLS 證書格式。允許值:JKS, PEM. 默認(rèn)值:JKS猾编。
- KAFKA_CLIENT_USERS:使用 SASL 進(jìn)行客戶端通信時將在 Zookeeper 中創(chuàng)建的用戶瘤睹。被逗號隔開。默認(rèn):用戶
- KAFKA_CLIENT_PASSWORDS:在 處指定的用戶的密碼KAFKA_CLIENT_USERS答倡。被逗號隔開轰传。默認(rèn)值:bitnami
- KAFKA_CFG_MAX_PARTITION_FETCH_BYTES:服務(wù)器將返回的每個分區(qū)的最大數(shù)據(jù)量。沒有默認(rèn)值瘪撇。
- KAFKA_CFG_MAX_REQUEST_SIZE:請求的最大大谢癫纭(以字節(jié)為單位)。沒有默認(rèn)值倔既。
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL:用于代理間通信的 SASL 機(jī)制恕曲。沒有默認(rèn)值。注意:KRaft <= 3.4 尚不支持 SCRAM 機(jī)制渤涌,因此 KRaft 模式下唯一支持的 SASL 機(jī)制是PLAIN.
- KAFKA_INTER_BROKER_USER:Apache Kafka 代理間通信用戶佩谣。默認(rèn)值:用戶。
- KAFKA_INTER_BROKER_PASSWORD:Apache Kafka 代理間通信密碼实蓬。默認(rèn)值:bitnami稿存。
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:用于控制器通信的 SASL 機(jī)制。沒有默認(rèn)值瞳秽。注意:KRaft <= 3.4 尚不支持 SCRAM 機(jī)制瓣履,因此 KRaft 模式下唯一支持的 SASL 機(jī)制是PLAIN.
- KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用戶。默認(rèn)值:controller_user练俐。
- KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密碼袖迎。默認(rèn)值:bitnami。
- KAFKA_CFG_PROCESS_ROLES:KRaft 模式下運(yùn)行時的節(jié)點(diǎn)角色腺晾。沒有默認(rèn)值燕锥。
- KAFKA_CFG_NODE_ID:唯一的節(jié)點(diǎn)id,在KRaft模式下運(yùn)行時需要悯蝉。沒有默認(rèn)值归形。
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:使用 Apache Kafka 安全協(xié)議映射每個偵聽器。如果節(jié)點(diǎn)設(shè)置了controller角色鼻由,則需要此設(shè)置才能為CONTROLLER LISTENER. 例如:PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT暇榴。沒有默認(rèn)值厚棵。
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS:以逗號分隔的 {id}@{host}:{port} 條目列表中的控制器仲裁投票者集的 id/端點(diǎn)信息映射。沒有默認(rèn)值蔼紧。
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES:控制器使用的偵聽器名稱的逗號分隔列表婆硬。如果在 KRaft 模式下運(yùn)行,這是必需的奸例。沒有默認(rèn)值彬犯。
- KAFKA_KRAFT_CLUSTER_ID:使用Kafka Raft(KRaft)時的Kafka集群ID。沒有默認(rèn)值查吊。
此外谐区,任何以KAFKA_CFG_開頭的環(huán)境變量都將映射到其相應(yīng)的 Apache Kafka 鍵。例如逻卖,使用KAFKA_CFG_BACKGROUND_THREADS設(shè)置background.threads或KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE配置auto.create.topics.enable卢佣。
docker run --name kafka
-e KAFKA_CFG_PROCESS_ROLES ...
-e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
或者通過修改docker-compose.yml:
kafka:
...
environment:
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
...
Apache Kafka 開發(fā)設(shè)置示例
要在開發(fā)設(shè)置中使用 Apache Kafka,請創(chuàng)建以下docker-compose.yml文件:
version: "3"
services:
kafka:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest'
ports:
- '9092:9092'
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
要部署它箭阶,請在文件所在目錄中運(yùn)行以下命令docker-compose.yml:
docker-compose up -d
kafka 與zookeeper配置
Apache Kafka Raft (KRaft) 在 Kafka 中使用了新的仲裁控制器服務(wù)虚茶,該服務(wù)取代了之前的控制器,并使用了 Raft 共識協(xié)議的基于事件的變體仇参。這極大地簡化了 Kafka 的架構(gòu)嘹叫,將元數(shù)據(jù)整合到 Kafka 本身,而不是將其拆分到兩個不同的系統(tǒng):ZooKeeper 和 Kafka诈乒。
如果您想繼續(xù)使用ZooKeeper罩扇,可以使用以下配置:
version: "3.9"
services:
zookeeper:
image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:3.9
ports:
- "2181:2181"
volumes:
- "zookeeper_data:/bitnami"
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:3.6.1
ports:
- "9092:9092"
volumes:
- "kafka_data:/bitnami"
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
depends_on:
- zookeeper
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
使用內(nèi)部和外部客戶端訪問 Apache Kafka
為了使用內(nèi)部和外部客戶端訪問 Apache Kafka 代理,您需要為每個客戶端配置一個偵聽器怕磨。
為此喂饥,請將以下環(huán)境變量添加到 docker-compose 中:
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@<your_host>:9093
+ - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
+ - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
+ - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
并暴露外部端口:
內(nèi)部客戶端仍然可以在docker網(wǎng)絡(luò)內(nèi)使用
ports:
- - '9092:9092'
+ - '9094:9094'
注意:要從外部進(jìn)行連接,請將localhost上面的內(nèi)容更改為主機(jī)的外網(wǎng)IP/主機(jī)名并包含EXTERNAL://0.0.0.0:9093在內(nèi)KAFKA_CFG_LISTENERS以允許遠(yuǎn)程連接肠鲫。
使用外部客戶端的生產(chǎn)者和消費(fèi)者
這些來自同一主機(jī)的客戶端將用于localhost連接到 Apache Kafka员帮。
kafka-console-producer.sh --producer.config /opt/bitnami/kafka/config/producer.properties --bootstrap-server 127.0.0.1:9094 --topic test
kafka-console-consumer.sh --consumer.config /opt/bitnami/kafka/config/consumer.properties --bootstrap-server 127.0.0.1:9094 --topic test --from-beginning
如果從另一臺計算機(jī)運(yùn)行這些命令,請相應(yīng)地更改地址导饲。
使用內(nèi)部客戶端的生產(chǎn)者和消費(fèi)者
這些來自同一 Docker 網(wǎng)絡(luò)上其他容器的客戶端將使用 kafka 容器服務(wù)主機(jī)名連接到 Apache Kafka捞高。
kafka-console-producer.sh --producer.config /opt/bitnami/kafka/config/producer.properties --bootstrap-server kafka:9092 --topic test
kafka-console-consumer.sh --consumer.config /opt/bitnami/kafka/config/consumer.properties --bootstrap-server kafka:9092 --topic test --from-beginning
同樣,應(yīng)用程序代碼需要使用bootstrap.servers=kafka:9092
安全
為了配置身份驗(yàn)證渣锦,您必須正確配置 Apache Kafka 偵聽器硝岗。讓我們看一個示例,為 Apache Kafka 配置SASL_SSL與客戶端通信的身份驗(yàn)證以及SASL與控制器相關(guān)的通信的身份驗(yàn)證袋毙。
定義以下環(huán)境變量型檀,以及用于客戶端通信的 SASL 憑據(jù):
KAFKA_CFG_LISTENERS=SASL_SSL://:9092,CONTROLLER://:9093
KAFKA_CFG_ADVERTISED_LISTENERS=SASL_SSL://localhost:9092
KAFKA_CLIENT_USERS=user
KAFKA_CLIENT_PASSWORDS=password
KAFKA_CLIENT_LISTENER_NAME=SASL_SSL
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
KAFKA_CONTROLLER_USER=controller_user
KAFKA_CONTROLLER_PASSWORD=controller_password
必須使用自己的 SSL 證書。您可以將 Java 密鑰存儲或 PEM 文件放入/opt/bitnami/kafka/config/certs. 如果 JKS 或 PEM 證書受密碼保護(hù)(推薦)听盖,您將需要提供它才能訪問密鑰庫:
KAFKA_CERTIFICATE_PASSWORD=myCertificatePassword
如果相關(guān)證書安裝在/opt/bitnami/kafka/config/certs/kafka.truststore.jks胀溺、/opt/bitnami/kafka/config/certs/kafka.truststore.pem裂七,/bitnami/kafka/config/certs/kafka.truststore.jks,/bitnami/kafka/config/certs/kafka.truststore.pem月幌,請設(shè)置該KAFKA_TLS_TRUSTSTORE_FILE變量碍讯。
以下腳本可以幫助您創(chuàng)建 JKS 和證書:
請記住以下注意事項(xiàng):
當(dāng)提示輸入密碼時悬蔽,請為所有節(jié)點(diǎn)使用相同的密碼扯躺。
- 將 Common Name 或 FQDN 值設(shè)置Apache Kafka 容器主機(jī)名,例如kafka.example.com蝎困。輸入此值后录语,當(dāng)提示“您的名字和姓氏是什么?”時禾乘,也輸入此值澎埠。
- 作為替代方案,您可以禁用主機(jī)名驗(yàn)證始藕,將環(huán)境變量設(shè)置KAFKA_CFG_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM為空字符串蒲稳。
- 設(shè)置 Apache Kafka 集群時(請查看“設(shè)置 Apache Kafka 集群”以獲取更多信息),每個 Apache Kafka 代理和邏輯客戶端都需要自己的密鑰庫伍派。您必須對集群中的每個代理重復(fù)該過程江耀。
- 以下 docker-compose 文件是一個示例,顯示如何掛載受密碼保護(hù)的 JKS 證書certificatePassword123诉植。此外祥国,它還指定 Apache Kafka 容器主機(jī)名以及客戶端和 Zookeeper 用戶的憑據(jù)。
version: '2'
services:
kafka:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest'
hostname: kafka.example.com
ports:
- '9092'
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_LISTENERS=SASL_SSL://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
- KAFKA_CFG_ADVERTISED_LISTENERS=SASL_SSL://:9092
- KAFKA_CLIENT_USERS=user
- KAFKA_CLIENT_PASSWORDS=password
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
- KAFKA_CONTROLLER_USER=controller_user
- KAFKA_CONTROLLER_PASSWORD=controller_password
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=SASL_SSL
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
- KAFKA_INTER_BROKER_USER=controller_user
- KAFKA_INTER_BROKER_PASSWORD=controller_password
- KAFKA_CERTIFICATE_PASSWORD=certificatePassword123
- KAFKA_TLS_TYPE=JKS # or PEM
volumes:
# Both .jks and .pem files are supported
# - './kafka.keystore.pem:/opt/bitnami/kafka/config/certs/kafka.keystore.pem:ro'
# - './kafka.keystore.key:/opt/bitnami/kafka/config/certs/kafka.keystore.key:ro'
# - './kafka.truststore.pem:/opt/bitnami/kafka/config/certs/kafka.truststore.pem:ro'
- './kafka.keystore.jks:/opt/bitnami/kafka/config/certs/kafka.keystore.jks:ro'
- './kafka.truststore.jks:/opt/bitnami/kafka/config/certs/kafka.truststore.jks:ro'
為了獲得使用和生成消息所需的憑據(jù)晾腔,您需要在客戶端中提供憑據(jù)舌稀。如果您的 Apache Kafka 客戶端允許,請使用您提供的憑據(jù)灼擂。
在使用bitnami/kafka image生成和使用消息時壁查,您需要指向consumer.properties和/或producer.properties文件,其中包含工作所需的配置剔应。您可以在該目錄中找到該文件/opt/bitnami/kafka/config潮罪。
生成消息:
kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 --topic test --producer.config /opt/bitnami/kafka/config/producer.properties
消費(fèi)消息:
kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --consumer.config /opt/bitnami/kafka/config/consumer.properties
使用其他工具來使用 Apache Kafka 集群,則需要提供所需的信息领斥。您可以在位于目錄的文件中找到所需的信息/opt/bitnami/kafka/config嫉到。
Inter-Broker 通信
當(dāng)部署具有多個代理的 Apache Kafka 集群時,可以使用以下變量SASL配置代理間通信:SASL_SSL
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL:Apache Kafka 代理間通信協(xié)議月洛。
- KAFKA_INTER_BROKER_USER:Apache Kafka 代理間通信用戶何恶。
- KAFKA_INTER_BROKER_PASSWORD:Apache Kafka 代理間通信密碼。
注意:在 KRaft 模式下運(yùn)行時嚼黔,KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL 僅支持PLAINKafka 版本 <= 3.4 中的機(jī)制细层。
Control plane通信
在 KRaft 模式下部署具有多個控制器的 Apache Kafka 集群時惜辑,可以使用以下變量SASL配置控制器通信:SASL_SSL
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:Apache Kafka 控制器通信協(xié)議。
- KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用戶疫赎。目前僅PLAIN支持機(jī)制盛撑。
- KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密碼。
注意:在KRaft模式下運(yùn)行時捧搞,KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL僅支持PLAIN機(jī)制抵卫。
Apache Kafka SASL 配置
配置 Apache Kafka 偵聽器SASL或SASL_SSL與客戶端通信時,您可以使用以下環(huán)境變量提供 SASL 憑據(jù):
- KAFKA_CLIENT_USERS:Apache Kafka 客戶端用戶胎撇。默認(rèn):user
- KAFKA_CLIENT_PASSWORDS:Apache Kafka 客戶端用戶密碼介粘。默認(rèn)值:bitnami
注意:在 KRaft 模式下運(yùn)行時,只有第一個user:password對才會生效晚树,因?yàn)?KRaft 模式尚不支持 SCRAM 機(jī)制姻采。
Apache Kafka KRaft 模式配置
可以通過提供以下值來啟用 KRaft 模式:
KAFKA_CFG_PROCESS_ROLES:以逗號分隔的 Kafka KRaft 角色列表。允許值:‘controller,broker’, ‘controller’, ’broker‘.
KAFKA_CFG_NODE_ID:Kafka節(jié)點(diǎn)的唯一id爵憎。
KAFKA_CFG_LISTENERS:Kafka 監(jiān)聽器列表慨亲。如果節(jié)點(diǎn)設(shè)置了角色包含controller,則必須包含CONTROLLER監(jiān)聽器宝鼓。
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:使用 Apache Kafka 安全協(xié)議映射每個偵聽器刑棵。如果節(jié)點(diǎn)設(shè)置了controller角色,則需要此設(shè)置環(huán)境變量. 例如:PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT席函。
為了在沒有身份驗(yàn)證的情況下配置控制器通信铐望,應(yīng)該提供以下環(huán)境變量:
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 應(yīng)包括CONTROLLER:PLAINTEXT.
為了配置 Apache Kafka 控制器通信帶SASL,應(yīng)該提供以下環(huán)境變量:
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 應(yīng)包括CONTROLLER:SASL.
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:用于控制器通信的 SASL 機(jī)制茂附。注意:KRaft 模式尚不支持 SCRAM 機(jī)制正蛙,因此 KRaft 模式中唯一支持的 SASL 機(jī)制是PLAIN.
- KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用戶。
- KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密碼营曼。
為了配置 Apache Kafka 控制器通信帶SSL乒验,應(yīng)該提供以下環(huán)境變量:
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 應(yīng)包括CONTROLLER:SSL.
KAFKA_TLS_<uppercase_controller_listener_name>_CLIENT_AUTH:配置 kafka 控制平面通信的 mTLS 身份驗(yàn)證方法。允許值:required, requested, none.
KAFKA_TLS_TYPE:選擇要使用的 TLS 證書格式蒂阱。允許值:JKS, PEM. 默認(rèn)值:JKS锻全。
有效的密鑰庫和信任庫安裝在/opt/bitnami/kafka/config/certs/kafka.keystore.jks和 處/opt/bitnami/kafka/config/certs/kafka.truststore.jks。為了使用 Zookeeper 服務(wù)器對 Apache Kafka 進(jìn)行身份驗(yàn)證SASL_SSL录煤,應(yīng)該提供以下環(huán)境變量:
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 應(yīng)包括CONTROLLER:SASL_SSL.
KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:用于控制器通信的 SASL 機(jī)制鳄厌。注意:KRaft 模式尚不支持 SCRAM 機(jī)制,因此 KRaft 模式中唯一支持的 SASL 機(jī)制是PLAIN.
KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用戶妈踊。
KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密碼了嚎。
KAFKA_TLS_<uppercase_controller_listener_name>_CLIENT_AUTH:配置 kafka 控制平面通信的 mTLS 身份驗(yàn)證方法。允許值:required, requested, none.
KAFKA_TLS_TYPE:選擇要使用的 TLS 證書格式。允許值:JKS, PEM. 默認(rèn)值:JKS歪泳。
有效的密鑰庫和信任庫安裝在/opt/bitnami/kafka/config/certs/kafka.keystore.jks和 處/opt/bitnami/kafka/config/certs/kafka.truststore.jks萝勤。
SSL注意:SSL 設(shè)置由使用或協(xié)議配置的所有偵聽器共享SASL_SSL。尚不支持為每個偵聽器設(shè)置不同的證書呐伞。
Apache Kafka ZooKeeper 模式配置
可以通過提供以下值來啟用 Zookeeper 模式:
- KAFKA_CFG_ZOOKEEPER_CONNECT:以逗號分隔的 Zookeeper 連接字符串列表敌卓。例如<zk_host1>:<zk_port1>,<zk_host2>:<zk_port2>
- KAFKA_CFG_BROKER_ID:Kafka Broker 的可選ID。如果不設(shè)置伶氢,將自動生成一個隨機(jī)ID趟径。
連接 Zookeeper 服務(wù)器有不同的配置選項(xiàng)。
為了無需身份驗(yàn)證即可連接 Zookeeper 服務(wù)器鞍历,您應(yīng)該提供以下環(huán)境變量:
- KAFKA_ZOOKEEPER_PROTOCOL:純文本舵抹。
為了使用 Zookeeper 服務(wù)器對 Apache Kafka 進(jìn)行身份驗(yàn)證SASL肪虎,您應(yīng)該提供以下環(huán)境變量:
- KAFKA_ZOOKEEPER_PROTOCOL:SASL劣砍。
- KAFKA_ZOOKEEPER_USER:用于 SASL 身份驗(yàn)證的 Apache Kafka Zookeeper 用戶。沒有默認(rèn)值扇救。
- KAFKA_ZOOKEEPER_PASSWORD:用于 SASL 身份驗(yàn)證的 Apache Kafka Zookeeper 用戶密碼刑枝。沒有默認(rèn)值。
為了使用 Zookeeper 服務(wù)器對 Apache Kafka 進(jìn)行身份驗(yàn)證SSL迅腔,您應(yīng)該提供以下環(huán)境變量:
- KAFKA_ZOOKEEPER_PROTOCOL:SSL装畅。
- KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD:Apache Kafka Zookeeper密鑰庫文件密碼和密鑰密碼。沒有默認(rèn)值沧烈。
- KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD:Apache Kafka Zookeeper 信任庫文件密碼掠兄。沒有默認(rèn)值。
- KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME:驗(yàn)證 TLS 證書上的 Zookeeper 主機(jī)名锌雀。默認(rèn)值:true蚂夕。
- KAFKA_ZOOKEEPER_TLS_TYPE:選擇要使用的 TLS 證書格式。允許值:JKS, PEM. 默認(rèn)值:JKS腋逆。
為了使用 Zookeeper 服務(wù)器對 Apache Kafka 進(jìn)行身份驗(yàn)證SASL_SSL婿牍,您應(yīng)該提供以下環(huán)境變量:
- KAFKA_ZOOKEEPER_PROTOCOL:SASL_SSL。
- KAFKA_ZOOKEEPER_USER:用于 SASL 身份驗(yàn)證的 Apache Kafka Zookeeper 用戶惩歉。沒有默認(rèn)值等脂。
- KAFKA_ZOOKEEPER_PASSWORD:用于 SASL 身份驗(yàn)證的 Apache Kafka Zookeeper 用戶密碼。沒有默認(rèn)值撑蚌。
- KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_FILE:Apache Kafka Zookeeper 信任庫文件位置上遥。如果安裝位置不同于/bitnami/kafka/conf/certs/zookeeper.truststore.pem、/bitnami/kafka/conf/certs/zookeeper.truststore.jks或無默認(rèn)值争涌,請設(shè)置/opt/bitnami/kafka/config/certs/zookeeper.truststore.jks它粉楚。/opt/bitnami/kafka/conf/certs/zookeeper.truststore.pem
- KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD:Apache Kafka Zookeeper密鑰庫文件密碼和密鑰密碼。沒有默認(rèn)值第煮。
- KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD:Apache Kafka Zookeeper 信任庫文件密碼解幼。沒有默認(rèn)值抑党。
- KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME:驗(yàn)證 TLS 證書上的 Zookeeper 主機(jī)名。默認(rèn)值:true撵摆。
- KAFKA_ZOOKEEPER_TLS_TYPE:選擇要使用的 TLS 證書格式底靠。允許值:JKS, PEM. 默認(rèn)值:JKS。
注意:您還必須使用自己的 SSL 證書特铝。您可以將 Java 密鑰庫(zookeeper.keystore.jks和)或zookeeper.truststore.jksPEM 文件(zookeeper.keystore.pem和)安裝到zookeeper.keystore.key. 如果客戶端身份驗(yàn)證是在Zookeeper 中暑中,則證書文件是可選的。zookeeper.truststore.pem/opt/bitnami/kafka/conf/certsnonewant
設(shè)置 Apache Kafka 集群
可以使用以下環(huán)境變量通過設(shè)置 Apache Kafka 集群:
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS:逗號分隔的host:port對鲫剿,每個對應(yīng)一個 Kafka 控制器連接鳄逾。
步驟 1:為 Apache Kafka 創(chuàng)建第一個節(jié)點(diǎn)
第一步是創(chuàng)建一個 Apache Kafka 實(shí)例。
docker run --name kafka-0 \
--network app-tier \
-e KAFKA_CFG_NODE_ID=0 \
-e KAFKA_CFG_PROCESS_ROLES=controller,broker \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-e KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3 \
-e KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2 \
-e KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv \
-p :9092 \
-p :9093 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
步驟 2:創(chuàng)建第二個節(jié)點(diǎn)
接下來我們啟動一個新的 Apache Kafka 容器灵莲。
docker run --name kafka-1 \
--network app-tier \
-e KAFKA_CFG_NODE_ID=1 \
-e KAFKA_CFG_PROCESS_ROLES=controller,broker \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-e KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3 \
-e KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2 \
-e KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv \
-p :9092 \
-p :9093 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
步驟3:創(chuàng)建第三個節(jié)點(diǎn)
接下來我們啟動另一個新的 Apache Kafka 容器雕凹。
docker run --name kafka-3 \
--network app-tier \
-e KAFKA_CFG_NODE_ID=3 \
-e KAFKA_CFG_PROCESS_ROLES=controller,broker \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-e KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3 \
-e KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2 \
-e KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv \
-p :9092 \
-p :9093 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
一個 Apache Kafka 集群配置完成≌常可以通過添加/刪除從屬服務(wù)器來擴(kuò)展集群枚抵,而不會導(dǎo)致任何停機(jī)。
可以在文件中找到此部署的 docker-compose 版本docker-compose-cluster.yml明场。
示例:創(chuàng)建一個 replicated topic
可以使用以下命令創(chuàng)建:
root@kafka-0:/# /opt/bitnami/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic mytopic --partitions 3 --replication-factor 3
Created topic "mytopic".
root@kafka-0:/# /opt/bitnami/kafka/bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic mytopic
Topic:mytopic PartitionCount:3 ReplicationFactor:3 Configs:
Topic: mytopic Partition: 0 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: mytopic Partition: 1 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Topic: mytopic Partition: 2 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
All配置
該鏡像中所有配置可以在/bitnami/kafka/config/中查找汽摹,可以通過設(shè)置 KAFKA_MOUNTED_CONF_DIR 環(huán)境變量來更改該位置。
docker run --name kafka -v /path/to/server.properties:/bitnami/kafka/config/server.properties registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
之后苦锨,更改將被同步到容器中逼泣。
第 1 步:運(yùn)行 Apache Kafka 映像
運(yùn)行 Apache Kafka 映像,從主機(jī)安裝目錄舟舒。
修改docker-compose.yml文件:
...
services:
kafka:
...
volumes:
- 'kafka_data:/bitnami'
+ - /path/to/server.properties:/bitnami/kafka/config/server.properties
第 2 步:編輯配置
使用您喜歡的編輯器編輯主機(jī)上的配置拉庶。
vi /path/to/server.properties
第3步:重啟Apache Kafka
更改配置后,重新啟動 Apache Kafka 容器以使更改生效魏蔗。
docker restart kafka
或者使用 Docker Compose:
docker-compose restart kafka
日志
容器日志發(fā)送到stdout. 要查看日志:
docker logs kafka
或者使用 Docker Compose:
docker-compose logs kafka
維護(hù)
備份您的容器
要備份數(shù)據(jù)砍的、配置和日志,請按照以下簡單步驟操作:
第 1 步:停止當(dāng)前正在運(yùn)行的容器
docker stop kafka
或者使用 Docker Compose:
docker-compose stop kafka
步驟2:運(yùn)行備份命令
我們需要在用于創(chuàng)建備份的容器中安裝兩個卷:主機(jī)上用于存儲備份的目錄莺治,以及我們剛剛停止的容器中的卷廓鞠,以便我們可以訪問數(shù)據(jù)。
docker run --rm -v /path/to/kafka-backups:/backups --volumes-from kafka busybox \
cp -a /bitnami/kafka /backups/latest
或者使用 Docker Compose:
docker run --rm -v /path/to/kafka-backups:/backups --volumes-from `docker-compose ps -q kafka` busybox \
cp -a /bitnami/kafka /backups/latest
恢復(fù)備份
恢復(fù)備份就像將備份作為卷安裝在容器中一樣簡單谣旁。
docker run -v /path/to/kafka-backups/latest:/bitnami/kafka registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
修改docker-compose.yml文件:
kafka:
volumes:
- /path/to/kafka-backups/latest:/bitnami/kafka
從 Zookeeper 模式遷移到 KRaft 模式
本節(jié)介紹 Kafka 從 Zookeeper 模式到 KRaft 模式的遷移床佳。
1.從 Zookeeper 獲取cluster ID
2.配置controller節(jié)點(diǎn),添加以下環(huán)境變量
KAFKA_CFG_PROCESS_ROLES=controller
KAFKA_CFG_NODE_ID=<unique_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
KAFKA_CFG_LISTENERS=CONTROLLER://:9093
KAFKA_CFG_ZOOKEEPER_METADATA_MIGRATION_ENABLE=true
KAFKA_CFG_ZOOKEEPER_CONNECT=<zk_host>:<zk_port>
KAFKA_KRAFT_CLUSTER_ID=<cluster_id_step1>
3.使用遷移設(shè)置配置代理:
KAFKA_CFG_BROKER_ID=<current_broker_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
KAFKA_CFG_INTER_BROKER_PROTOCOL_VERSION=3.4
KAFKA_CFG_ZOOKEEPER_METADATA_MIGRATION_ENABLE=true
KAFKA_CFG_ZOOKEEPER_CONNECT=<zk_host>:<zk_port>
4.遷移代理:
KAFKA_CFG_PROCESS_ROLES=broker
KAFKA_CFG_NODE_ID=<unique_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
5.禁用控制器上的遷移模式:
KAFKA_CFG_PROCESS_ROLES=controller
KAFKA_CFG_NODE_ID=<unique_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
KAFKA_CFG_LISTENERS=CONTROLLER://:9093
KAFKA_KRAFT_CLUSTER_ID=<cluster_id_step1>