【发布时间】:2017-07-14 06:29:53
【问题描述】:
几天前,我尝试使用 Docker Compose 和端口映射配置 Kafka Docker 容器,并发现了我不完全理解的有趣行为:
Kafka 代理似乎连接到自身。为什么?
我的设置是:
- Ubuntu 14.04、Docker 1.13.1、Docker-Compose 1.5.2
- Kafka 0.10 监听 9092 端口,该端口被容器暴露。
- 在 Docker Compose 中,我有从容器端口 9092 到本地端口 4005 的端口映射。
- 我在adverted.listeners (
docker-host:4005) 中配置了我的Docker 主机的主机名和本地端口,因为我的公司网络应该可以看到代理。
当我尝试向/从 Kafka 发送/获取数据时,通过此设置,所有尝试都以:
Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}
在尝试了advertised.listeners 中端口和主机名的各种组合后,我发现唯一有效的组合是localhost:9092。任何更改主机名或端口的尝试都会导致上述错误。
这让我觉得 Kafka 尝试连接到 advertised.listeners 中配置的地址,这在某种程度上与主题元数据有关。
所以我在 Docker 容器中做了:
- 将流量重定向到“docker-host”到环回
echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts - 配置 Kafka 监听所有接口和端口(与宣传的完全一样)
sed -r -i "s/#(listeners)=(.*)/\1=PLAINTEXT:\/\/0.0.0.0:4005/g" $KAFKA_HOME/config/server.properties - 宣传“docker-host”和外部端口
sed -r -i "s/#(advertised.listeners)=(.*)/\1=PLAINTEXT:\/\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties
现在它就像一个魅力。
但是我还是不明白:
- 为什么 Kafka 代理可能需要通过
advertised.listeners中配置的地址连接到自身? - 有没有办法禁用此功能或至少将其配置为使用“侦听器”属性中的地址(使用默认 Kafka 端口)?
UPD
值得一提的是,以下设置不起作用:Kafka 侦听 0.0.0.0:9092,广告侦听器配置为 docker-host:4005。
在这种情况下,只要消费者或生产者连接到 kafka,它就会收到 LEADER_NOT_AVAILABLE。
netstat(在容器内)还显示了与处于 SYN_SENT 状态的 docker-host:4005 的连接。
UPD 2
看起来 Kafka 也有类似的问题,但在 AWS 内部描述了 here。
不同之处在于,在我的情况下,我想使用不同的 Kafka 端口。
UPD 3 好的,第一个 UPD 段落中提到的设置不起作用的原因是 - UFW,由于某些原因,它会阻止通过主机从 docker 容器到自身的流量。
【问题讨论】:
标签: docker apache-kafka docker-compose