1 实验目的

该实验通过OpenDaylight氢版本搭建负载均衡服务,可均衡网络中的流量传输,加强网络数据处理能力、提高网络的灵活性和可用性。在实验过程中,可以了解以下方面的知识:

  • 负载均衡的使用以及工作原理

  • 负载均衡服务的部署

  • 通过OpenDaylight实现负载均衡

2 实验原理

这个简单的负载均衡应用主要是基于每个输入数据包的源地址和源端口来均衡后端服务的流量。此应用服务相应地安装OpenFlow规则将所有带有特定源地址和源端口的数据包指向给适合的后端服务器中的某一个,服务器可能使用轮询或者随机策略进行选择。该服务可以通过REST APIs,类似OpenStack Quantum的LBaaS(Load balancer as a Service)进行配置。

为了使用负载均衡服务,一个虚拟的IP(VIP)将被扩展在此服务的客户端上,且作为一个目的地址使用。VIP作为包含虚拟IP、端口、协议(TCP或UDP)的一个实体。

如:一个或多个VIP被映射到相同的服务器pool。共享相同pool的所有VIPs也将共享相同的负载均衡策略(随机或轮询)。有且只有一个服务器pool被分配到一个VIP。所有的流规则被安装,且设置了5s的空闲超时。发送到VIP的数据包必须从进入他的交换机中离开OpenFlow集群。当从一个pool中删除一个VIP或服务器pool或服务器时,这个服务将不删除已经安装的流规则。流规则是在5s超时以后自动超时被删除。

3 实验任务

使用两台虚拟机,虚拟机1部署Mininet服务,虚拟机2安装OpenDaylight,在虚拟机1的Mininet环境中模拟创建一个交换机下挂4个主机的网络拓扑,并创建一个虚拟的IP及MAC地址,设置静态表,然后操作iperf或者ping,通过此服务实现负载均衡。
控制器充当负载均衡器,控制客户端进行服务器请求时,由控制器通过轮询策略控制客户端真正访问哪一个服务器。
实验网络拓扑如下:

OpenDaylight实现轮询策略的负载均衡服务_java

4 实验步骤


启动OpenDaylight氢版本控制器,确保samples.loadbalancer & samples.loadbalancer.northbound模块被加载,默认情况下已被加载。

./run.sh

创建Mininet拓扑并连接到ODL控制器。这里创建4个主机、一个交换机。通过下面命令生成:

# mn –arp --topo=single,4 --controller=remote,ip=20.0.4.156,port=6633

OpenDaylight控制器已发现一交换机连接到控制器中:

OpenDaylight实现轮询策略的负载均衡服务_java_02

默认single的拓扑将分配给4个主机IP地址,分别是10.0.0.1/10.0.0.2/10.0.0.3/10.0.0.4。

在Mininet中执行pingall确认主机之间是能够相互连通的,如下图所示。

OpenDaylight实现轮询策略的负载均衡服务_java_03

创建策略是循环负载均衡的负载均衡池


curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://<Controller_IP>:8080/one/nb/v2/lb/default/create/pool -d '{"name":"PoolRR","lbmethod":"roundrobin"}'

OpenDaylight实现轮询策略的负载均衡服务_java_04

创建负载均衡的虚拟IP——VIP

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://127.0.0.1:8080/one/nb/v2/lb/default/create/vip -d '{"name":"VIP-RR","ip":"10.0.0.5","protocol":"TCP","port":"5550","poolname":"PoolRR"}'

OpenDaylight实现轮询策略的负载均衡服务_java_05

上面REST调用的Pool-name数据是可选的。这个案例中创建VIP时,没有pool存在,用户能够使用下面的REST调用来连接pool:

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X PUT

http://127.0.0.1:8080/one/nb/v2/lb/default/update/vip -d '{"name":"VIP-RR","poolname":"PoolRR"}'

OpenDaylight实现轮询策略的负载均衡服务_java_06

添加pool成员到负载均衡池中。主机h1(10.0.0.1)用来作为发送给VIP流量的源客户端。其他主机如h2、h3、h4作为pool成员。

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://127.0.0.1:8080/one/nb/v2/lb/default/create/poolmember -d '{"name":"PM2","ip":"10.0.0.2","poolname":"PoolRR"}'

