Docker群覆盖networking不适用于不同主机中的容器

docker群中存在networking问题。 问题在下面;

  • 我们已经通过wmware虚拟化了环境(vsphere 6.02)
  • 我们的服务器是从vmware创build的,比如server1和server2
  • 我们有一个docker撰写文件来定义一些服务
  • 我们在docker-swarm的docker-compose中有一个overlay-network的定义
  • 当我们部署使用docker-swarm部署的系统成功完成时,所有容器都从覆盖networking范围获取ip。
  • 但问题是如果2容器(如cnt1和cnt2)部署到不同的服务器,他们不能ping通对方
  • 我检查tcpdump,看到ARP通信是成功的,所以他们知道对方的Mac正确
  • 但是,当您尝试ping到容器时,ICMP Echo消息被发送,但不会传送到第二台机器。

我应该在哪里检查,有什么build议?

server-1:~$ docker version Client: Version: 17.03.0-ce API version: 1.26 Go version: go1.7.5 Git commit: 3a232c8 Built: Tue Feb 28 08:01:32 2017 OS/Arch: linux/amd64 Server: Version: 17.03.0-ce API version: 1.26 (minimum version 1.12) Go version: go1.7.5 Git commit: 3a232c8 Built: Tue Feb 28 08:01:32 2017 OS/Arch: linux/amd64 Experimental: true 

PS:我查了这个post,但是我有最新版本的docker / docker-swarm,所以这个问题应该修复..

ps-2:类似的问题; https://github.com/docker/swarm/issues/2687

我要检查覆盖networking的第一件事是你的防火墙规则。 您需要在主机之间打开以下内容:

  • swarm端口通常是2377 / tcp,这很可能已经完成了
  • 覆盖控制端口7946 / tcp和7946 / udp
  • 覆盖数据端口4789 / udp
  • IPSEC协议50如果你的覆盖networking被定义为“安全”(这是一个协议,而不是一个端口,所以iptables -A INPUT -p 50 -j ACCEPT

如果这没有帮助,请使用netshoot来debuggingstream量停止的地方。

如果你的节点不在同一个子网上(例如它们都有公有IP地址),那么确保你使用--advertise-addr选项来指定其他节点在该节点(其他pipe理员和工作人员)join群。

否则,即使堆栈部署和节点注册等工作正常,覆盖networking也不会在主机之间正确路由。

在同一个GitHub问题中查看我的案例的详细解释 – > https://github.com/docker/swarm/issues/2687

出于好奇,在VMware环境中,您是否部署了NSX? 我可能会有答案,但只有在环境中部署NSX时才适用。

如果目标端口与为VXLAN VTEP通信configuration的端口相同,ESXi将明显地从VM删除OUTBOUND数据包。

NSX利用端口4789 / udp进行VXLAN的VTEP通信(默认情况下,自6.2.3开始;在此之前为8472 / udp )。 (如果虚拟机在同一个主机上,那么stream量不会丢失,因为虽然它可能是OUTBOUNDstream量,但它不会离开主机,并且不会到VMKernel中的相同阶段被丢弃。

KB2079386的措词有点偏离。 它指出:

VXLAN端口8472被保留或限制为VMware使用,任何虚拟机都不能将此端口用于其他用途或用于任何其他应用程序。

但是,它应该是:

VTEP端口被保留或限制为VMware使用,任何虚拟机都不能将此端口用于其他用途或用于任何其他应用程序。

如果您正在使用NSX,则可以尝试更改用于VXLAN VTEP的端口,但是如果要充分利用硬件VTEP,则需要端口4789 / udp

(我不能完全赞同这一点,我偶然发现这个博客文章谈到类似的问题时,解决类似的问题。