macvlan-网络设备无法从容器内与外部主机进行通信

macvlan-网络设备无法从容器内与外部主机进行通信

我正在尝试建立一组 Docker 或 LXC 容器,每个容器都有自己的可路由 IP 地址。包含主机实际上是在 RedHat Enterprise Virtualization 中运行的虚拟机,RedHat Enterprise Virtualization 是 oVirt 的重新命名且非常旧的版本。在我们的数据中心中,我们使用标记的 VLAN,并且在 RHEV 中,可以通过不同的“LAN 配置文件”选择这些 VLAN。我希望将容器全部放在与主机容器相同的 VLAN/配置文件中。我希望让每个容器都有一个虚拟LAN设备,有自己的MAC。

包含的 VM 具有接口 eth0。依照指示本指南(“使用 macvalan 设备”),我在桥接模式下创建了一个 macvlan 并将其分配给容器。出于我们的目的,我们将说10.12.0.117/21是容器应具有的可路由地址,并且10.12.7.254是其网关。

# docker run -d --name test centos7
# dockpid=$(docker inspect --format '{{ .State.Pid }}' test)
# ip link add eth0p0 link eth0 type macvlan mode bridge
# ip link set netns $dockpid eth0p0
# nsenter -t $dockpid -n ip link del eth0
# nsenter -t $dockpid -n ip addr add 10.12.0.117/21 dev eth0p0
# nsenter -t $dockpid -n ip route add default via 10.12.7.254 dev eth0p0

无法 ping 通。事实上,使用tcpdumponeth0arping从网络上的另一个节点,我可以看到 arp 请求到达容器,并且我可以看到容器响应(及其随机生成的 MAC),但这些 ARP 响应似乎并没有返回到另一台主机(如 TCP/IP 所示)。

我还尝试使用 lxc,以简单的方式创建界面:

# ip link add link eth0 eth4 type macvlan

如果我给它一个 IP 地址并启动设备,则该 IP 在 LAN 上可 ping 通。但当我配置容器时却没有:

lxc.network.type = phys
lxc.network.flags = up
lxc.network.link = eth4

然后手动配置IP和路由。现在它与 docker 一样无法 ping 通。

相比之下,如果我使用 RHEV-M 创建具有相同配置文件的附加网络接口,将其附加到 VM,然后在 VM 内将此新接口 ( eth2) 分配给容器的命名空间,则一切正常。所以我猜测这与 RHEV 和从内部转发 ARP 请求有关。

顺便说一句:我没有 RHEVM 虚拟机管理程序的 root 权限。 (但我可以礼貌地询问是否可以得到。)

有一个明显的解决方案吗?有人有故障排除提示吗?我缺少什么?

相关内容