本文实验ovn的load balance功能,在nbdb数据库中提供了Load_Balancer表,用来设置相关参数,每行代表一个load balancer。
image.png
vips指定vip及其endpoint,当load balance被设置到逻辑交换机时,vip必须和逻辑交换机在不同的网段。
默认情况下,使用dp_hash值来选择endpoint,也可以通过设置selection_fields自定义计算hash。
load balance可以被逻辑交换机和逻辑路由器引用。
image.png image.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-port=lr1-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-port=lr1-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 type=internal
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-id=ls1-vm1
ip netns add vm2
ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
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-id=ls1-vm2
//在 node1 节点上,创建两个namespace,用来模拟两个vm,使用 "iface-id" 指定这两个vm属于 ls2
ip netns add vm1
ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal
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-id=ls2-vm1
ip netns add vm2
ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
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-id=ls2-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/24,vip为不同网段的10.10.10.22
ovn-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
root@master:~# 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成功。
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm2
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm2
可通过修改load balance的selection_fields为ip_src,这样只会根据源ip计算,这样同一个vm发出的报文只会发给同一个endpoint
root@master:~# ovn-nbctl set load_balancer lb2 selection_fields=ip_src
执行多次,结果都是一样的内容。
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.22:8000
i am vm1
网友评论