本文将介绍如何利用网络虚拟化平台OpenVirteX(以下简写为OVX)来创建、配置和启动虚拟网络,做一个简单的网络拓扑实验。这将帮助我们进一步理解OVX的主要概念。实验环境的搭建请参考《带你走进OpenVirteX之环境搭建》,其中,MongoDB的安装是可选的。如果想使用OVX的持久化功能,建议安装,而在本次实验中并没有启动MongoDB。
实验环境准备就绪后,请跟我一起做一个简单的实验吧。
1 启动Mininet并创建网络拓扑
在基于标准的NDDI拓扑的网络中,一共有11个城市,每个城市有1个核心交换机,每个交换机上有4台主机与之相连。表1中列出了不同城市的物理DPID(即物理交换机的DPID)。其中DPID的最后6个字节表示主机的MAC地址,MAC地址的最后一个字节表示主机编号。根据表1中城市SFO的物理DPID,那么该城市第三台主机的MAC地址应是00:00:00:00:02:03。
表1 各城市物理DPID
在该拓扑中连接在每个核心交换机上的主机IP地址分配为10.0.0.1到10.0.0.4,端口为1到4,其他端口一般用于城市间交换机互联,具体连接情况如图1所示。
图1 网络拓扑结构
图1中,横线上的数字表示物理交换机端口号。例如城市EWR交换机6号端口与城市IAD交换机的7号端口相连。
开启一个终端,在主目录下执行以下命令,运行系统自带的Mininet脚本internet2.py。这将启动Mininet并创建一个如图1的拓扑结构,并将所有的交换机连接到OVX。你可以看到Mininet不能连接到控制器,这是由于OVX还没有启动。请保持终端端口处于打开状态,因为整个实验过程都会用到它。
1 |
#python internet2.py |
2 启动OVX
再开启一个终端,输入以下命令启动OVX。
1 2 |
# cd OpenVirteX/scripts # sh ovx.sh |
第一次启动OVX,会提示packaging……,耐心等待。成功启动OVX后,可以看到OVX中所有交换机连接到网络,截图给出其中一部分交换机的连接情况:
你也可以观察连接检测过程,下面红框标注的部分显示DPID为00:00:00:00:00:00:06:00的6端口和DPID为00:00:00:00:00:00:05:00的7端口连接。
你可以在Mininet控制台进行验证,Mininet脚本internet2.py显示EWR和IAD之间的连接,使用net命令可以看到EWR的6端口和IAD的7端口的确存在连接。
1 |
mininet> net |
3 确认主机互通与否
这里选取西雅图(SEA)和洛杉矶(LAX)两个城市下的各一台主机来做创建虚拟网络的实验,主机名分别是h_SEA_1和 h_LAX_2。最终的虚拟网络及Virtual DPID将是这样的:
由于还未配置OVX,执行如下命令验证主机之间不能互通。
1 |
mininet> h_SEA_1 ping -c3 h_LAX_2 |
4 虚拟网络配置
4.1 创建虚拟网络
再开启一个终端,执行以下命令来创建虚拟网络。
该网络中的控制器使用tcp协议,并且在本机的10000端口运行。此外,虚拟网络的主机使用的IP范围为10.0.0.0/16。创建好后会得到一个租户ID,可以看到这里的租户ID是1,红框标注。
1 2 |
#cd /home/ovx/OpenVirteX/utils # python ovxctl.py -n createNetwork tcp:localhost:10000 10.0.0.0 16 |
4.2 创建虚拟交换机
根据在命令中指定租户ID和城市物理DPID创建虚拟交换机。下面为租户ID为1的虚拟网络创建虚拟交换机,每创建一个虚拟交换机,就会得到一个虚拟交换机的DPID。命令行中的1是‘tenantId’,00:00:00:00:00:00:xx:00分别是该实验中三个城市(SEA、SFO、LAX)的物理DPID。
1 2 3 |
# python ovxctl.py -n createSwitch 1 00:00:00:00:00:00:01:00 # python ovxctl.py -n createSwitch 1 00:00:00:00:00:00:02:00 # python ovxctl.py -n createSwitch 1 00:00:00:00:00:00:03:00 |
如上截图红框中是一个虚拟交换机的DPID。结构如下:第一个字节是0x00,24位a4:23:05是交换机的唯一标识,最后4个字节代表一个计数器(从1开始),记录每个租户的虚拟交换机数量。
检查OVX日志,确保创建了虚拟交换机。
4.3 创建虚拟端口
通过在命令中指定租户ID、物理DPID和物理端口来创建虚拟端口。
我们在连接SEA的虚拟交换机上创建两个端口:一个用于主机h_SEA_1,连接在物理端口1,另一个在物理端口5,连接SEA和SFO。这将返回一个虚拟端口号,红框标注。
1 2 |
# python ovxctl.py -n createPort 1 00:00:00:00:00:00:01:00 1 # python ovxctl.py -n createPort 1 00:00:00:00:00:00:01:00 5 |
在中间交换机SFO上,我们需要两个端口连接SFO和LAX。
1 2 |
# python ovxctl.py -n createPort 1 00:00:00:00:00:00:02:00 5 # python ovxctl.py -n createPort 1 00:00:00:00:00:00:02:00 6 |
在交换机LAX上,创建端口连接SFO和主机h_LAX_2。
1 2 |
# python ovxctl.py -n createPort 1 00:00:00:00:00:00:03:00 5 # python ovxctl.py -n createPort 1 00:00:00:00:00:00:03:00 2 |
检查OVX日志,确保虚拟端口成功创建。
4.4 创建虚拟连接
通过在命令中指定租户ID、虚拟源交换机的DPID和端口数量、虚拟目的交换机的DPID和端口数量、路由模式和你想要的备份线路的数量来创建虚拟连接。这将得到一个虚拟连接ID,红框标注。注意,OVX会自动创建反向连接,连接ID相同。路由模式支持spf或manual,前者将使用最短路径。
命令行的参数分别是:tenant_id, src_virtual_dpid, src_virtual_port, dst_virtual_dpid, dst_virtual_port, algorithm (spf, manual), number of backup routes。virtual_dpid和virtual_port可以通过4.2和4.3小节获得。
1 2 |
# python ovxctl.py -n connectLink 1 00:a4:23:05:00:00:00:01 2 00:a4:23:05:00:00:00:02 1 spf 1 # python ovxctl.py -n connectLink 1 00:a4:23:05:00:00:00:02 2 00:a4:23:05:00:00:00:03 1 spf 1 |
检查OVX日志,确保连接建立。
4.5 连接主机
通过在命令中租户ID、虚拟交换机DPID、虚拟交换机端口和主机的MAC地址创建连接。这将返回主机ID,红框标注。h_SEA_1连接到第一个虚拟交换机上的端口1,h_LAX_2连接到第三个虚拟交换机的端口2。你可以在Mininet控制台运行h_SEA_1 ifconfig验证MAC地址 。
Mininet控制台验证MAC地址正确。
5 启动虚拟网络
经过以上步骤,我们的虚拟网络已经配置好了,只需要提供租户ID就可以启动。你可以在OVX和控制器的日志中看到虚拟交换机已经连接到控制器了。从控制器的角度看,OVX是一个组成交换机的物理网络。同时,从物理交换机的角度看,OVX像一个控制器。所以OpenVirteX是一个代理控制器(proxy-controller)。
1 |
# python ovxctl.py -n startNetwork 1 |
查看Mininet控制台,主机间互通。
打开链接http://localhost:10001/ui/index.html,可以看到虚拟网创建成功。
至此,实验结束,如有不正确之处,望大家指正!谢谢!