我使用带 macvlan 的 docker,其中每个容器都有自己的 L2 连接,包括 MAC 地址和 IP。我还需要保证容器可以到达主机,反之亦然。目前,我可以使用 netplan 和脚本删除一些路由来实现这一点,但希望您能帮助我了解是否可以使用 netplan 来实现。
我的配置是这样的:
创建 macvlan 接口的批处理脚本(netplan 尚不支持)
#! /bin/bash
#! ip link add macvlan link vlan10 type macvlan mode bridge
使用 netplan 配置创建 vlan10 接口
01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: yes
dhcp6: yes
addresses:
- aaaa:bbbb:cccc:1::11/64
vlans:
vlan10:
id: 10
link: eno1
dhcp4: no
dhcp6: no
addresses:
- 192.168.10.11/24
- aaaa:bbbb:cccc:10::11/64
这确保了为 docker 创建的 VLAN 接口已创建且可用。
20-docker.yaml
network:
version: 2
renderer: networkd
ethernets:
macvlan:
dhcp4: no
dhcp6: no
addresses:
- 192.168.10.5/24
- aaaa:bbbb:cccc:10::5/64
我承认这也许不是设置我所需解决方案的最有效方法,但它有效,并且通过这种方式我避免使用 cron 创建在重启时运行的脚本。
路线部分
现在我已经创建了接口,当它们启动时,会自动创建一组路由,即使我没有定义网关4和网关6指令并定义 netplat 以忽略 DHCP 默认路由。但尽管如此,这些针对 IPv4 和 IPv6 的路由仍会自动创建,从而避免由于 docker 网络驱动程序设计限制而到达 vlan10 网络中的容器。
新接口的 IPv4 路由
192.168.10.0/24 dev vlan10 proto kernel scope link src 192.168.10.11
192.168.10.0/24 dev macvlan proto kernel scope link src 192.168.10.5
192.168.10.0/24 via 192.168.10.5 dev macvlan proto static metric 100
192.168.10.0/24 via 192.168.10.11 dev vlan10 proto static metric 150
新接口的 IPv6 路由
aaaa:bbbb:cccc:10::/64 dev vlan10 proto kernel metric 256 pref medium
aaaa:bbbb:cccc:10::/64 dev macvlan proto kernel metric 256 pref medium
为了使我的解决方案有效,我需要手动删除(或使用启动 bash 脚本)以删除 IPv4 和 IPv6 中设备 vlan10 的上述内核路由。通过执行该任务,我可以恢复主机与容器之间的通信。
有没有办法改进这个解决方案并避免创建这些路由,或者有一个命令来忽略我在特定接口上不需要的特定路由,以保证在 netplan 中使用我的解决方案?
非常感谢您的专业知识和参与。谢谢
** 2021 年 10 月 20 日 - 评论和进一步测试后进行编辑**
经过更多的审查、测试和学习后,我进行了以下更改,这些更改解决了我的问题并允许我的主机接触macvlan
界面内的容器。
01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: yes
dhcp6: yes
addresses:
- aaaa:bbbb:cccc:dddd:192:168:1:11/64
vlans:
vlan10:
id: 10
link: eno1
dhcp4: no
dhcp6: no
addresses:
- 192.168.10.11/32
- aaaa:bbbb:cccc:10::11/128
link-local: []
将 IPv4 和 IPv8 子网掩码分别更改为 /32 和 /128。这已创建正确的规则并使我的主机恢复与我的 docker 容器网络的通信。还包括“link-local: []”以避免此接口创建可能干扰的链接本地 IP。
20-docker.yaml
network:
version: 2
renderer: networkd
ethernets:
macvlan:
dhcp4: no
dhcp6: no
addresses:
- 192.168.10.5/24
- aaaa:bbbb:cccc:10::5/64
通过这种配置,我可以恢复主机和容器之间的通信,针对 IPv4 和 IPv6,并避免使用外部脚本删除路由或在 netplan 中声明特定的指令routes:
。routing-policies:
希望这能帮助遇到类似问题的人。谢谢
答案1
这些路由是自动创建的,因为您已在 netplan yaml 中声明了以下内容:
addresses:
- 192.168.10.11/24
- aaaa:bbbb:cccc:10::11/64
如果您不希望接口上有到这些网络的路由vlan10
,您可以简单地不声明它们。