我们正在运行一个由 6 个引擎组成的环境,每个引擎有 30 个容器。两个引擎正在使用 nginx 代理运行容器。这两个容器是进入网络的唯一途径。
现在是我们第二次在这个环境中面临一组容器的主要问题:
两个 nginx 容器都无法访问其他机器上的某些容器。只有一个物理引擎有这个问题,其他都很好。一开始是一些机器超时,现在24小时后,那台机器上的所有容器都有问题。
更多细节:
Nginx 在机器 prod-3 上运行。第二个 Nginx 在机器 prod-6 上运行。有问题的容器在 prod-7 上运行。两个 nginx 都无法到达容器,但容器可以通过“ping”到达 nginx。
在开始和今天早上,我们可以到达一些集装箱,其他的不能。它从超时开始,现在我们无法 ping 覆盖网络中的容器。这次我们可以使用 tcpdump 查看流量:
在 nginx 容器(prod-3 上的 10.10.0.37)上,我们开始 ping,如您所见:100% 数据包丢失:
root@e89c16296e76:/# ping ew-engine-evwx-intro
PING ew-engine-evwx-intro (10.10.0.177) 56(84) bytes of data.
--- ew-engine-evwx-intro ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 7056ms
root@e89c16296e76:/#
在目标机器 prod-7(不在容器内)上 - 我们看到所有 ping 包都已收到(因此覆盖网络正确路由到 prod-7):
wurzel@rv_____:~/eventworx-admin$ sudo tcpdump -i ens3 dst port 4789 |grep 10.10.0.177
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.10.0.37.35270 > 10.10.0.177.http: Flags [S], seq 2637350294, win 28200, options [mss 1410,sackOK,TS val 1897214191 ecr 0,nop,wscale 7], length 0
IP 10.10.0.37.35270 > 10.10.0.177.http: Flags [S], seq 2637350294, win 28200, options [mss 1410,sackOK,TS val 1897214441 ecr 0,nop,wscale 7], length 0
IP 10.10.0.37.35326 > 10.10.0.177.http: Flags [S], seq 2595436822, win 28200, options [mss 1410,sackOK,TS val 1897214453 ecr 0,nop,wscale 7], length 0
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 1, length 64
IP 10.10.0.37.35326 > 10.10.0.177.http: Flags [S], seq 2595436822, win 28200, options [mss 1410,sackOK,TS val 1897214703 ecr 0,nop,wscale 7], length 0
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 2, length 64
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 3, length 64
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 4, length 64
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 5, length 64
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 6, length 64
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 7, length 64
IP 10.10.0.37 > 10.10.0.177: ICMP echo request, id 83, seq 8, length 64
^C304 packets captured
309 packets received by filter
0 packets dropped by kernel
wurzel@_______:~/eventworx-admin$
起初 - 你可以看到没有 anwer ICMP(防火墙是不负责任的,也不是 appamor)。
在负责的容器 (evwx-intro = 10.10.0.177) 内没有收到任何东西,接口 eth0 (10.10.0.0) 只是静默:
root@ew-engine-evwx-intro:/home/XXXXX# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
root@ew-engine-evwx-intro:/home/XXXXX#
这真的很奇怪。
来自 docker 的任何其他工具可以帮助我们了解发生了什么?
我们没有对防火墙进行任何更改,也没有自动更新系统(也许是安全性)。
唯一的活动是,一些旧容器在很长一段时间(可能 1-2 个月不活动)后被重新激活。
我们真的很迷茫,如果您经历过类似的事情,那么了解您所采取的步骤将非常有帮助。
非常感谢您对此的任何帮助。
==================================================== ===========
6小时后
经过一整天的几乎所有尝试后,我们做了最后一次尝试:(1)停止所有容器(2)停止 docker 服务(3)停止 docker socket 服务(4)重启机器(5)启动容器
...现在看起来不错。总结:(1)我们不知道是什么导致了问题。这是不好的。(2) 我们知道覆盖网络不是问题,因为流量正在到达容器所在的目标机器 (3) 我们能够跟踪网络流量,直到它到达目标机器。不知何故,它没有“进入”容器。因为在容器内部,网络接口根本没有显示任何活动。
我们对docker使用的vxnet虚拟网络一无所知,所以如果有人有提示,你能帮我们提供一个链接或工具吗?
非常感谢提前。安德烈
==================================================== ==== 4天后...
将 docker-ce 18.06 更新到 18.09 后又出现了同样的情况。
我们有两台机器将 docker-ce 18 与 ubuntu 18.04 结合使用,由于这个问题,我刚刚将 docker-ce 更新到 18.09(Docker 容器不应该在 Ubuntu 18.04 中解析 DNS ...新的已解析服务)。
我停止了所有机器,更新了 docker,重新启动机器,启动了所有机器。
问题:与本文中描述的问题相同。目标主机操作系统接收到 ping,但未转发到容器。
解决方案: 1. 停止所有容器和 docker 2. consul leave, 3. 清理其他机器上 consul keystore 中的所有条目(没有被 leave 删除) 3. 启动 consul 4. 重启所有 enigines 5. 重启 nginx 容器 ... gotcha ,网络正在工作。