【问题标题】:docker overlay network problems connecting containers连接容器的docker覆盖网络问题
【发布时间】:2018-12-07 17:45:16
【问题描述】:

我们正在运行一个由 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$ 

起初 - 你可以看到没有任何 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) 我们了解到overlay网络不是问题,因为流量正在到达容器所在的目标机器 (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.领事离开, 3.清理其他机器上consul keystore中的所有条目(没有被leave删除) 3.启动领事 4.重启所有引擎 5. 重启 nginx 容器 ... 明白了,网络现在可以工作了。

【问题讨论】:

  • 在尝试了几乎一整天之后,我们做了最后一次尝试:(1)停止所有容器(2)停止 docker 服务(3)停止 docker socket 服务(4)重启机器(5 ) 启动容器...现在看起来不错。
  • 这看起来像是 vxlan 配置中的一些损坏。我不会第一次看到这种情况。如果您可以重现它,那么使用 libnetwork 打开的问题将是获得帮助的更好地方。
  • 刚刚将docker-ce 18.06更新到18.09后又出现了同样的情况。
  • 不知何故我也遇到了类似的问题。在 3 个树莓派 4、1 个经理、2 个工人的堆栈上使用 docker swarm。多个服务通过标签约束分布(每个 swarm 节点都被标记为主机名)。问题是从 php 服务(管理节点 1)到达 mysql 服务(在工作节点 2 上)。容器响应 ping 和 nslookup 命令,但它似乎是端口 EXPOSE 问题,但我无法弄清楚。 (使用 Ubuntu 20.04 焦点和 Docker 19.03.13 API 1.40)。该解决方案一直有效,直到几天前我更新了所有主机包。

标签: docker networking tcp docker-swarm virtual-network


【解决方案1】:

同样的问题再次袭击了我们。 我们有 7 台服务器(每个都运行 docker,如上所述),两个 nginx 入口点。

看起来,领事密钥存储中的一些错误是导致 docker 网络显示奇怪行为(如上所述)的真正问题。

在我们的配置中,所有 7 个服务器都有自己的本地 consul 实例,与其他服务器同步。对于网络设置,每个 docker 服务都在其本地领事密钥存储中进行查找。

上周我们注意到,在网络可达性问题的同时,领事客户也报告了同步问题(领导选举问题、重复等)。

最终的解决方案是停止 docker 引擎和 consul 客户端。删除某些服务器上的 consul 数据库,再次将其加入其他服务器。启动 docker 引擎。

看起来 consul 服务是网络配置的关键部分...

进行中...

【讨论】:

    【解决方案2】:

    我遇到了覆盖网络 Docker Swarm 设置的确切问题。 我发现这不是操作系统或 Docker 问题。受影响的服务器正在使用 Intel NIC X 系列。其他带 I 系列网卡的服务器工作正常。 您使用本地服务器吗?或者任何云提供商? 我们使用 OVH,它可能是由某些数据中心网络配置错误引起的。

    【讨论】:

    • 回答中不能有问题,这就是cmets的作用。
    • 不幸的是,我们不知道我们的供应商使用的是什么硬件。我们目前正在开发一个测试环境。让我们看看...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2018-08-10
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多