爱上Neutron的理由

北向API,框架结构与微内核

随着OpenStack市场占有率的提高,OpenStack已经成为事实上的IaaS标准,提供和Neutron兼容的北向API至关重要。北向方面,Neutron提供了核心API,抽象了一个网络核心数据模型(网络、子网、端口、路由),也提供了扩展API去为其他非核心数据结构提供统一的对外API。这些标准的北向API接口,不仅可以使其他数据中心网络与OpenStack网络互联互通,而且提供了标准的虚拟网络开放系统,可以用于多种集成场景中。

OpenStack的另外一个优点是它提供了一个非常好的框架结构,插件与代理之间通过消息通信解耦,如AMQP,从而让OpenStack中的每一个进程都可以运行在任何节点上以支持大规模部署。Neutron也不例外,它的这种框架结构让你可以将精力集中在业务部分。作为精通OpenStack的专业人员可以从Neutron众多的插件和驱动中挑选合适自己部署架构的功能。如果它与你的部署架构不符,或者缺少相应的插件或驱动,则可以在Neutron框架结构下扩展插件或者驱动即可,从而节省大量定制开发的成本。

目前VPN即服务,负载均衡即服务,防火墙即服务的代码已经从Neutron主代码库中分离出来到单独的代码库中了。今后ML2层的各个插件也会从Neutron主代码库中挪出来。所以,Neutron将像Linux一样成为真正的微内核,各个供应商围绕Neutron提供的北向API适配自己的驱动即可。微内核随着一些和数据库事物相关的缺陷的逐步修复已经变得足够稳定。

虽然Neutron是OpenStack中的组件,但Neutron也是可以单独拿出来作为虚拟化网络管理的产品的。

大规模高性能,L2的控制平面L2 population(L2pop)

Neutron通过L2pop特性解决了L2层无控制平面的问题,从而让Neutron具备更高的性能,适应更大规模的部署。

一台计算机上的应用程序通过IP地址和其他计算机通信时,需要先通过IP地址找到MAC地址,但是传统的网络L2层没有控制平面,不像L3层还可以通过路由协议学习到路由,二层没有标签的学习机制,它只能通过ARP广播来为IP找MAC。广播就很容易产生广播风暴,尤其是对于这种云环境,每个计算节点上都有大量的虚拟就或者容器,相当于是一个大二层,更容易产生广播风暴,所以在云环境中广播绝对是需要禁用的。

GRE隧道使用广播,Vxlan在GRE的基础上使用多播在局域网里减小广播的范围,L2pop更进一步完全禁用广播,因为Neutron的数据库里都是有IP和MAC的映射数据的,L2pop会通过ebtables截获ARP请求将从数据库中查找到对应IP的MAC地址直接返回给虚拟机。

  • 拦截ARP请求,并进行应答。Open vSwitch已经具备ARP Responser的特性。
  • 地址学习,在网桥中单播和广播流添加流转发规则。

大规模高性能,改善东西南北向流量之分布式虚拟路由(DVR)

在Neutron的Juno版本之前,所有的三层网络虚拟路由功能都由网络节点来承载,并且没有高可用性的支持。在大规模部署的情况下,网络节点成为一个瓶颈。为此,从Juno版本开始,Neutron项目实现了分布式虚拟路由即DVR的功能。DVR是指在每个计算节点上都部署一个三层网络的虚拟路由器,这样该计算节点之间各个虚拟机的东西流量(即同一个租户之下的相同子网中虚拟机的通信)避免了走集中化的网络节点。同时,每个计算节点也会支持DNAT服务,支持虚拟机的浮动IP的访问,从而使得访问虚拟机的南北流量DNAT避免走集中式的网络节点。

这里面最重要的设计问题就是:不同的计算节点上可能会有相同子网的虚拟机,那么不同的计算节点上可能会出现相同子网的网关。我们知道,在路由与协议中,IP地址是不能重复的。Nova-network的多主机部署,Neutron中的DVR都可以改善东西南北流量,但是它们的区别在于:

  • Nova-network的多主机部署,为不同计算节点上相同子网(如10.0.1.0/8)的网关分配不同的网关IP(如一个计算节点的网关是10.0.1.1,另外一个计算节点的网关可能就是10.0.1.2),这样避免了网关重复问题,但管理复杂,且浪费IP。

  • Neutron的DVR,每个计算节点上的内部网关通过流规则设置为局部可见,这样不同计算节点上可以为相同的子网使用相同的网关(如10.0.1.1),节省了IP。另一方面,计算节点生成唯一的DVR MAC地址,流表负责它的进出计算节点时的替换工作,这样计算节点之间相同网关的东西向流量也能保证。

  • kubernetes则是假如每台主机使用不重复唯一的子网,这样就永远不会出现计算节点可能会有相同子网虚拟机的问题,通过这种假设避开了上述设计问题。

大规模高性能,L3高可用VRRP(Virtual Router Redundancy Protocol)

同样在Juno版本之前,Neutron是不支持高可用的,或者只支持Active/Passive模式的高可用,在Active的节点不可用之后,通过某种方式将三层服务迁移到Passive节点上去。这种方式不可避免地会引起服务的中断。

在Juno版本中,Neutron项目基于VRRP协议实现了虚拟路由服务的高可用,相当于是Active/Active集群。VRRP协议在电信行业中应用非常广泛,很多网络路由器的冗余设计都是基于这个协议实现的。其主要特点如下:

  • slave收不到master的广播包时就认为它已不可用,会快速抢占为master。
  • conntrackd用来同步tcp session,确保在切换后不需要丢包重发。
  • 针对Active/Active集群采用keepalived对内部网关、外部网关、浮动IP三类VIP在节点间进行飘移,且keepalived支持命名空间。