我正在尝试对使用 kafka 的Java服务器应用程序进行容器化。我观察到了这种行为,
案例1:作为单个容器运行使用网桥
在这种情况下,效果很好。所以没问题。
案例2:作为一项服务运行时使用覆盖网络(群体模式)
在这种情况下,由于连接失败,我得到了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 不太了解,也无法理解覆盖网络如何影响kafka进程,而在桥接网络中却能很好地发挥作用?
编辑1:
几乎发现了问题...在docker群模式下,由于有两个接口bridge
和overlay
,容器具有两个IP地址。 ip是endpoint:172.19.0.3, 10.255.3.65
。
尝试连接到容器(位于同一容器内部)时,
网桥I / F: 172.19.0.3 : 10101
-可以连接。表示telent 172.19.0.3 10101
有效。
覆盖I / F: 10.155.3.65 : 10101
-无法连接到端口,但可以ping通。
制造10.155.3.65
的kafka使用的虚拟IP TimeoutException
。
使用覆盖IP时无法连接到本地主机端口(但可以ping通)。为什么会发生这种情况?
答案 0 :(得分:0)
答案:
我的坏。我使用了default
覆盖层来解决问题。.https://docs.docker.com/network/overlay/。
创建一个--attachable
自定义覆盖网络解决了此问题。
docker network create -d overlay --attachable my-attachable-overlay