OpenStack Neutron N版本VLAN aware VMs特性解析(二)

声明:
本博客欢迎转载,但请保留原作者信息,并请注明出处:http://write.blog.csdn.NET/!
作者:林凯
团队:华为杭州OpenStack团队

上一篇介绍完社区vlan aware VMs BP在北向数据模型和plugin实现之后,本篇介绍该BP在南向实现的方案。
社区在考虑该BP的南向实现的时候,基于以下几个角度考虑:
1.设计复杂度:完整的重构仅在某些情况下可取,VLAN aware VMS基于现有的OVS agent架构实现,值得注意的是,OVS agent设计已经相对复杂,因为其需要适应多个部署选项,特别是关于安全规则和或加速。

2.升级复杂度:能够改造现有的设计意味着现有部署不需要去通过叉车升级(断层式的升级方式)以推出新功能;

3.设计可重用性:所提出的设计可以容易地适配应用到各种技术后端,如Neutron L2 agent支持:打开vSwitch和Linux Bridge。

4.性能方面:如果它不能满足在分组吞吐量上高的严格要求,至少在长期上是无法满足客户的需求。

5.功能兼容性:需要考虑该特性与VLAN transparency(nfv-vlan-trunks)特性的兼容性。VLAN transparency是关于使平台不干扰从VM发送
出来的带有tag的报文,并让底层分辨这些报文发送到哪里。vlan aware vms是关于使平台用vlan tag关联到报文,以确定报文发送到哪儿。

社区在南向实现上考虑过3中方案::
1.VLAN子接口:这些接口允许在它到达br-int之前的流量分流并被隔离,发送到正确的目的地。
(1)设计复杂性:在现有的OVS设计上,相对变化较小,并且它可以与iptables和本地ovs安全规则一起工作。
(2)升级复杂性:采用此解决方案没有必要的重大升级,因此没有潜在的数据平面中断涉及。
(3)设计可重用性:VLAN接口可以很容易地使用用于Open vSwitch和Linux Bridge。
(4)性能损失:使用VLAN接口意味着内核必须涉及。对于Open vSwitch,是否能够使用像DPDK这样的高性能解决方案将是一个未解决的问题
(5)功能兼容性:为了保持设计简单,采用VLAN接口,并启用VLAN透明,打开vSwitch需要支持QinQ,目前OVS2.5没有正在进行的整合计划。

2.使用全流表:这意味着在数据平面使用OpenFlow提供租户隔离,和分组处理。
(1)设计复杂性:相对来说对于当前Neutron L2 agent解决方案是一次变动较大的方案重构。
(2)升级复杂性:现有部署将无法正常工作,除非能解决以下问题:
a)agent可以处理通信路径下的“旧”和“新”接线方式;
b)在发布期间强制执行数据平面迁移升级,因此可能导致(可能无法恢复)数据平面中断。(这一点大部分用户都无法接受)
(3)设计可重用性:需要解决避免扩大Linux Bridge和 Open vSwitch之间的差距(例如OVS具有DVR,但是LB不)。
(4)性能损失:使用全流表方案通过DPDK的方式将允许释放空间并实现快速处理,但需要消耗相当大的工程成本.
(5)功能兼容性:采用全流表,租户之间的隔离将不再能够通过本地vlan进行配置,从而使对QinQ的支持要求不再是Open vSwitch的严格必需。

3.每个trunk port使用一个OVS网桥:与第一个方案很相似,在VM和br-int之间增加一个OVS网桥,通过patch口连接新的网桥和br-int。
(1)设计复杂性:此方案的复杂性,社区考虑之前已经完成一部分工作,所以复杂性不高;
(2)升级复杂性:原有的虚拟机未使用trunk的情况下,无该网桥,如果原有的虚拟机增加使用trunk的情况下,ovs agent重新处理端口增加独立的网桥处理,无升级影响,但会牺牲一部分灵活性,并增加运维的复杂性,毕竟增加了一个网桥。
(3)设计可重用性:同样需要解决避免扩大Linux Bridge和 Open vSwitch之间的差距(例如OVS具有DVR,但是LB不)。
(4)性能损失:从性能的角度来说,避免使用内核接口(vlan子接口),从而解放了报文快速处理的潜能。
(5)功能兼容性:引入trunk网桥不会影响现有配置,如果考虑vlan transparent的情况下,仍然需要OVS支持QinQ。

