OpenStack网络方案近期状态分析

目前OpenStack网络方案存在有较多的选择,liberty发布已经有大半多时间,mikata版本也快要发布,有必要比较一下近期各种openstack网络方案的状态。

主流方案介绍

当前,比较主流的方案有如下几种:

  • ovs-agent
  • ofagent
  • ovn
  • dragonflow
  • midonet/opencontrail

除此之外,还有一些闭源的商业方案,如nsx、plumgrid,以及一些试验性的开源方案如networking-odl等,本次分析暂不考虑。

现有网络方案特性集及特点

  • ovs-agent
功能点支持情况备注
L2 isolation using overlayY支持vlan/vxlan/gre
arp responderY要求ovs 2.1 + l2pop使能
L3 DVRY要求每台计算节点都需要安装l3-agent,通过netns及linux协议栈实现
ovsdb nativeY独立功能,与openflow native无关,可单独开启,有一定的性能提升
openflow nativeYovs-agent将内置ryu,运行一个of app用来处理与本地ovs的交互,基本逻辑与原ovs-agent相似,通过driver机制实现不同方式的bridge操作,目前仍处于实验阶段
security groupY目前仍基于iptables,随着ovs conntrack功能的完善,可以演进至基于ovs conntrack实现
dhcpY仍采用dhcp agent
north-sourth流量Y仍采用l3agent进行集中式转发,即便在dvr模式下
  • ofagent

如同ofagent在openstack上的wiki所述:

OFAgent is a neutron core-plugin, implemented as ML2 mechanism driver. It aims to support pure OpenFlow1.3 switches.

ofagent关注的更多是指向向设备(如vswitch/pswitch)可移植性,因此基于纯openflow协议进行实现,而纵观业界,基本上没有基于纯openflow的openstack网络方案(目前仍成功商用的则是bigswitch的big fabric,但其采用了深度修改的openflow),因此这种方式可能是过于理想化的方案,可能并不一定能够容易落地。

从ovs的状态来看,ovs 2.5中为支持conntrack,引入了ct_state/ct这样的match/atction,这些nicira扩展落入openflow spec的时间点可能还比较长,而为了实现dv足够多的功能,ovs将会继续引入扩展,如果基于纯openflow实现的话,这些功能都将难以利用。

从wiki上的比较来看,ofagent也不支持dvr,实现上同样基于ryu,而部署模式上与ovs-agent相似,在compute/network节点都需部署。

  • ovn

ovn是由vmware所主导的新项目,其介绍如下所示:

OVN, the Open Virtual Network, is a system to support virtual network abstraction. OVN complements the existing capabilities of OVS to add native support for virtual network abstractions, such as virtual L2 and L3 overlays and security groups. Services such as DHCP are also desirable features. Just like OVS, OVN’s design goal is to have a production-quality implementation that can operate at significant scale.

目前已经实现的功能集如下:

功能点支持情况备注
L2 isolation using overlayYhypervisor间仅支持geneve/stt,与l2gw之间可采用vxlan连接
arp responderY直接基于流表实现
L3 DVRY不依赖netns,基于ovs patch port及纯流表实现,对vrouter网关的icmp请求将由流表进行回复
ovsdb nativeYovsdb目前既做northbound db,又做southbound db,同时又做hypervisor上的本地db,但操作上均是通过c语言访问native接口实现的
openflow nativeY在hypervisor上需运行一个基于c语言实现的local controller,通过native openflow消息操作vswitchd
security groupN基于OVN ACL实现,目前已经提供部分代码,尚未实现
dhcpY暂时仍采用dhcp agent,后续将内置实现
north-sourth流量Y暂仍采用l3 agent,后续将内置实现,并预期支持L3HA

nn从功能点上来说,ovn还有大量的功能有待开发,并且很多功能一方面依赖于ovs,一方面依赖于kernel,尽管邮件列表上计划在mikita版本有试验性的支持,从当前现状来看,达到生产级质量水平的可能性较小。

从架构上来看,尽管ovn也认识到northdb、southdb目前都存在ovsdb-server上存在单点故障并且ovsdb尚不支持clustering,但目前仍关注于feature的完备性,故而还未投入过多精力处理。

  • dragonflow

Dragonflow implements Neutron using a lightweight embedded SDN Controller. Dragonflow is available in two configurations: Distributed and Centralized. Our project mission is to Implement advanced networking services in a manner that is efficient, elegant and resource-nimble

dragonflow由华为以色利团队开发,相比ofagent那种仅为提升性能而采用ryu实现openflow native语义的方式,dagonflow更为激进,采用了ryu app来实现l2转发及l3 dvr,并且从代码上来看,dhcp功能也已经做为ryu app实现了,并且dragonflow强调自己实现了pluggable db的支持,即通过引入外置第三方db来实现数据同步,与openstack rpc解耦,相比ovn采用ovsdb来说,db层面的可靠性及扩展性更好。

目前dragonflow的功能如下:

功能点支持情况备注
L2 isolation using overlayY支持vxlan/gre
arp responderY基于流表实现
L3 DVRY基于流表实现,无需netns
ovsdb nativeY通过ovsdb python idl访问ovsdb
openflow nativeY内置ryu,通过openflow协议处理packet-in及流表
security groupN计划采用ovs conntrack实现,但尚未开发
dhcpY采用运行在ryu里的dhcp app,实现分布式dhcp
xnorth-sourth流量Y仍采用l3agent进行集中式转发
  • midonet

