在 Azure VM 中配置 docker 网络以便从其他 VM 访问

在 Azure VM 中配置 docker 网络以便从其他 VM 访问

我在解决 Azure 设置中的一些连接问题时遇到了问题。让我们从我的用例开始:

“我希望能够在 Azure 中拥有两个虚拟机,它们位于同一个子网 (10.240.0.0/16) 中,例如 IP 为 10.240.0.4 和 10.240.0.5。IP 为 10.240.0.4 的虚拟机安装了 docker EE,并托管 5 个 docker 容器,它们也位于同一个子网中。例如,第一个容器的 IP 为 10.240.120.1。我现在想从 10.240.120.1 的容器与 10.240.0.5 的虚拟机进行通信”

我已经在本地进行了完全相同的设置。但我在 Azure 中执行此操作时遇到了困难。

到目前为止我得到了什么:现在,我可以从容器与运行它的主机进行通信,反之亦然(例如,从容器 ping 10.240.0.4 有效,从虚拟机 ping 10.240.120.1 有效)。我可以在两个虚拟机之间 ping 通(例如,从 10.240.0.5 ping 10.240.0.4 有效,从 10.240.0.5 ping 10.240.0.4 有效)。但我无法从 10.240.0.5 ping 10.240.120.1 上的容器。

我尝试了不同的网络驱动程序,如透明、l2bridge 和 l2tunnel,但没有成功。

在本地,我使用“透明”网络驱动程序。但是,查看https://docs.microsoft.com/en-US/virtualization/windowscontainers/container-networking/network-drivers-topologies我得到的信息是这在 Azure 中不起作用

由于以下要求,Azure VM 不支持通过透明网络连接容器主机。要求:在虚拟化场景中使用此模式时(容器主机是 VM),需要 MAC 地址欺骗。

现在我被困在以下 l2bridge 网络:

[
{
    "Name": "l2bridge_for_gsim_global",
    "Id": "c5eabf411db8a856b9c0c9d6bc1e3bf09455065a12a981cff067ff9fe8d47c66",
    "Created": "2020-02-24T08:40:50.6804326Z",
    "Scope": "local",
    "Driver": "l2bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "windows",
        "Options": {},
        "Config": [
            {
                "Subnet": "10.240.0.0/16",
                "Gateway": "10.240.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
        "3ed2b2bbcf6fa9de66460f94078a59669effe3bf25530b1bea5970844df9620f": {
            "Name": "DEFAULT-GSim-Global-1",
            "EndpointID": "4e5e6801484dec6c4b7a5a56846924196a1ef77a3e8bea8ebc6d8c39d02910b8",
            "MacAddress": "00:15:5d:e7:f8:11",
            "IPv4Address": "10.240.120.1/16",
            "IPv6Address": ""
        },
        "4a17a5bd8c45e73054c79b3fd199bb43d93e0cb2084bf94c74d656d5550d357d": {
            "Name": "DEFAULT-GSIMSQL-1",
            "EndpointID": "5146fa456e0c3c424322a6451c7a55d10b545ac08110e084359b4e1b1c67c9be",
            "MacAddress": "00:15:5d:e7:fc:5c",
            "IPv4Address": "10.240.100.1/16",
            "IPv6Address": ""
        },
        "b11b11a1c01e92a0731691f8608a04eef325cbbc426ca6ac2cca719080f68fa2": {
            "Name": "DEFAULT-GCORESQL-1",
            "EndpointID": "a74c1af87a7e51a79cb455afa84d8b0c3519588e476b5c749a0fb48f79e09e6b",
            "MacAddress": "00:15:5d:e7:f9:44",
            "IPv4Address": "10.240.140.1/16",
            "IPv6Address": ""
        },
        "bd773562d19c3bc925eb944639ad253b24d8330f0fbaba5aebbd9e008c9bdc56": {
            "Name": "DEFAULT-GCORE-1",
            "EndpointID": "f3af1fb7d50b28f0cfd415a13052faaabdad3cd539c79583ba646da455a20cf3",
            "MacAddress": "00:15:5d:e7:fd:ce",
            "IPv4Address": "10.240.160.1/16",
            "IPv6Address": ""
        }
    },
    "Options": {
        "com.docker.network.windowsshim.enable_outboundnat": "true",
        "com.docker.network.windowsshim.hnsid": "FE7C256E-71EF-468F-9305-E14C8E0D5F3D",
        "com.docker.network.windowsshim.networkname": "l2bridge_for_gsim_global"
    },
    "Labels": {}
}
]

我尝试使用 wireshark 分析该问题。我可以清楚地看到,当我尝试从 docker 容器 ping 10.240.0.5 时,我的主机上会创建一个 ARP 请求和 ICMP 包。但是,它们从未到达 10.240.0.5 处的 VM(也使用 Wireshark 检查过)。因此,我怀疑它们在中间的某个地方被丢弃/阻止了?

主机虚拟机中的 Wireshark

如果有一种方法可以监控通过我的 VNET 的数据包,那就太酷了,因为我可以使用内部路由器/防火墙来实现这一点,以检查它们是否被其他地方的 VM-Host 丢弃。

无论如何,有人知道我该如何进一步调试这个问题,或者如何正确配置docker网络以满足我上面的用例吗?如果需要更多信息,我会很乐意准备。

提前致谢,

芒果狙击手

PS:关于为什么我使用带有 Docker EE 的 VM 而不是 AKS 或 ACI 的更多信息。我使用的是 Windows Docker 容器,而 AKS 不支持带有 Windows 容器的自定义 VNET(因此,我可以稍后更改某些设置的 VNET)。因此这不是一个选择。ACI 不支持其运行的容器的内部 IP,因此每个容器都会获得一个公共 IP。这也不适合我的用例。因此,我最终选择了带有 Docker EE 的 Windows Server 2019 的 Azure VM。

相关内容