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

ygk*_*ygk 10 vmware networking docker docker-swarm

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

  • 我们拥有基于 wmware 的虚拟化环境(vsphere 6.02)
  • 我们的服务器是从 vmware 创建的,例如 server1 和 server2
  • 我们有一个 docker compose 文件定义了几个服务
  • 我们在 docker-compose 中为 docker-swarm 有一个覆盖网络定义
  • 当我们使用 docker-swarm 部署系统成功完成时,所有容器都会从覆盖网络范围获取 IP。
  • 但问题是,如果 2 个容器(例如 cnt1 和 cnt2)部署到不同的服务器,它们将无法互相 ping 通
  • 我检查 tcpdump 并看到 ARP 通信成功,因此他们正确地知道彼此的 mac
  • 但是,当您尝试 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
Run Code Online (Sandbox Code Playgroud)

ps:我检查了这篇文章,但我有最新版本的 docker / docker-swarm,所以问题应该得到解决。

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

小智 17

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

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

docker swarm init --data-path-port=7789
Run Code Online (Sandbox Code Playgroud)

  • 这个答案值得更多的赞成,我花了两天时间思考出了什么问题,这个答案对我有帮助。哎呀 (2认同)

小智 5

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

如果目标端口与为 VXLAN VTEP 通信配置的端口相同,ESXi 显然会丢弃来自虚拟机的OUTBOUND数据包。

NSX 使用端口4789/udp进行 VXLAN 的 VTEP 通信(默认情况下,自 6.2.3 起;在此之前,该端口为8472/udp)。(如果虚拟机位于同一主机上,则流量不会被丢弃,因为虽然它可能是出站流量,但它不会离开主机,也不会到达要丢弃的 VMKernel 内的同一阶段。)

KB2079386中的措辞有点不对劲。它指出:

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

但是,它应该写成:

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

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

(我不能完全相信这一点。我在解决类似问题时偶然发现这篇博客文章讨论了类似的行为。)