midonet是midokura公司开源的openstack网络方案,核心实现是基于分布式数据库(zookeeper)实现neutron数据分发,并通过ovs kmod实现转发,但在用户态完全舍弃ovs,采用自己通过java+scala实现的本地控制器,其核心转发过程称为simulation,即通过本地控制器所获知到的虚拟网络拓朴,来判断一个报文最终的转发结果,并将结果添加到ovs kmod所维护的内核态流表中。

国外有部署云客户采用该公司的方案,国内据说乐视私有云采用了该方案。

目前midonet的功能如下:

功能点支持情况备注
L2 isolation using overlayY支持vxlan
arp responderY由本地控制器仿真实现
L3 DVRY由本地控制器仿真实现,将下发至内核态流表
security groupY由本地控制器仿真实现
dhcpY由本地控制器实现
north-sourth流量Y支持DNAT/SNAT,并实现多l3时的snat同步,并可以和外部通过bgp进行l3对接
load-balancerY由HA Proxy实现
  • opencontrail

opencontrail为juniper所开发的独立网络虚拟化方案,采用专用的内核模块实现virtual network,不依赖于ovs,并采用大量的私有或公有如bgp协议实现控制平面,与juniper的设备有较好的对接,国外部分公有云如tcpcloud等采用其方案。

从部署上来说该方案与现有方案差异较大,不做过多描述。

选型建议

从上述分析来看,除社区ovsagent外,midonet/opencontrail是较为完善的方案,但前者社区较小(尽管目前部分代码已经托管至openstack官方),且采用小众语言开发,深入定制有一定的难度;如果半年内要升级的话,ovsagent似乎是较为可行的选择,半年后可以关注ovn/dragonflow等相关项目的状态再做选择。

至于转发性能方案,各方案主要还是解决管理上的复杂度,性能上dvr算是一个较大的亮点,转发性能上可以通过后续引入对组网影响较小的vxlan offload nic来提升。

关于网卡VXLAN offload能力的误解

网络技术这个行业里,厂商通常会对一些技术做出高大上的包装,像网卡VXLAN offload这种技术,就是一个典型的例子,然而其底层技术,也许并不像想象中的那么神秘。

做为网络交换机的开发人员,近年来一直从事数据中心网络虚拟化的相关工作,最近读取一篇关于青云SDN 2.0的文章,里面提到了采用网卡VXLAN offload这种技术后overlay情形下的虚拟网络性能得到了较大规模的提升,考虑到后续我亦将加入云计算公司进行网络虚拟化相关的研发,自然也十分想了解这种技术的底层实现如何,以便从理论上分析其性能是否具有较大的价值。

分析之前,稍微VXLAN的封装格式进行简单的说明,本质上VXLAN类似于一种l2vpn技术,即将二层以太报文封装在udp报文里,从而跨越underlay L3网络,实现不同服务器或不同数据中心间的互联,其格式总结如下:

|ETH_HEADER|IP_HEADER|UDP_HEADER|VXLAN_HEADER|INNER_ETH_HEADER|INNER_IP_HEADER|…|

在采用VXLAN技术后,由于vm/docker的报文被封装于外层的UDP报文中予以传输,使得以往的TCP SEGMENT OPTIMIZATION、TCP CHECKSUM OFFLOAD等功能对于内层VM的TCP数据收发失效,较大地影响了VM间通信的性能,给最终用户带来了很差的用户体验。

下面我们来看看不同的方案都是如何实现的:

支持Overlay的交换机

目前较新的万兆交换机大多支持Overlay功能,即支持将以太报文封装在VXLAN报文中予以转发,也即将VXLAN封装功能放在专用的网络设备上,来提供确定性的线速转发性能,但这很明显增加了交换机与服务器之间的耦合,给管理维护带来了一定的复杂度。

NIC VXLAN OFFLOAD

而网卡VXLAN offload则不像Overlay交换机那样要求对组网方案进行较大的变更,而是对于网卡的能力进行了增加,与网卡驱动配合,使得网卡能够知晓VXLAN内部以太报文的位置,从而使得TSO、TCP CHECKSUM OFFLOAD这些技术能够对内部以太报文生效,从而提升TCP性能。

以TSO为例,内核封装出的TCP报文如下:

|ETH_HEADER|IP_HEADER|UDP_HEADER|VXLAN_HEADER|INNER_ETH_HEADER|INNER_IP_HEADER|INNER_TCP_HEADER|INNER_TCP_DATA_NEED_TSO|

该报文的内部TCP数据需要进行TSO处理,即切成满足网卡MTU的报文,内核驱动将报文通过DMA送给网卡后(同时要提供一些元信息,如VXLAN头位置等),网卡负责将内部的TCP报文转换为多个内部TCP报文,封装相同的外层VXLAN头后进行转发,从而减少CPU的干预,大规模提升性能。

小结

个人认为VXLAN OFFLOAD这个名字不如用VXLAN-AWARE OPTIMIZATION比较直观,但厂商为了吸引眼球,自然是需要适当的包装,可以理解。

从实现的角度来说,万兆甚至更高性能的网卡本来就比较贵,这样的优化可能并不一定导致过高的复杂度,但在实现上却能够不依赖于OVERLAY交换机更实现性能的提升,应该是做为优化OVERLAY性能的首选方案。