一、应用场景 目前大部分网关或服务器设备常采用双链路同时接入多条ISP链路的方式来满足网络的负载均衡和主备切换等,实现该功能常用的方法是利用策略路由技术,根据链路的网络状况和权重配置在路由时动态选择不同的链接发送数据,从而实现多路的负载分担。

针对于点到点隧道模式的连接如vxlan,由于其采用四层UDP封装的方式,在端口和IP地址固定的情况下,采用策略路由无法有效的散列到不同链路上。本文描述了在具有双物理链路的设备上,如何在Openvswitch中针对vxlan隧道实现负载均衡策略的实现方法,并搭建测试环境进行方案有效性的验证。 二、实验组网两台设备server1和server2通过交换机相互通信,分别在两台设备上运行Openvswitch,通过建立vxlan隧道对接入的VM1和VM2进行二层跨域组网,其中server1上存在两个物理链路和serve2进行通信,通过本文的负载均衡方案,能够使vxlan隧道报文负载分担到两条物理链路上,组网如下图所示:
 三、实现原理在OVS中建立两个vxlan端口,每个vxlan端口绑定对应的链路出接口,并建立group table,类型设置为select,把两个vxlan端口加入group中的bucket中,通过流表建立其它端口和group的转发关系,通过group对数据流的随机散列,从而实现对物理链路的负载均衡,下图给出了OVS中的网络结构:
 四、实验配置4.1 OVS1配置创建ovs桥 Java
ovs-vsctl add-br br-local
1
| ovs-vsctl add-br br-local
|
设置ovs桥支持的openflow版本 Java
ovs-vsctl set bridge br-local protocols=OpenFlow13
1
| ovs-vsctl set bridge br-local protocols=OpenFlow13
|
把if1接口加入桥端口中,用于VM1接入ovs桥中 Java
ovs-vsctl add-port br-local if1
1
| ovs-vsctl add-port br-local if1
|
创建vxlan0和vxlan1,并分别绑定两个链路接口 Java
ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.147 option:local_ip=172.16.25.129 options:key=100ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.147 option:local_ip=172.16.25.169 options:key=100
1
2
| ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.147 option:local_ip=172.16.25.129 options:key=100
ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.147 option:local_ip=172.16.25.169 options:key=100
|
其中option:local_ip用于绑定对应IP的网络接口,对端地址为server2的IP地址,查看vxlan端口配置:

创建group,并把vxlan1和vxlan2加入group中 Java
ovs-ofctl -O OpenFlow13 add-group br-local group_id=5566,type=select,bucket=output:2,bucket=output:3
1
| ovs-ofctl -O OpenFlow13 add-group br-local group_id=5566,type=select,bucket=output:2,bucket=output:3
|
其中bucket表示加入group的端口号,vxlan1和vxlan2在br-local中的端口号分别为2和3(ovs-ofctl show br-local -O OpenFlow13命令可以查看,也可以在创建vxlan端口时通过ofport_request指定),查看group的配置:

创建入口为if1转发到group的流表 Java
ovs-ofctl -O OpenFlow13 add-flow br-local in_port=1,actions=group:5566
1
| ovs-ofctl -O OpenFlow13 add-flow br-local in_port=1,actions=group:5566
|
创建入口为vxlan的数据转发到if1的流表 Java
ovs-ofctl -O OpenFlow13 add-flow br-local in_port=2,actions=output:1ovs-ofctl -O OpenFlow13 add-flow br-local in_port=3,actions=output:1
1
2
| ovs-ofctl -O OpenFlow13 add-flow br-local in_port=2,actions=output:1
ovs-ofctl -O OpenFlow13 add-flow br-local in_port=3,actions=output:1
|
查看流表配置如下:
 4.2 OVS2配置OVS2中不需要负载均衡,主要是vxlan的配置需要和OVS1中的两条链路对应: Java
ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.129 options:key=100ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.169 options:key=100
1
2
| ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.129 options:key=100
ovs-vsctl add-port br-local vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=172.16.25.169 options:key=100
|
OVS2中采用默认流表,不需要流表配置
 4.2 测试方法首先在VM1上ping对端VM2的地址,查看是否网络可达; 然后通过发包工具从VM1发送报文到VM2,本文采用了龙卷风工具发送UDP报文进行测试,如下图所示,这里把MAC地址、IP地址和端口号采用散列的方式(递增),这样group中才能把数据散列到不同的vxlan端口,如果是固定地址和端口的报文,group会把报文固定送入到其中一个vxlan口,可以看出group是根据地址和端口进行负载分担的。
 五、测试结果通过命令ovs-ofctl dump-ports br-local -O OpenFlow13查看各个端口的报文流量,可以看到端口中的tx报文变化,通过vxlan1和vxlan2端口的流量变化证实了group将不同的流随机散列到了buckets里面的端口中,通过vxlan和接口的绑定关系,从而把不同的流随机散列到了不同的链路上,实现了负载均衡的效果。

|