配置Kafka以接受来自docker内部和外部的客户端

配置Kafka以接受来自docker内部和外部的客户端,docker,apache-kafka,Docker,Apache Kafka,我在docker网络中运行ApacheKafka。卡夫卡经纪人的容器称为docker_Kafka。我想要的是允许来自另一个docker容器以及docker主机的Kafka客户端的连接。docker_kafka的端口9092已映射到docker主机 我一直在尝试KAFKA_监听器和KAFKA_监听器环境变量。例如,当我使用KAFKA\u advised\u LISTENERS=PLAINTEXT://127.0.0.1:9092时,另一个docker KAFKA客户端无法通过PLAINTEXT:/

我在docker网络中运行ApacheKafka。卡夫卡经纪人的容器称为docker_Kafka。我想要的是允许来自另一个docker容器以及docker主机的Kafka客户端的连接。docker_kafka的端口9092已映射到docker主机

我一直在尝试
KAFKA_监听器
KAFKA_监听器
环境变量。例如,当我使用
KAFKA\u advised\u LISTENERS=PLAINTEXT://127.0.0.1:9092
时,另一个docker KAFKA客户端无法通过
PLAINTEXT://docker\u KAFKA:9092
连接到KAFKA,反之亦然。它不允许具有相同端口号和协议的多个地址


是否有一种方法允许两种类型的连接?

可以在Kafka中配置多个侦听器。选项
listener.security.protocol.map
允许在listeners配置中多次使用相同的安全协议

使用环境变量:

1.根据需要定义到尽可能多的侦听器别名的映射:

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER1:PLAINTEXT,LISTENER2:PLAINTEXT
2.然后,使用别名配置侦听器。果然,要使其正常工作,每个侦听器都需要在自己的主机+端口上侦听:

KAFKA_LISTENERS: LISTENER1://0.0.0.0:9092,LISTENER2://0.0.0.0:9093
3.根据播发的侦听器进行配置。例如:

KAFKA_ADVERTISED_LISTENERS: LISTENER1://hostname1:9092,LISTENER2://hostname2:9093
4.最后,为了使集群正常工作,它需要知道节点之间的通信使用哪个侦听器:

KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER1
请注意,只有在广播地址(
0.0.0.0
)上声明侦听器时,我才能使此配置工作。我试图声明侦听器在固定主机名上侦听,但这导致我的配置无法运行(Get
连接被拒绝
错误)。我很高兴能得到解释这一部分的评论

我不是这一想法的作者(也不为此承担责任)。我在这篇博文中找到了这个解决方案:


卡夫卡配置文档:(搜索
listener.security.protocol.map
选项)。

您可以在docker网络上使用DNS完成此操作。使用可以在容器外部解析为主机IP的DNS主机名命名容器。然后在容器内,相同的名称将解析为内部地址。如果我理解正确,您的意思是设置docker DNS和外部DNS。docker DNS解析为docker_kafka,外部DNS解析为我的主机。我认为这应该是可行的,但是这个设置实际上是为开发者设计的,这样每个人都可以在本地启动整个系统。不过,我可以更新主机文件,而不是修改外部DNS。