上一篇主要对比了计算机虚拟化和网络虚拟化,引出了FLowVisor网络虚拟层,介绍了其一些特性,这篇博文深入讲解FLowVisor的技术。
一. 概念理解和回顾
上一篇博客说了,切片定义为一个虚拟网络的实例,而组成切片的流可以被当作有所有可能出现的数据包的包头构成的整个几何空间的一个子空间。举一个例子,OpenFlow的流表项会匹配一定的域,我们可以按照不同的域将整个几何空间进行划分。
FLowVisor定义切片为一组流,因此我们可以将切片当作一组域,给定一个数据包包头,我们可以判断出这个数据包包含在哪个流空间中,即可判断出这个数据包属于哪个虚拟网络,所以可以将FLowVisor的一个实例等价于一个流空间。
FLowVisor的设计目标有三点:
- 这个虚拟化对控制器来说应该是透明的
- 不同的切片之间是完全独立的
- 切片定义是可扩展的
二. FLowVisor的的实现
1. 工作流程
FLowVisor类似于一个OpenFlow代理,对OpenFlow交换机和控制器之间的消息进行拦截,如下图左。所有的OpenFlow消息,不论从交换机到用户还是用户到交换机,都会经过FLowVisor,FLowVisor利用OpenFlow协议和用户、交换机进行通信,FLowVisor对交换机和用户来说是透明的,所以在用户看来,他们是直接和交换机通信的。接下来以下图左简单的例子来阐述FLowVisor的操作流程。
Bob在控制器上面运行了一个HTTP负载均衡应用,将所有的HTTP流散播到一组服务器上,Bob的FLowVisor的策略是切片网络从而让自己只处理所有源IP为一个固定值的HTTP流,而控制器上可以看到所有的HTTP流,控制器自信可以实现负载均衡的任务,他会下发流表,对所有的HTTP流负载均衡。当Bob的控制器下发一条流表(如将某个流指引到某个服务器),FLowVisor会拦截他(上图左1),和Bob's的切片策略进行对比(上图左2),重写流表项只对固定源IP的HTTP流有效,这样控制器就实现了只控制固定源IP的流,但是他觉得自己控制了所有的流。同样的,对于从交换机向控制器的消息,FLowVisor只允许满足对应切片流空间的消息上传。FLowVisor不需要FLowVisor实例和物理交换机一对一存在,一个FLowVisor实例可以控制多个物理交换机,甚至可以虚拟化另外一个虚拟网路。如上图右
作者公布了源码,是C语言写的,大约7000行。
2. 切片定义策略
FLowVisor中切片被定义为可插入模块(非常方便和便捷),每个策略由文本配置文件来描述的,一个切片一个。对于带宽分配,一个切片的所有流都会被映射到一个Qos组,每个切片有固定数量的交换机CPU和转发流表的预算,网络拓扑被指定为网络结点和端口的列表。
用一个有序的元素列表,类似于防火墙规则来定义的每个切片的流空间,每个规则描述有一个相关的操作,比如,允许,只读或者拒绝,这些被按照特定顺序来进行解析,执行第一个匹配规则的操作。将所有规则组合起来作为流空间的一部分,基本控制了整个切片。只读规则只允许切片接收OpenFlow控制消息,查询交换机的统计信息,不允许在转发表中插入流表。规则是允许重叠的。
我们接着复杂化前面的场景:Bob邀请了他的一些小伙伴和他合作来做HTTP负载均衡实验,网络管理员Alice准许Bob进行这些合作性实验,Alice将参与这个合作性HTTP实验的人员的HTTP流交由Bob控制,她继续负责剩余的HTTP流,另外,Alice还想要运行一个被动的切片来监测整个网络的性能,为了实现这样的功能,我们可以用下面的流空间规则。
- Bob'的试验网络:被定义为所有参与实验的人员所需要的HTTP流,他的网络描述文件对每个用户只有一个规则,格式如下:
Allow: tcp_port: 80 and ip = user_ip
凡是来自于交换机中可以匹配这条规则的OpenFlow消息被转发到Bob的控制器,所有Bob意图插入的流表项都会满足这些规则 - Alice的生产网络:是Bob网络的补集,所以规则如下:
Deny: tcp_port:80 and ip=user_ip
Allow: all
凡是不进入Bob虚拟网络的交换机的OpenFlow消息都会被进入生产网络的控制器,对于不满足Bob流空间的流生产控制器就可以随意对它们进行控制 - Alice的监测网络:需要看到所有网络中的流,他的规则如下:
Read-only: all
这个规则确保Alice的检测网络是完全被动的,不与她的生产网、Bob的试验网产生任何冲突
通过上面的描述,我们可以发现,基于规则的策略是比较简单的,但是他可以满足实验和部署要求,更重要的是大家可以对自己所需要的规则完全DIY,所以十分灵活和可扩展。