OpenStack网络新项目Dragonflow研究
https://www.ustack.com/blog/openstack-dragonflow/
本文由2015年5月30日举行的OpenStack Meetup北京上的演讲整理而成,演讲者为UnitedStack网络工程师王为。
在温哥华OpenStack Summit上,Neutron最新的子项目Dragonflow并未被特别提及。事实上,在网络领域,这个由华为以色列技术团队提出的项目在开发者中还是很受关注的。Dragonflow项目提出的时间是在2014年,2015年开始提交代码,目前已经成为OpenStack的孵化项目。
Dragonflow可以理解为Neutron的3层的控制器扩展组件。它实现了Neutron的L3 Service API,还为Neutron提供了分布式虚拟路由器功能。从设计理念上讲,Dragonflow使用的是可插入式无状态化轻量级SDN控制器,实现了租户子网间(东-西)流量的完全分布化,避开了网络节点,减小了故障域,避免单点故障。
按照Dragonflow的设计理念,它可以提升OpenStack Neutron L3的可扩展性、弹性、性能和可靠性。它可以支持数千个计算节点,为实现动态增长而保持控制器的无状态化,没有中央瓶颈,通过避免使用iptables和命名空间减少计算节点开销。
DVR分布式虚拟路由模式
Dragonflow到底进行了哪些改进?要了解Dragonflow的设计思路,我们先来看看目前OpenStack网络所采用的DVR(分布式虚拟路由)模式。

上图显示,DVR的服务架构上,L3作为Service Plugin集成在Neutron Server里,计算节点启动L3 Agent,网络节点启动L3 NAT Agent。

上图是DVR模式的网络I/O路径图,我们可以看到,针对东西流量,计算节点的L3 Agent会启一个NameSpace,然后做ARP的抢答、MAC地址修改,最后把流量直接打到对面的计算节点上去。如果对面的流量想返回,路径也是相同的。
这样的设计目的是什么呢?首先就是要截住本身的ARP,把ARP回应回去;第二,是要把Mac地址通过OVS修改成虚拟的Mac地址,然后发送过去。
这样的模式的问题在于,不仅需要走Namespace(网络设备多),同时逻辑也会非常复杂。NameSpace里面一些需要配置ARP的规则需要在整个集群中同租户的计算节点进行配置,无论这个计算节点是不是真的有相关网络的虚拟机,都需要进行下发的。

再来看看南北流量。做法同样是基于Namespace把公网IP附着上去,然后再送到公网上。特别是SNAT的话整个路径会比较复杂。走完计算节点然后再出去,送到网络节点,然后通过SNAT的Namespace来做。
DVR模式的优点1. 确实解决了流量的分布问题。
实际把东西流量Offload到交换机上,而不是说跨子网还需要走网络节点、走路由器,然后再返回;
2. 减少单点故障,减小故障域。
如果网络节点挂掉,也只会影响一个SNAT的流量。如果是东西流量,或者是有了公网IP的南北流量,是不会受到影响的。这个优势非常重要,因为网络节点HA的社区实现不是非常健壮,因此不要把所有的希望都寄放在社区的HA上。另外,目前的HA也没有实现Contrack的同步,因此用户体验不佳。
DVR模式明显的缺点1.资源和性能损耗的问题。
每一个计算节点都要起namespace,这样就会占用资源,而流量都需要走namespace的TCP/IP协议栈,走一遍内核,这是比较浪费性能的。
2. 管理的复杂性问题。
DVR能够分布式东西流量了,部署之后感觉挺好。但是一旦出了问题,如果想去debug,想去tcpdump的话,你会看到全部都是假的ARP,全部都是假的Mac地址,流量的路径也都非常奇怪,很难去做运维操作。也就是说,不出问题还好,一出问题就很难解决。这个问题在生产环境是比较敏感的。对于云服务商来说,不可能保障永远不出故障,最近比较火的今日头条、携程的事故就是例子。既然无法保证100%不出故障,那么出了故障就需要快速地进行解决或者恢复生产。
3. 代码的复杂性。
(1)计算节点管理了这么多的设备,需要Driver去管理这些东西,这些都是需要代码的;
(2)它和二层的耦合性比较强,也就是说部署了DVR L3,就需要同步更新DVR L2,它和L2是紧耦合的。我们看到,以前我们只能支持Overlay,不能支持VLAN网络。
Dragonflow进行了哪些改进?
Dragonflow是由华为的以色列技术团队在2014年提出,2015年开始提交代码,目前已经成为OpenStack的孵化项目。
Dragonflow的设计比较符合一个标准的Neutron扩展,通过Plugin来实现API,通过两个Agent分别实现功能。

在上图中我们可以看到,在Dragonflow模式中,Service的实现方式是一样的(service plugin)。它把Network节点由单纯的网络节点(走SNAT流量)改成了Neutron Controller Agent。Neutron Controller Agent相当于传统SDN方案的网络控制器,更准确的说是三层的SDN控制器。计算节点上跑的还是L2 Agent。在原来DVR的模式下,网络节点要跑L3 Agent,现在就不需要了。也就是说,Dragonflow改成了纯粹用OpenFLow去控制三层流量的方式。

Dragonflow是如何完成这样的改变的呢?首先,它将metadata dispatch出来,也就是分清哪些是DHCP的,哪些是VLAN的。VLAN的部分需要标记TAG,送到Packet classifier里面。Classifier做的也很简单,主要是分辨ARP、广播和三层流量。关键在于,它会把三层流量(default)区分出来,送到另外一个表里,也就是L3的Forwarding表。
Forwarding表中包含了协议的流表规则(controller规则),也就是说流量如果命中不了任何一个Flow的话,就会被送到Controller里去,做Reactive的反应。流表会被下发到这里,实现OpenFlow对三层流量的控制。

