添加ovs网桥,桥接物理网卡
# 添加网桥
ovs-vsctl add-br br-eth0
# 激活网桥
ip link set br-eth0 up
# 网桥设置IP,这里设置成跟物理网卡IP一致,以保证依赖该IP的服务正常
ip addr add 172.16.10.3/24 dev br-eth0
# 网桥连接物理网卡
ovs-vsctl add-port br-eth0 eth0
# 172.16.10.2是网关
ip route replace default via 172.16.10.2 dev br-eth0
# 清除物理网卡的IP
ip addr del 172.16.10.3 dev eth0
# 注意,在桥接了的节点,添加ovn网桥映射,manager是下面创建的localnet交换机配置的网络名
ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=manager:br-eth0
搭建基础环境,连接物理网络
# 创建逻辑交换机lswitch-localnet(以localnet的方式连接物理网络)
ovn-nbctl ls-add lswitch-localnet
# 添加逻辑交换机端口lsp-localnet,其中network_name值为OVS网桥br-manager在OVN中的映射名称
ovn-nbctl lsp-add lswitch-localnet lsp-localnet
ovn-nbctl lsp-set-type lsp-localnet localnet
ovn-nbctl lsp-set-addresses lsp-localnet unknown
ovn-nbctl lsp-set-options lsp-localnet network_name=manager
# 创建逻辑交换机lswitch0(内部网络)
ovn-nbctl ls-add lswitch0
# 创建并配置逻辑交换机端口lswitch0-port1
ovn-nbctl lsp-add lswitch0 lswitch0-port1
ovn-nbctl lsp-set-addresses lswitch0-port1 "00:00:00:00:00:01 10.0.0.11"
ovn-nbctl lsp-set-port-security lswitch0-port1 "00:00:00:00:00:01 10.0.0.11"
然后创建逻辑路由器,连通交换机lswitch-localnet和lswitch0
# 创建逻辑路由器lrouter(由于NAT需要用到三层网关路由,这里需要指定options:chassis参数,值取自host01节点配置)
ovn-nbctl create Logical_Router name=lrouter options:chassis=0633a3e1-ff16-4922-8738-f007e43d6fa7
# 创建逻辑路由器端口lrouter-port0
ovn-nbctl lrp-add lrouter lrouter-port0 00:00:00:00:ee:01 10.0.0.1/24
# 创建逻辑交换机端口lswitch0-lrouter-port0,并将其与逻辑路由器端口lrouter-port0关联起来
ovn-nbctl lsp-add lswitch0 lswitch0-lrouter-port0 -- set Logical_Switch_Port lswitch0-lrouter-port0 type=router options:router-port=lrouter-port0 addresses='"00:00:00:00:ee:01"'
# 创建逻辑路由器端口lrouter-port1
ovn-nbctl lrp-add lrouter lrouter-port1 00:00:00:00:ee:02 172.16.10.98/24
# 创建逻辑交换机端口 localnet-lrouter-port1,并将其与逻辑路由器端口lrouter-port1关联起来
ovn-nbctl lsp-add lswitch-localnet localnet-lrouter-port1 -- set Logical_Switch_Port localnet-lrouter-port1 type=router options:router-port=lrouter-port1 addresses='"00:00:00:00:ee:02"'
# 添加路由网关
ovn-nbctl lr-route-add lrouter "0.0.0.0/0" 172.16.10.2
创建snat和dnat_and_snat
# 创建snat规则
ovn-nbctl lr-nat-add lrouter snat 172.16.10.98 10.0.0.0/24
# 创建dnat_and_snat规则
ovn-nbctl lr-nat-add lrouter dnat_and_snat 172.16.10.97 10.0.0.11 lswitch0-port1 00:00:00:00:00:01
ovn-nbctl lr-nat-list lrouter
TYPE EXTERNAL_IP LOGICAL_IP EXTERNAL_MAC LOGICAL_PORT
dnat_and_snat 172.16.10.97 10.0.0.11 00:00:00:00:00:01 lswitch0-port1
snat 172.16.10.98 10.0.0.0/24
最后进行测试
# 创建ovs端口,并和之前创建好的ovn逻辑交换机端口建立关联
ovs-vsctl --may-exist add-port br-int lsport1 -- set Interface lsport1 type=internal -- set Interface lsport1 external_ids:iface-id=lswitch0-port1
# 创建命名空间vm1,并设置ovs端口lsport1的IP和MAC信息
ip netns add vm1
ip link set lsport1 netns vm1
ip netns exec vm1 ip link set lsport1 address 00:00:00:00:00:01
ip netns exec vm1 ip addr add 10.0.0.11/24 dev lsport1
ip netns exec vm1 ip link set lsport1 up
ip netns exec vm1 ip addr show
ip netns exec vm1 ip route add default via 10.0.0.1
# 测试snat功能
ip netns exec vm1 ping 172.16.10.2 (可以ping通)
ip netns exec vm1 ping 110.242.68.6(百度IP,可以ping通)
ip netns exec vm1 ping 114.114.114.114(DNS,可以ping通)
# 测试dnat_and_snat功能
ping 172.16.10.97(central ping vm1,可以ping通)
分布式网关端口配置
# 添加多个网关端口,优先级默认为0,也可以手动设置
ovn-nbctl lrp-set-gateway-chassis lrouter-port1 node18
ovn-nbctl lrp-set-gateway-chassis lrouter-port1 node19
ovn-nbctl lrp-set-gateway-chassis lrouter-port1 node20 1
ovn-nbctl lrp-set-gateway-chassis lrouter-port1 node21 2
# 查看
ovn-nbctl show lrouter
router e8e62284-e8b8-49bf-bc34-907700cb2282 (lrouter)
port lrouter-port1
mac: "00:00:00:00:ee:02"
networks: ["172.16.10.98/24"]
gateway chassis: [node18 node19 node20 node21]
# 设置分布式网关端口的另外一种方式:
ovn-nbctl ha-chassis-group-add ha1
ovn-nbctl ha-chassis-group-add-chassis ha1 master 1
ovn-nbctl ha-chassis-group-add-chassis ha1 node1 2
# 465efd10-c0e0-4966-be32-a20b213a2dbc 为 ha1 的uuid,可通过 ovn-nbctl ha-chassis-group-list 查看
ovn-nbctl set Logical_Router_Port lrouter-port1 ha_chassis_group=465efd10-c0e0-4966-be32-a20b213a2dbc
以上部分内容参考:https://zhuanlan.zhihu.com/p/689602069 ,仅记录备忘,如有侵权,请联系我删除。