今天弄了一天的FlowVisor虚拟化工具,此刻终于做出了自己的一些总结和思考。
学习OpenFlow协议,不得不提到另一个虚拟化工具FlowVisor,它给SDN的虚拟化的实现带来了新的活力。FlowVisor就是位于硬件和软件之间的网络虚拟层,它能够将物理网络划分为不同的虚拟网络。FlowVisor允许多个控制器同时控制一台OpenFlow交换机,但是每个控制器仅仅可以控制经过这个OpenFlow交换机的某一个虚拟网络(即slice)。因此通过FlowVisor建立的试验平台可以在不影响商业流的转发速度的情况下,允许多个网络试验在不同的虚拟网络上同时进行。
FlowVisor通过抽象层来分割物理网络,它位于一组交换机和软件定义网络或多个网络之间,管理带宽、CPU利用率和流量表,这类似于管理程序位于服务器硬件和软件之间(虚拟平台),以允许多个虚拟操作系统运行。
OpenFlow网络由OpenFlow交换机、FlowVisor和Controller三部分组成。OpenFlow交换机进行数据层的转发;FlowVisor对网络进行虚拟化;Controller对网络进行集中控制,实现控制层的功能。OpenFlow网络的结构示意图如下:
由上图中可以看出FlowVisor的工作流程:首先,要知道FlowVisor网络的基本要素是网络切片(slice),网络切片是由一组文本配置文件来定义的。文本配置文件包含控制各种网络活动的规则,例如允许、只读和拒绝,其范围包括流量的来源IP地址、端口号或者数据包表头信息。其次,FlowVisor部署在标准OpenFlow控制器和OpenFlow交换机之间,成为二者的透明代理。FlowVisor能够与多个控制器连接使得每个控制器控制一个虚网,保证各虚网相互隔离。目前虚网划分范围涵盖了物理层、数据链路层、网络层和传输层的协议字段,以数据包的12元组作为划分依据,按照流的思想将网络资源进行合理分配,以达到限定当前切片内数据流量类型的目的。
FlowVisor其实也可以看做是一个特殊的OpenFlow控制器,所有OpenFlow消息都将透过FlowVisor进行传送。FlowVisor会根据配置策略对OpenFlow消息进行拦截、修改、转发等操作。这样,OpenFlow控制器的任务量就减轻了,只需要控制被允许控制的流,但是控制器并不知道其所管理的网络被FlowVisor进行过分片操作。相似地,从交换机发出的消息经过FlowVisor也只会被发送到相应的控制器。
由图1中可以看出,FlowVisor主要由FVClassifier、FVSlicer和FlowSpace数据库三部分组成。其中FVClassifier主要用于维护与物理OpenFlow交换设备的连接,处理IO请求并记录每个物理设备的端口、性能等信息,并且每个FVClassifier对应一个OpenFlow交换设备。FVSlicer用于维护与控制器的连接,管理OpenFlow会话并对控制器下发的信令进行处理。当流从一个物理的OpenFlow交换设备到达FlowSpace后,FlowSpace根据数据库中切片规则,把OF消息交给本切片内的FVSlicer发送给连接的控制器。
FlowVisor的核心主要是对上行消息(连接控制器)的映射和对下行信令(连接交换机)的过滤。如图1所示,控制器和交换机与FlowVisor的所有联系都需要通过Poll Loop来交互,交换机交给控制器的数据包通过FlowVisor的OFSwitchAcceptor模块接收后,FVClassifier对数据包的来源进行分析,再连接到FlowVisor中的数据库与Flowspace进行匹配,从而决定此数据包应该交由哪个控制器来处理。同理,控制器下发给交换机的数据包会通过相反的过程到达交换机。XML-RFC就类似于服务器。
其实上面就简要的介绍完了OpenFlow网络中FlowVisor的工作原理,不过这个还得感谢sdnlab网址给我的帮助,我在里面学会了很多。里面还对FlowVisor做了一个简单的实验验证,这里我就不作出详细的实验配置了,详细见网址:http://www.sdnlab.com/3081。但是在这里我给出我自己在配置这个实验中遇到的问题:
首先,这个实验的拓扑结构为:
控制器采用Floodlight。安装如下:
一般需要这类软件源时可以去官网或者github中去下载,里面有详细的安装文档和介绍:
一般在安装软件之前会需要提前安装一些软件:
<span style="font-size:18px;">sudo apt-get install build-essential default-jdk ant python-dev eclipse //需要Java虚拟机环境</span>
通过git进行下载编译安装:
$ git clone git://github.com/floodlight/floodlight.git
$ cd floodlight
$ git checkout stable
$ ant
这里扩充一下Floodlight控制器的应用:
运行控制器:
$ java -jar target/floodlight.jar
查看控制器的进程是否起来:
ps -ef | grep floodlight
利用Eclipse来运行Floodlight的项目:
- Open eclipse and create a new workspace(打开Eclipse,新建一个工作空间)
- File -> Import -> General -> Existing Projects into Workspace. Then click “Next”.
- From “Select root directory” click “Browse”. Select the parent directory where you placed floodlight earlier.(选择你放floodlight的文件地址)
- Check the box for “Floodlight”. No other Projects should be present and none should be selected.
- Click Finish.
Create the FloodlightLaunch target:
- Click Run->Run Configurations
- Right Click Java Application->New
- For Name use FloodlightLaunch
- For Project use Floodlight
- For Main use net.floodlightcontroller.core.Main
- Click Apply
安装FlowVisor一样:
sudo apt-get install build-essential sun-java6-jdk ant eclipse
下载源码:
git clone git://github.com/OPENNETWORKINGLAB/flowvisor.git
$ cd flowvisor //编译安装
$ make && make install
启动FlowVisor:
flowvisor /etc/ flowvisor/config.json
在安装的过程遇到了一些问题,不过后面都得到了解决,其中通过sudo apt-get install 安装的软件需要删除的命令为:
sudo apt-get remove mininet (以mininet为例)
sudo apt-get remove --auto-remove mininet //同时卸载了与其相关依赖组件
sudo apt-get purge mininet //删除了mininet在 本机local/config files中的文件
最后说明一点,最近open networking lab又提出了一种新的更加强大功能的网络虚拟化平台,即OpenVirteX(简称OVX)。这个在后续的学习中不断给出总结。祝愿SDN能够越做越好,给现在的网络带来更加优化的性能,让我们一起努力!