几天前,我尝试使用Docker Compose和端口映射配置Kafka Docker容器,并发现一些我不太了解的有趣行为:
Kafka经纪人似乎与自己联系。为什么?
我的设置是:
docker-host:4005
)中配置了我的Docker主机和本地端口的主机名,因为我的公司网络应该可以看到代理。 当我尝试向/从Kafka发送/获取数据时设置此设置,所有尝试最终都会:
Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}
在advertised.listeners
中尝试各种端口和主机名组合后,我发现唯一的工作组合是localhost:9092
。任何更改主机名或端口的尝试都会导致上述错误
这让我觉得Kafka尝试连接到advertised.listeners
中配置的地址,这与主题元数据有某种关系。
所以我在Docker容器中做了:
echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts
sed -r -i "s/#(listeners)=(.*)/\1=PLAINTEXT:\/\/0.0.0.0:4005/g" $KAFKA_HOME/config/server.properties
sed -r -i "s/#(advertised.listeners)=(.*)/\1=PLAINTEXT:\/\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties
现在它就像一个魅力。
但我还是不明白:
advertised.listeners
? UPD
值得一提的是,以下设置不起作用:Kafka监听0.0.0.0:9092
,广告监听器配置为docker-host:4005
。
在这种情况下,只要消费者或生产者连接到kafka,它就会收到LEADER_NOT_AVAILABLE。
netstat(在容器内)还显示连接到docker-host:4005处于状态SYN_SENT。
UPD 2 看起来像Kafka有类似的问题,但在AWS内部描述了here 不同的是,在我的情况下,我想使用不同的Kafka端口。
UPD 3 好吧,第一个 UPD 段落中提到的设置不起作用的原因是 - UFW,由于某些原因它阻止了通过主机从docker容器到自身的流量。