【发布时间】:2019-12-06 14:14:46
【问题描述】:
我正在尝试将使用 kafka 的 java 服务器应用程序容器化。我观察到了这种行为,
案例一:作为单个容器运行使用桥接网络
在这种情况下,它运作良好。所以没问题。
案例 2:作为单一服务运行使用覆盖网络(Swarm 模式)
在这种情况下,我得到了org.apache.kafka.common.errors.TimeoutException,因为这个不成功的连接,
WARN [2019-12-06T14:05:44,668] RequestSendThread: warn(): [Controller-0-to-broker-0-send-thread]: Controller 0's connection to broker 10.255.3.64:10101 (id: 0 rack: null) was unsuccessful
java.net.SocketTimeoutException: Failed to connect within 30000 ms
at kafka.controller.RequestSendThread.brokerReady(ControllerChannelManager.scala:270) [kafka_2.12-1.0.0.jar:?]
at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:223) [kafka_2.12-1.0.0.jar:?]
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:64) [kafka_2.12-1.0.0.jar:?]
我对kafka了解不多,无法理解overlay网络在桥接网络中运行良好时如何影响kafka进程?
编辑 1:
差不多发现问题了... 在docker swarm模式下,容器有两个ip地址,因为bridge和overlay有两个接口。 ip是endpoint:172.19.0.3, 10.255.3.65。
在尝试连接到容器时(从同一个容器内部),
Bridge I/F : 172.19.0.3 : 10101 - 可以连接。表示telent 172.19.0.3 10101 有效。
Overlay I/F :10.155.3.65 : 10101 - 无法连接到端口,但可以 ping 通。
kafka使用的虚拟ip10.155.3.65制作TimeoutException。
使用覆盖 IP 时无法连接到 localhost 端口(但可以 ping)。为什么会出现这种情况?
【问题讨论】:
-
请显示您的代理和 docker 配置文件。例如,您在某处更改了端口,因为
10101不是 Kafka 或 Zookeeper -
@cricket_007。我认为这不是配置错误。 bcoz 它在具有桥接接口的普通容器内工作。使用
overlay网络接口IP 时出现问题。一种网络环境问题...我已将我的问题更新为 Edit 1... -
1) 测试本地容器并不能证明网络连接正常。 2)您在哪里以及为什么设置端口10101? 3)你读过这个吗? rmoff.net/2018/08/02/kafka-listeners-explained
-
@cricket_007 我相信,你的问题一定有很多原因。在我的场景中,分配的默认覆盖网络不允许通信。
--attachable解决了这个问题。
标签: java networking apache-kafka containers docker-swarm