真实的SDN网络需要很多OpenFlow设备包括控制器、交换机、功能虚拟化等一系列设备共同依赖来搭建并应用,但因条件有限,每一位实验者不可能有这样真实的环境来验证或者实验,此处将主要介绍在没有OpenFlow硬件设备下模拟搭建通过Mininet基于不同数据中心的网络拓扑。使用Mininet设计模拟不同网络数据中心拓扑,可以用来分析网络的总流量,而且除此之外,还可以通过负载均衡策略来保证数据中心的可用性。不同数据中心网络拓扑管理设计,主要是基于胖树(Fat-Tree)拓扑创建网络,胖树网络的好处是具有一个多层次的树状拓扑结构固有的容错能力。
掌握多数据中心网络拓扑的构建;
掌握多数据中心数据交换过程。
主机间发送消息上报给交换机,交换机对收到的报文信息进行分析判断,如果交换机中存在此消息相对应的流表,则交换机直接下发流表,将报文消息转发给目的主机;如果交换机中没有相对应的流表,交换机将此发送消息给控制器,控制器根据消息分析关键字段内容,进行流表下发决策,交换机再将消息发送给目的主机,实现主机间通信的目的。
通过SDN创新实验平台创建一个虚拟网络,虚网中包括一台floodlight虚拟机和Mininet虚拟机,使用Mininet设计模拟一个多数据中心网络,主要是用Mininet中的OpenFlow交换机和floodlight控制器进行测试,帮助在真实数据中心和仿真测试床数据中心提供有用的信息评估不同数据中心的网络应用性能。
一个简单的基于两个数据中心的网络拓扑,如下图所示:
图中c1和c2为核心交换机,a1-a4为聚合交换机,e1-e4为边缘交换机,h1-h8为主机。本实验主要测试及验证交换机下挂主机间的连通性以及主机间通信收发数据包的速度。Mininet中自带的iperf性能测试工具可以测试不同主机间通信的性能带宽质量,在此例中,主要是对相同边缘交换机下的主机间、相同聚合交换机下不同边缘交换机间、相同核心交换机不同聚合交换机下的主机间进行测试。
登录Floodlight虚拟机,执行ifconfig命令获取floodlight所在服务器的IP地址。
java -jar target/floodlight.jar
打开浏览器,输入floodlight ui界面地址:http://localhost:8080/ui/index.html。
登录mininet虚拟机,切换到/home/mininet目录,请检查是否存在测试脚本fattree.py,如果有该脚本,请跳过此步骤,如果没有,请执行以下命令创建脚本并添加内容。
本实验通过python脚本自定义拓扑,创建包含两个数据中心的网络拓扑。
cd /home/mininet
touch fattree.py
vim fattree.py
#!/usr/bin/python
#创建网络拓扑
"""Custom topology example
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController,CPULimitedHost
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
"Simple topology example."
def __init__( self ):
"Create custom topo."
# Initialize topology
Topo.__init__( self )
L1 = 2
L2 = L1 * 2
L3 = L2
c = []
a = []
e = []
# add core ovs
for i in range( L1 ):
sw = self.addSwitch( 'c{}'.format( i + 1 ) )
c.append( sw )
# add aggregation ovs
for i in range( L2 ):
sw = self.addSwitch( 'a{}'.format( L1 + i + 1 ) )
a.append( sw )
# add edge ovs
for i in range( L3 ):
sw = self.addSwitch( 'e{}'.format( L1 + L2 + i + 1 ) )
e.append( sw )
# add links between core and aggregation ovs
for i in range( L1 ):
sw1 = c[i]
for sw2 in a[i/2::L1/2]:
# self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
self.addLink( sw2, sw1 )
# add links between aggregation and edge ovs
for i in range( 0, L2, 2 ):
for sw1 in a[i:i+2]:
for sw2 in e[i:i+2]:
self.addLink( sw2, sw1 )
#add hosts and its links with edge ovs
count = 1
for sw1 in e:
for i in range(2):
host = self.addHost( 'h{}'.format( count ) )
self.addLink( sw1, host )
count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }
启动mininet,生成测试拓扑结构:
screen mn --custom /home/mininet/fattree.py --topo mytopo --controller=remote,ip=10.0.0.20,port=6633 --switch ovsk,protocols=OpenFlow10
说明:通过screen mn命令启动mininet,这样可以通过ctrl+a+d和screen –r命令进行系统命令行和mininet命令行之前的窗口切换。
请根据实际情况将ip为floodlight所在服务器的ip,添加protocols参数指定OpenFlow协议版本。
mn为mininet启动命令。
--mac指定虚拟主机的mac地址顺序编号,若不带此参数则随机编号
--controller指定of交换机的控制器
--switch指定虚拟交换机的类型,ovsk表示虚拟交换机为ovs Kernel mode
--custom指定自定义拓扑文件
--topo指定加载拓扑的名字
上述代码拓扑创建了2个核心交换机、4个汇聚交换机、4个边缘交换机,每个边缘交换机分别下挂2个虚拟主机,并给所有的交换机添加了逻辑链路。上述代码中为了提高带宽的利用率、调整流量需求达到均衡的效果,每个核心交换机均与4个汇聚交换机相连,每个汇聚交换机分别下挂两个边缘交换机,与上文相对应的,每个边缘交换机分别连接它所属的父交换机。
4.3.1同一交换机内部的主机间连通性及通信带宽测试
步骤1.在h1和h2之间进行ping操作。
经验证主机间能够ping通。当操作iperf h1 h2 命令时,h1和h2的带宽性能测试结果为:测试TCP带宽发送数据的速率为102 Mbit/s,接收数据的速率为102 Mbit/s。
4.3.2相同汇聚交换机下不同机架的主机间测试
步骤1.在h1和h3之间进行ping操作
经验证,两主机间能够通信。h1和h3的带宽性能测试结果为:测试TCP带宽发送数据的速率为49.9 Mbit/s,接收数据的速率为49.9 Mbit/s。
4.3.3相同核心交换机不同汇聚交换机下的主机间测试
步骤1.h1和h5主机在相同汇聚同核心交换机不同汇聚交换机下,在h1和h5之间进行ping操作
经验证,两主机间能够通信。h1和h5的带宽性能测试结果为:测试TCP带宽发送数据的速率为40.1Mbit/s,接收数据的速率为40.1Mbit/s。
4.3.4所有主机的连通性验证及带宽测试
拓扑创建代码完成后,可以通过应用Mininet的操作命令编写测试脚本实现全自动化测试连通性及带宽性能验证,代码如下。
#在开头补充
from mininet.log import setLogLevel
#测试连通性代码部分
def simpleTest():
"Create and test a simple network"
topo = MyTopo()
net = Mininet( topo, controller=RemoteController, host=CPULimitedHost, link=TCLink )
net.addController( 'c0', controller=RemoteController, ip='10.0.0.20', port=6633 )
net.start()
print "Dumping host connections"
dumpNodeConnections(net.hosts )
print "Testing network connectivity"
net.pingAll()
print "Testing bandwidth between h1 with h2, h3, h5"
h1, h2 = net.get( 'h1', 'h2' )
net.iperf( ( h1, h2 ) )
h1, h3 = net.get( 'h1', 'h3' )
net.iperf( ( h1, h3 ) )
h1, h5 = net.get( 'h1', 'h5' )
net.iperf( ( h1, h5 ) )
net.stop()
if __name__ == '__main__':
# Tellmininet to print useful information
setLogLevel( 'info' )
simpleTest()
步骤1.将该部分内容添加到fattree.py脚本中,并修改如下部分:
请根据实际情况将RemoteController的IP修改为之前获取的floodlight的IP地址。
net.addController( 'c0', controller=RemoteController, ip='10.0.0.20', port=6633 )
说明:
为提高用户实验效率,省去输入代码的时间,在/home/mininet目录下为用户准备了包含创建拓扑和连通性测试两部分内容的测试脚本,名称为fullfattree.py,请用户根据实际情况取用,如使用该脚本,也需要根据实际情况修改脚本中RemoteController的IP。
步骤2.执行以下命令运行测试脚本。
sudo ./fullfattree.py
步骤3.在floodlight web页面中查看网络拓扑信息,请在脚本执行的同时进行查看。
机换机信息如下。
Mininet创建网络拓扑的代码中,可以通过改变代码中定义的L1变量来设置核心交换机的数量,并通过添加额外的交换机和链路来构成更复杂的数据中心网络拓扑。随着边缘交换机的增加,主机个数也随之增长,利用Mininet的易用性和扩展性,可以创建基于多种数据中心场景下的网络拓扑,达到更好更全面的实验效果。