需求
使用docker部署kafka broker,同时需要内网和公网同时访问,公司内网通过内网端口访问,外部通过公网端口访问。同时配置kafka通过SASL_PLAINTEXT认证。
同时,已经申请了外网端口19092,映射宿主机的9092端口。
docker-compose配置
yaml
services:
kafka:
image: quay.io/debezium/kafka:${DEBEZIUM_VERSION}
container_name: debezium-kafka
ports:
- 9092:9092
- 9093:9093
- 9094:9094
volumes:
- ./kafka/bin:/kafka/bin
- ./kafka/config:/kafka/config
- ./kafka/data:/kafka/data
environment:
- CLUSTER_ID=oh-sxaDRTcyAr6pFRbXyzA
- NODE_ID=1
- NODE_ROLE=combined
- KAFKA_CONTROLLER_QUORUM_VOTERS=1@172.20.2.15:9093
- KAFKA_LISTENERS=INTERNAL://0.0.0.0:9094,EXTERNAL://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
- KAFKA_ADVERTISED_LISTENERS=INTERNAL://172.20.2.15:9094,EXTERNAL://${ADVERTISED_IP}:19092
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT,CONTROLLER:PLAINTEXT,SSL:SSL,SASL_SSL:SASL_SSL
- KAFKA_SASL_ENABLED_MECHANISMS=PLAIN
- KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
- KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_BROKER_ID=1
- KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND=true
最重要的两个配置为:
- KAFKA_LISTENERS=INTERNAL://0.0.0.0:9094,EXTERNAL://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
- KAFKA_ADVERTISED_LISTENERS=INTERNAL://172.20.2.15:9094,EXTERNAL://${ADVERTISED_IP}:19092
对应kafka server.properties文件中的
bash
listeners=INTERNAL://0.0.0.0:9094,EXTERNAL://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
advertised.listeners=INTERNAL://172.20.2.15:9094,EXTERNAL://6.8.9.3:19092
可以简单理解为,内网通过INTERNAL://172.20.2.15:9094
进行访问,公网通过EXTERNAL://6.8.9.3:19092
进行访问。
但是值得注意的是通过公网访问的EXTERNAL://6.8.9.3:19092
最终被映射到了EXTERNAL://0.0.0.0:9092
,注意端口是不一样的。这一点必须跟上面提到的宿主机的9092端口映射到了公网的19092端口对应起来。
如果这两个端口对应不起来,通过公网访问的时候会出现连不上kafka的问题。