ovn load balance功能
本文实验ovn的load balance功能在nbdb数据库中提供了Load_Balancer表用来设置相关参数每行代表一个load balancer。image.pngvips指定vip及其endpoint当load balance被设置到逻辑交换机时vip必须和逻辑交换机在不同的网段。默认情况下使用dp_hash值来选择endpoint也可以通过设置selection_fields自定义计算hash。load balance可以被逻辑交换机和逻辑路由器引用。image.pngimage.png本次实验的逻辑拓扑image.png图中蓝色部分表示在ls1上的vm1和vm2上启动web服务vip为10.10.10.22:8000。在ls2上创建lb规则使ls2上的vm来可以访问此vip提供的服务。首先创建非蓝色部分的组件###创建两个交换机和一个路由器 //创建两个虚拟交换机 ls1 和 ls2 ovn-nbctl ls-add ls1 ovn-nbctl ls-add ls2 //创建一个虚拟路由器 lr1 ovn-nbctl lr-add lr1 //在虚拟路由器 lr1 上添加端口用来连接虚拟交换机 ls1 ovn-nbctl lrp-add lr1 lr1-ls1 00:00:00:00:00:01 10.10.10.1/24 //在虚拟交换机 ls1 上添加端口用来连接虚拟路由器 lr1 ovn-nbctl lsp-add ls1 ls1-lr1 //端口类型必须为 router ovn-nbctl lsp-set-type ls1-lr1 router //设置地址必须和 lr1-ls1 的一致 ovn-nbctl lsp-set-addresses ls1-lr1 00:00:00:00:00:01 //指定 router-port ovn-nbctl lsp-set-options ls1-lr1 router-portlr1-ls1 //在虚拟路由器 lr1 上添加端口用来连接虚拟交换机 ls2 ovn-nbctl lrp-add lr1 lr1-ls2 00:00:00:00:00:02 10.10.20.1/24 //在虚拟交换机 ls2 上添加端口用来连接虚拟路由器 lr1 ovn-nbctl lsp-add ls2 ls2-lr1 //端口类型必须为 router ovn-nbctl lsp-set-type ls2-lr1 router //设置地址必须和 lr1-ls2 的一致 ovn-nbctl lsp-set-addresses ls2-lr1 00:00:00:00:00:02 //指定 router-port ovn-nbctl lsp-set-options ls2-lr1 router-portlr1-ls2 ###在交换机上添加vm接口 //在虚拟交换机 ls1 上添加两个端口指定 mac 和 ip(10.10.10.0/24网段)用来连接vm ovn-nbctl lsp-add ls1 ls1-vm1 ovn-nbctl lsp-set-addresses ls1-vm1 00:00:00:00:00:03 10.10.10.2 ovn-nbctl lsp-set-port-security ls1-vm1 00:00:00:00:00:03 10.10.10.2 ovn-nbctl lsp-add ls1 ls1-vm2 ovn-nbctl lsp-set-addresses ls1-vm2 00:00:00:00:00:04 10.10.10.3 ovn-nbctl lsp-set-port-security ls1-vm2 00:00:00:00:00:04 10.10.10.3 //在虚拟交换机 ls2 上添加两个端口指定 mac 和 ip(10.10.20.0/24网段)用来连接vm ovn-nbctl lsp-add ls2 ls2-vm1 ovn-nbctl lsp-set-addresses ls2-vm1 00:00:00:00:00:03 10.10.20.2 ovn-nbctl lsp-set-port-security ls2-vm1 00:00:00:00:00:03 10.10.20.2 ovn-nbctl lsp-add ls2 ls2-vm2 ovn-nbctl lsp-set-addresses ls2-vm2 00:00:00:00:00:04 10.10.20.3 ovn-nbctl lsp-set-port-security ls2-vm2 00:00:00:00:00:04 10.10.20.3 ###创建四个vm //在 master 节点上创建两个namespace用来模拟两个vm使用 iface-id 指定 //这两个vm属于 ls1 ip netns add vm1 ovs-vsctl add-port br-int vm1 -- set interface vm1 typeinternal ip link set vm1 netns vm1 ip link set vm1 address 00:00:00:00:00:03 ip netns exec vm1 ip addr add 10.10.10.2/24 dev vm1 ip netns exec vm1 ip link set vm1 up ip netns exec vm1 ip route add default via 10.10.10.1 dev vm1 ovs-vsctl set Interface vm1 external_ids:iface-idls1-vm1 ip netns add vm2 ovs-vsctl add-port br-int vm2 -- set interface vm2 typeinternal ip link set vm2 netns vm2 ip link set vm2 address 00:00:00:00:00:04 ip netns exec vm2 ip addr add 10.10.10.3/24 dev vm2 ip netns exec vm2 ip link set vm2 up ip netns exec vm2 ip route add default via 10.10.10.1 dev vm2 ovs-vsctl set Interface vm2 external_ids:iface-idls1-vm2 //在 node1 节点上创建两个namespace用来模拟两个vm使用 iface-id 指定这两个vm属于 ls2 ip netns add vm1 ovs-vsctl add-port br-int vm1 -- set interface vm1 typeinternal ip link set vm1 netns vm1 ip link set vm1 address 00:00:00:00:00:03 ip netns exec vm1 ip addr add 10.10.20.2/24 dev vm1 ip netns exec vm1 ip link set vm1 up ip netns exec vm1 ip route add default via 10.10.20.1 dev vm1 ovs-vsctl set Interface vm1 external_ids:iface-idls2-vm1 ip netns add vm2 ovs-vsctl add-port br-int vm2 -- set interface vm2 typeinternal ip link set vm2 netns vm2 ip link set vm2 address 00:00:00:00:00:04 ip netns exec vm2 ip addr add 10.10.20.3/24 dev vm2 ip netns exec vm2 ip link set vm2 up ip netns exec vm2 ip route add default via 10.10.20.1 dev vm2 ovs-vsctl set Interface vm2 external_ids:iface-idls2-vm2在ls1上的vm1和vm2上分别启动web服务rm /tmp/www -rf mkdir -p /tmp/www echo i am vm1 /tmp/www/index.html cd /tmp/www ip netns exec vm1 python -m SimpleHTTPServer 8000 rm /tmp/www1 -rf mkdir -p /tmp/www1 echo i am vm2 /tmp/www1/index.html cd /tmp/www1 ip netns exec vm2 python -m SimpleHTTPServer 8000创建lb规则并添加到ls2上。ls2网段为10.10.20.0/24vip为不同网段的10.10.10.22ovn-nbctl lb-add lb2 10.10.10.22:8000 10.10.10.2:8000,10.10.10.3:8000 tcp ovn-nbctl ls-lb-add ls2 lb2 rootmaster:~# ovn-nbctl ls-lb-list ls2 UUID LB PROTO VIP IPs 1caa32a5-05ab-47e2-bc84-3e8f1d74bef5 lb2 tcp 10.10.10.22:8000 10.10.10.2:8000,10.10.10.3:8000在ls2上vm中访问此vip提供的服务可看到返回的内容是变化的说明load balance成功。rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm2 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm2可通过修改load balance的selection_fields为ip_src这样只会根据源ip计算这样同一个vm发出的报文只会发给同一个endpointrootmaster:~# ovn-nbctl set load_balancer lb2 selection_fieldsip_src执行多次结果都是一样的内容。rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1 rootnode1:~# ip netns exec vm2 curl 10.10.10.22:8000 i am vm1