【问题标题】:Docker-swarm overlay network is not working for containers in different hostsDocker-swarm 覆盖网络不适用于不同主机中的容器
【发布时间】:2017-10-11 12:03:57
【问题描述】:

我们在 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

ps:我检查了this post,但我有最新版本的 docker / docker-swarm,所以问题应该得到修复..

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

【问题讨论】:

    标签: networking docker vmware docker-swarm


    【解决方案1】:

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

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

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

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

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

    但是,它应该是:

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

    如果您使用 NSX,您可以将 try changing the port 用于 VXLAN VTEP,但如果您要在全部。

    (我不能完全相信这一点。我偶然发现this blog post 在解决类似问题时谈论类似行为。)

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我检查了所有必需的端口,但找不到任何东西.. @bmitch
      • 听起来是时候使用 netshoot 了。
      【解决方案3】:

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

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

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

      【讨论】:

      • 你拯救了我的灵魂。唯一有效的解决方案。谢谢!
      • 我浪费了 5 天的时间来得到您的答复。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        相关资源
        最近更新 更多