一、应用场景
目前大部分网关或服务器设备常采用双链路同时接入多条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桥
1
|
ovs
-
vsctl
add
-
br
br
-
local
|
设置ovs桥支持的openflow版本
1
|
ovs
-
vsctl
set
bridge
br
-
local
protocols
=
OpenFlow13
|
把if1接口加入桥端口中,用于VM1接入ovs桥中
1
|
ovs
-
vsctl
add
-
port
br
-
local
if1
|
创建vxlan0和vxlan1,并分别绑定两个链路接口
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中
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的流表
1
|
ovs
-
ofctl
-
O
OpenFlow13
add
-
flow
br
-
local
in_port
=
1
,
actions
=
group
:
5566
|
创建入口为vxlan的数据转发到if1的流表
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中的两条链路对应:
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
|
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和接口的绑定关系,从而把不同的流随机散列到了不同的链路上,实现了负载均衡的效果。