上一节我们使用 OVS 构建了单机隔离网络,但是随着网络规模的扩张,单节点已经不再能满足业务的需要,分布式网络成了必不可少的环节。分布式网络与单节点网络在细节实现上基本一致,只有物理环境网络连线上的一点区别。
网络拓扑如下图所示,我们每一台节点都有两张网卡,一张用于管理,一张用于业务。之所以使用两张网卡有两个原因:
Normal类型的Port。这种方式添加的Port不支持分配 IP 地址,如果之前网卡上配置的有 IP,挂载到 OVS 上面之后将不可访问。需要注意的是,如果是使用物理环境搭建网络拓扑,需要把业务网卡对应的交换机端口配置为
trunk模式。如果是使用 VmWare 搭建网络拓扑,业务网卡需要配置网络类型为仅主机模式。

主机 Aovs-vsctl add-br br-int
# 请修改 eth1 为当前实验环境的业务网卡名称
ovs-vsctl add-port br-int eth1
# 添加两个内部端口
ovs-vsctl add-port br-int vnet0 -- set Interface vnet0 type=internal
ovs-vsctl add-port br-int vnet1 -- set Interface vnet1 type=internal
# 添加两个 netns
ip netns add ns0
ip netns add ns1
# 将内部端口分别移动到 netns 中
ip link set vnet0 netns ns0
ip link set vnet1 netns ns1
# 启动端口并配置 IP
ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set vnet0 up
ip netns exec ns0 ip addr add 10.0.0.1/24 dev vnet0
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set vnet1 up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev vnet1
主机 Bovs-vsctl add-br br-int
# 请修改 eth1 为当前实验环境的业务网卡名称
ovs-vsctl add-port br-int eth1
# 添加两个内部端口
ovs-vsctl add-port br-int vnet0 -- set Interface vnet0 type=internal
ovs-vsctl add-port br-int vnet1 -- set Interface vnet1 type=internal
# 添加两个 netns
ip netns add ns0
ip netns add ns1
# 将内部端口分别移动到 netns 中
ip link set vnet0 netns ns0
ip link set vnet1 netns ns1
# 启动端口并配置 IP
ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set vnet0 up
ip netns exec ns0 ip addr add 10.0.0.3/24 dev vnet0
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set vnet1 up
ip netns exec ns1 ip addr add 10.0.0.4/24 dev vnet1
主机 Aip netns exec ns0 ping 10.0.0.3
ip netns exec ns0 ping 10.0.0.4
ip netns exec ns1 ping 10.0.0.3
ip netns exec ns1 ping 10.0.0.4
主机 Bip netns exec ns0 ping 10.0.0.1
ip netns exec ns0 ping 10.0.0.2
ip netns exec ns1 ping 10.0.0.1
ip netns exec ns1 ping 10.0.0.2
| 主机 A | 主机 B | ping 结果 | | --- | --- | --- | | ns0 | ns0 | 可通信 ✅ | | ns0 | ns1 | 可通信 ✅ | | ns1 | ns0 | 可通信 ✅ | | ns1 | ns1 | 可通信 ✅ |
根据测试结果可以看到我们使用 OVS 成功的联通了分布在不同主机上的虚拟网络设备。
构建分布式隔离网络和单节点的操作方法一致,即给对应的端口配置 VLAN tag 。如下图所示,我们分别给主机 A 、B 上的端口配置 VLAN tag 为 100 和 200 。

主机 Aovs-vsctl set Port vnet0 tag=100
ovs-vsctl set Port vnet1 tag=200
主机 Bovs-vsctl set Port vnet0 tag=100
ovs-vsctl set Port vnet1 tag=200
主机 Aip netns exec ns0 ping 10.0.0.3
ip netns exec ns0 ping 10.0.0.4
ip netns exec ns1 ping 10.0.0.3
ip netns exec ns1 ping 10.0.0.4
主机 Bip netns exec ns0 ping 10.0.0.1
ip netns exec ns0 ping 10.0.0.2
ip netns exec ns1 ping 10.0.0.1
ip netns exec ns1 ping 10.0.0.2
| 主机 A | 主机 B | ping 结果 | | --- | --- | --- | | ns0 | ns0 | 可通信 ✅ | | ns0 | ns1 | 不通信 ❌ | | ns1 | ns0 | 不通信 ❌| | ns1 | ns1 | 可通信 ✅ |
根据测试结果可以看到我们使用 OVS 成功的隔离了分布在不同主机上的虚拟网络设备。
本文首发我的微信公众号:我在对面的角落 欢迎关注,接收第一时间更新通知。