个人观点个人认为,Dragonflow的做法在SDN领域实际上没有特别大的新意,基本上就是命中流量,然后把包发送到Controller上,Controller会重新下发流表。它的好处体现在,我们不需要预配置流表了,管理的复杂度能够显著降低。
从DVR和Dragonflow我想到了一个问题:我们到底需要一个什么样的SDN?
Dragonflow确实好像完成了一些事情,比方说,计算节点上不需要部署L3 Agent了,网络节点上无需起很多的namespace,去穿过这些这些额外的TCP/IP协议栈,貌似是实现了性能的提升。但是Dragonflow的性能提升是很有限的,因为按照我们一般的理解,网络性能提升的关键重要体现在内核、网卡方面。因此,希望从Controller入手实现性能的提升目光似乎有些短浅。
关于主动和被动式,SDN的解决方案有两种,主动下发流表,或者根据流量的情况被动地下发流表。被动的方式看上去很美,但是也有它自己的问题。比方说,规模很大的时候,控制器的性能就会成为瓶颈,这种情况下如何提升控制器的性能?可能我们会想到,可以把控制器分布到不同的计算节点上,可这样就又几乎走回到DVR的网络上了。
融合式SDN(Hybrid)是另一种思路,但是问题也很多,首先就是代码的复杂性会非常高。其次采用反应式的SNAT也会存在问题,SNAT包含状态信息,单纯地通过二层控制会比较麻烦。也正是出于这个原因,Dragonflow的SNAT走的是L3的模式,也就是直接送到网络节点,然后再送出去。
UnitedStack目前在公有云服务上的做法是采用纯Neutron,自己想办法提升性能,效果也不错,扩展性表现也可以。目前我们的想法是,希望只利用DVR二层东西流量的部分,而不让它插手南北流量。这样也实现了非常不错的性能和效果。
OpenStack网络新项目Dragonflow研究的更多相关文章
- 自动化生成 Openstack 新项目开发框架
		目录 目录 前言 环境 openstack-project-generator 前言 Openstack Developer 应该都知道, 开发一个 Openstack 的新项目并不是一个从 0 到 ... 
- 如何向Openstack社区提交一个新项目
		前几天有个朋友问我:自己有一个idea不错的项目,也把基本的框架写好了,想贡献到Openstack社区,却不知道应该怎么做.正好之前我有过类似的经历,那么来分享一下我是如何向Openstack社区提交 ... 
- openstack 网络架构 nova-network + neutron
		openstack网络架构(nova-network/neutron) openstack网络体系中,网络技术没有创新,但用到的技术点很庞杂,包含bridge.vlan.gre.vxlan.ovs.o ... 
- OpenStack云计算(一)——OpenStack 网络
		关于OpenStack OpenStack它是 Rackspace Cloud 和 NASA 负责的一个开源基础架构即服务的云计算项目. OpenStack 是一个由开发者和云计算技术人员的全球协作开 ... 
- openstack网络架构(nova-network/neutron)
		openstack网络体系中,网络技术没有创新,但用到的技术点非常庞杂,包括bridge.vlan.gre.vxlan.ovs.openflow.sdn.iptables等,当然这里不会做具体技术介绍 ... 
- 绝不能错过的10款最新OpenStack网络运维 & 监控工具
		摘要 今天我们要推荐给大家的是关于奥斯汀OpenStack Summit的OpenStack网络方面功能与工具相关的技术演讲. 希望可以帮助国内的开发者.架构师和用户更好地了解OpenStack在SD ... 
- 2.OpenStack 网络简介(neutron)
		OpenStack 网络简介(neutron) 概述和组件 OpenStack 网络允许您创建和管理网络对象, 如网络.子网和端口, 其他 OpenStack 服务可以使用.插件可以实现, 以适应不同 ... 
- 深入理解openstack网络架构(4)-----连接到public network
		原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture3 译文转自:http://b ... 
- 深入理解openstack网络架构(3)-----路由
		原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture2 译文转自:http://b ... 
随机推荐
- django注册在使用hashlib对密码加密时报Unicode-objects must be encoded before hashing
			在使用sh1等hashlib方法进行加密时报:Unicode-objects must be encoded before hashing 解决办法:对要加密的字符串指定编码格式 解决之前: s1=s ... 
- Clustered and Secondary Indexes
			Clustered and Secondary Indexes secondary index A type of InnoDB index that represents a subset of t ... 
- MySql 自适应哈希索引
			一.介绍 哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1).常用于连接(join)操作,如Oracle中的哈希连接(hash join). InnoDB存储引擎会监控对表上 ... 
- Python正则表达式基础
			1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ... 
- C#编写图书列表winform
			Book.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ... 
- SQL实现分页存储过程
			SQL分页存储过程的编写: --获得分页的DATASET资源 ALTER PROC sp_GetSource( @PageSize INT, --每页显示条数 @PageIndex INT, --页码 ... 
- JAVA中遍历Map和Set方法,取出map中所有的key
			Java遍历Set集合 1.迭代器遍历: Set<String> set = new HashSet<String>(); Iterator<String> it ... 
- 20160418 while,switch,do..while的使用
			9 一.While循环 示例:求100以内所有数的和 Int i=1;//初始条件 Int sum=0; While(i<=100)//循环条件 { Sum+=i;//循环体 i++;//状态改 ... 
- jQuery开发入门
			jQuery是JavaScript库中的优秀一员. 下载完jQuery框架文件jquery-1.9.0.js 后,不需要任何安装,仅需使用<script>文件导入标记,将该框架文件导入页面 ... 
- Oracle表与约束关系
			手动回收表的存储方式: SQL> alter table aux_emp deallocate unused; //回收所有未使用的存储空间 表已更改. 回收aux_emp的存储空间,保留50K ... 
