Docker-swarm覆盖网络不适用于不同主机中的容器

时间:2017-05-12 08:39:32

标签: networking docker vmware docker-swarm

我们在docker-swarm中遇到了网络问题。问题如下;

  • 我们通过wmware虚拟化环境(vsphere 6.02)
  • 我们的服务器是从vmware创建的,例如server1和server2
  • 我们有一个定义了几个服务的docker compose文件
  • 我们在docker-compose for docker-swarm
  • 中有一个覆盖网络定义
  • 当我们使用docker-swarm部署系统成功完成部署时,所有容器都从覆盖网络范围获取ip。
  • 但问题是如果将2个容器(比如cnt1和cnt2)部署到不同的服务器上,它们就无法互相ping通
  • 我检查tcpdump并看到ARP通信成功,因此他们正确认识对方
  • 但是当您尝试ping到容器时,会发送ICMP Echo消息,但不会将其发送到第二台计算机..

我应该在哪里检查,任何建议?

    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:我检查了this post,但我有最新版本的docker / docker-swarm,所以问题应该解决..

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

4 个答案:

答案 0 :(得分:2)

出于好奇,在您的VMware环境中,您是否部署了NSX?我可能有一个答案,但它只适用于在环境中部署NSX的情况。

如果目标端口与为VXLAN VTEP通信配置的端口相同,则ESXi显然会从VM中删除 OUTBOUND 数据包。

NSX使用端口 4789 / udp 进行VXLAN的VTEP通信(默认情况下,从6.2.3开始;在此之前, 8472 / udp )。 (如果虚拟机位于同一主机上,则流量不会丢弃,因为虽然它可能是 OUTBOUND 流量,但它不会释放主机,也不会到要删除的VMKernel中的同一个阶段。)

KB2079386中的措辞略有不同。它声明:

  

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

但是,它应该是:

  

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

如果您使用的是NSX,则可以try changing the port用于VXLAN VTEP,但如果您要利用硬件, 4789 / udp 端口 VTEPs。

(我无法完全赞同这一点。在对类似问题进行排查时,我偶然发现了this blog post谈论类似的行为。)

答案 1 :(得分:1)

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

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

如果这没有帮助,请考虑使用netshoot来调试流量停止的位置。

答案 2 :(得分:1)

如果您的节点不在同一个子网上(例如,它们都有公共IP) - 那么请确保使用--advertise-addr选项指定其他节点在该节点(其他管理员)可以访问的IP地址和工人)加入群。

否则,覆盖网络将无法在主机之间正确路由,即使堆栈部署&节点注册等似乎工作正常。

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

答案 3 :(得分:0)

“ VTEP端口已保留或限制供VMware使用,任何虚拟机均不能将此端口用于其他目的或任何其他应用程序。”

但是我们可以将docker swarm data-path-port(使用默认端口号4789)更改为另一个:

docker swarm init --data-path-port=7789