从容器外连接 Kafka 容器
Kafka 是我见过网络配置最麻烦的工具,只能说不愧是 Apache 出品的,当初配置 HBase 也是费了半天劲。
假设是单节点环境,首先展示一下 Kafka 容器的配置
services:
kafka:
image: bitnami/kafka:latest
container_name: kafka
hostname: kafka
ports:
- "9092:9092"
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
这里的 KAFKA_CFG_ADVERTISED_LISTENERS 配置特别重要,表示外界可以通过 localhost:9092 地址来访问该 broker,localhost 是相对容器的,但是容器对 9092 端口进行了映射,也就是相当于宿主网络的 9092 端口,因此正常启动后应该可以看到 9092 端口已经有进程监听。
如果你想操作该 broker,如创建一个 topic,需要另起一个 Kafka 容器,然后设置参数 --network host,这会将容器置于宿主相同的网络内,因此可以允许容器连接到宿主的端口,例如
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
如果有一个 go 程序,你想向 test topic 写入消息,但是你会发现即便设置了端口映射,也无法成功。通过 StackOverflow 上的这篇回答,可以看到需要在设置两个环境变量之后才可以访问,分别是
export KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
export KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
WELCOME TO THE MACHINE

浙公网安备 33010602011771号