OpenDaylight实现轮询策略的负载均衡服务_java_07

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://127.0.0.1:8080/one/nb/v2/lb/default/create/poolmember -d '{"name":"PM3","ip":"10.0.0.3","poolname":"PoolRR"}'

OpenDaylight实现轮询策略的负载均衡服务_java_08

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://127.0.0.1:8080/one/nb/v2/lb/default/create/poolmember -d '{"name":"PM4","ip":"10.0.0.4","poolname":"PoolRR"}'

OpenDaylight实现轮询策略的负载均衡服务_java_09

VIP创建后,没有存在在网络中,OpenDaylight控制器将不能解析VIP中的IP地址的ARP。负载均衡应用假设:如果VIP被配置且被用户扩展到内部或外部网络中,被发往VIP的IP地址的数据包将通过外部机制得到可达路由。如此例中,通过添加元客户端主机的ARP表的静态表项,能本地解析VIP的IP地址的ARP。

VIP为负载均衡器选择一个virtual IP (VIP) 和 MAC 地址。这个VIP是客户端需要发起HTTP请求的目的IP地址。控制向交换机下发规则,去重写客户端的目的IP(即VIP),以指定具体访问哪一个网络服务器。为了达到这个目的,需要在客户端主机上为VIP设置一条ARP表项。如果‘h1′ 充当客户端,10.0.0.5是VIP,下面的命令用于在h1上添加静态ARP表项:
如以下步骤所示:
1)在Mininet中通过用xterm打卡h1、h2、h3和h4的终端。
2)在主机h1的arp缓存中为VIP的IP地址添加静态ARP表项:

#arp -s 10.0.0.5 00:00:00:00:00:05

3)分别在其他三个主机h2、h3、h4中,启动iperf服务器,监听端口为5550。

# iperf -s -p 5550

4)在主机h1上,启动iperf客户端,发送流量给VIP的地址:

# iperf -c 10.0.0.5 -p 5550


OpenDaylight实现轮询策略的负载均衡服务_java_10

H1第一次作为客户端执行iperf时,将看到iperf客户端连接在主机h2上正在运行的iperf服务器,如下图所示:

OpenDaylight实现轮询策略的负载均衡服务_java_11

OpenDaylight显示日志信息,发现主机h2:

OpenDaylight实现轮询策略的负载均衡服务_java_12

H1第二次作为客户端执行iperf时,将看到iperf客户端连接在主机h3上正在运行的iperf服务器,如下图所示:

OpenDaylight实现轮询策略的负载均衡服务_java_13

OpenDaylight显示日志信息,发现主机h3:

OpenDaylight实现轮询策略的负载均衡服务_java_14

H1第三次作为客户端执行iperf时,将看到iperf客户端连接在主机h4上正在运行的iperf服务器,如下图所示:

OpenDaylight实现轮询策略的负载均衡服务_java_15

OpenDaylight显示日志信息,发现主机h4:

OpenDaylight实现轮询策略的负载均衡服务_java_16

OpenDaylight实现轮询策略的负载均衡服务_java_17

可以通过下面的命令删除之前创建的循环负载均衡策略。
删除pool成员,删除剩余的pool成员:

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X DELETE http://127.0.0.1:8080/one/nb/v2/lb/default/delete/poolmember/PM2/PoolRR'

删除VIP:

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X DELETE

http://127.0.0.1:8080/one/nb/v2/lb/default/delete/vip/VIP-RR

删除pool:

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X DELETE

http://127.0.0.1:8080/one/nb/v2/lb/default/delete/pool/PoolRR

5 实验结论


一旦先前的iperf测试完成,再次触发iperf客户端时,将连接下一个正在运行iperf服务器的主机。此应用将遵循循环的策略连接到成员pool中下一个正在运行iperf服务器的主机。

同样的,也可以尝试创建 “随机”策略的随机负载均衡池。只要将创建VIP时的“lbmethod”值修改成“random”即可。使用随机策略后,再次触发iperf客户端时,将随机选择一个正在运行iperf服务器的主机。