两块网卡enp2s0和enp3s0,其中enp3s0接路由,并启用了ovs,enp2s0空着也不要启用ovs
用命令ovs-vsctl show显示:
root@fnos:~# ovs-vsctl show
19d20c10-43b1-4509-82d6-bcc1bf2cd08e
Bridge enp3s0-ovs
Port enp3s0
Interface enp3s0 #可以看见只有一块网卡
Port enp3s0-ovs
Interface enp3s0-ovs
type: internal ovs_version: "3.1.0"
可以看到有一个enp3s0-ovs的Bridge网桥,里面绑定了enp3s0 网卡
命令:ovs-vsctl add-port enp3s0-ovs enp2s0
把enp2s0加入enp3s0-ovs,再ovs-vsctl show显示:
root@fnos:~# ovs-vsctl show
19d20c10-43b1-4509-82d6-bcc1bf2cd08e
Bridge enp3s0-ovs
Port enp3s0
Interface enp3s0
Port enp2s0
Interface enp2s0 #可以看见增加的第二块网卡
Port enp3s0-ovs
Interface enp3s0-ovs
type: internal
ovs_version: "3.1.0"
可以看到enp3s0-ovs网桥里绑定了enp3s0 网卡和enp2s0 网卡
ovs-vsctl默认是持久化的,可以验证一下,重启 OVS 服务测试配置是否保留
systemctl restart openvswitch-switch
再ovs-vsctl show,如果显示和上面一样说明已经持久化,不用担心重启会丢失。
这里有个问题,现在由于两块网卡都被ovs占用了,所以docker下做macvlan时不管绑定网卡还是网桥,容器都不能运行,会提示网络设备被占用,要同时保留 OVS 桥接(enp2s0 和 enp3s0 桥接)和启动 macvlan 容器,可以在 OVS 网桥中创建一个虚拟内部端口,用这个虚拟端口作为 macvlan 的父接口(虚拟端口属于 OVS 网桥,不占用物理网卡,可同时兼容 OVS 桥接和 macvlan)
在 OVS 网桥中创建虚拟内部端口:
ovs-vsctl add-port enp3s0-ovs ovs-vport -- set Interface ovs-vport type=internal
启动虚拟端口(确保其状态为 UP):
ip link set ovs-vport up
确认虚拟端口已加入 OVS 网桥且状态正常
root@fnos:~# ovs-vsctl show
19d20c10-43b1-4509-82d6-bcc1bf2cd08e
Bridge enp3s0-ovs
Port enp3s0
Interface enp3s0
Port enp2s0
Interface enp2s0
Port enp3s0-ovs
Interface enp3s0-ovs
type: internal
Port ovs-vport
Interface ovs-vport #可以看见增加的虚拟端口
type: internal
ovs_version: "3.1.0"
重启ovs:systemctl restart openvswitch-switch
确认是否持久:ovs-vsctl show #如果Interface ovs-vport还在就说明已持久
创建基于 ovs-vport 的 macvlan 网络
docker network create -d macvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.2
-o parent=ovs-vport \ # macvlan绑定虚拟端口
macvlan
这样运行需要macvlan网络的容器就没问题了
ovs-vsctl del-port enp3s0-ovs enp2s0 #从enp3s0-ovs中删除enp2s0网卡
ovs-vsctl del-port enp3s0-ovs ovs-vport 从网桥 enp3s0-ovs 中删除 ovs-vport 端口
删除后,物理网卡 enp2s0 可能仍残留 “从属” 状态,可重置其状态:
sudo ip link set enp2s0 down # 关闭接口
sudo ip link set enp2s0 nomaster # 清除可能的从属关系(如脱离 OVS 控制)
sudo ip link set enp2s0 up # 重新启用接口