综合来看,3种方案各有优缺点:1方案相对来说最为简单,但是会牺牲性能,同时在某种程度上,视为一种倒退的做法,因为他会导致无法使用DPDK;2方案重构最为彻底,允许neutron去充分发挥Open vSwitch的能力,但是会加大开发者很多工作量,同时面临升级的问题;3方案从OVS的开发和性能两个方面考虑,试图整合1和2方案的优点,以牺牲运维复杂性和灵活性为代价。最终从社区的实现来看,社区采用的是3方案,但我们可以看到社区对于技术方案选择的严谨性,不断PK,不同方面的PK,最终才确定下来的方案。

接下来介绍3方案的实现方式:
实现的网桥形式如下:

OpenStack Neutron N版本VLAN aware VMs特性解析(二)_第1张图片
接口说明:
1. tpt-parent-id:trunk网桥侧实现trunk的patch port
2. tpi-parent-id:br-int网桥侧实现trunk的patch port
3. spt-parent-id:trunk网桥侧实现subport的patch port
4. spi-parent-id:br-int网桥侧实现subport的patch port

创建trunk的流程:
创建VM时关联了trunk的parent port的port-id传递给nova,之后neutron会在vif_details字段中传递给nova plug vif的网桥所在,os-vif driver在plug()中创建trunk网桥(tbr-trunk-id)。并会创建tap口 ,把他挂载在tbr-trunk-id,设置他的external_ids为parent port ID。OVS agent将会监控到trunk网桥上接口的创建,会执行以下操作:

ovs-vsctl add-port tbr-trunk-id tpt-parent-id – set Interface tpt-parent-id type=patch options:peer=tpi-parent-id
ovs-vsctl add-port br-int tpi-parent-id tag=3 – set Interface tpi-parent-id type=patch options:peer=tpt-parent-id

一个patch port被创建用来连接trunk网桥和br-int,tbt-parent-id口不关联tag值,用以通过不打tag值的流量,br-int上的tpi-parent-id口关联VLAN tag为3,与之前br-int上的处理一样。同时,ovs agent会在tpt-parent-id和tpi-parent-id的external_ids字段中设置为trunk id。

创建subport的流程
当一个subport被添加到一个parent_port,但是这个没有一个虚拟机使用这个parent_port,agent不会处理subport,当一个虚拟机使用了这个parent_port,且此时添加一个subport,ovs agent会创建一对新的patch port,执行命令如下:
ovs-vsctl add-port tbr-trunk-id spt-subport-id tag=100 – set Interface spt-subport-id type=patch options:peer=spi-subport-id
ovs-vsctl add-port br-int spi-subport-id tag=5 – set Interface spi-subport-id type=patch options:peer=spt-subport-id

spt-subport-id口关联的tag值为100,此处的VLAN tag值为subport的segmentation id。spi-subport-id口关联的tag值为本地local VLAN tag。ovs agent会在spt-subport-id和spi-subport-id的external_ids字段中设置为subport port id。

上行流量处理流程:
parent port的流量从br-int上的tpi-parent-id口出来,剥去VLAN tag 3,到达tpt-parent-id后发送到tap1口,tap1把不带tag的流量送入虚拟机中。
subport的流量从br-int上的spi-subport-id口出来,剥去VLAN tag 5,到达spt-subport-id口,打上VLAN tag 100,然后送到tap1口,tap1把带100 VLAN tag的流量送入虚拟机。

下行流量处理流程:
虚拟机出来的不带tag的流量发送到tap1口,然后到达tpt-parent-id口,之后到达tpi-parent-id口打上tag 3。
虚拟机出来的带VLAN tag 100的流量发送tap1口,然后到达spt-subport-id口后,剥去tag 100,发送到spi-subport-id口,打上tag 5。

删除trunk的流程:
在现有的机制中,只有在创建VM的时候由nova创建的port才会被删除。在vlan-aware-vm这个特性中,创建虚拟机的时候为指定parent port创建,因此这个时候parent port不会被删除。Nova会删除在plug时挂载的tap口,ovs agent监控到tap口被删除掉之后,会删除trunk 网桥,并通知neutron-server把parent port置为down状态。虚拟机删除后,方可删除trunk,删除trunk后parent port随之删除。

删除subport的流程:
删除subport的时候,ovs agent会删除连接trunk 网桥和br-int的spt-subport-id和spi-subport-id的patch口。

Agent全量同步的处理流程:
在全量同步的过程中,agent应该检查所有的trunk和subport是否是有效的,如果存在残留的数据根据前面的删除流程进行清理。

本文对社区VLAN aware VMS的南向实现分析完成了,后续会针对社区VLAN aware VMS这个BP的源码进行解析,敬请期待。

你可能感兴趣的:(Openstack,Neutron,云计算,OpenStack技术专刊)