VLAN aware VMs

该项目为社区neutron项目中在Newton版本中的一个重要BP。该BP提供了一种方法如何将VLAN aware VMs纳入OpenStack。VLAN aware VMs是指VM通过vNIC发送或者接收带VLAN标记的报文。VLAN aware VMs(或其他封装)可以通过不同封装和ID区分许多网络的流量,而不是使用许多vNIC。 这个方法扩展到更多数量的网络,并实现动态处理网络附件(无需热插拔vNIC)。

一、应用场景

1.有些应用程序需要连接到许多(比如说,几百个)neutron网络。使用单个或少量的vifs,并通过VLAN区分每个网络的流量,相比每个VM使用数百个VIF来说更加实用。

2.用户使用云的时候通常非常动态。添加/删除VLAN相对来说更有效或更少复杂性,而不是通过VM中的热插拔网卡。

3.VM可以不卸载挂载网卡达到从一个网络迁移到另外一个网络。

4.VM中可能正在运行许多容器。每个容器可能有要求连接到不同的Neutron网络中。同样相对于VM添加网卡来说,添加VLANID更有效且更具扩展性。

5.对于用户来说,之前很多应用程序希望通过vlan作为连接方式连接多个网络。

二、北向实现方式

1逻辑结构模型    

+-----------+             |           |             | +-------+ |   +------+             | | port1 +-----+ net1 |             | +-------+ |   +------+  +-----+    |          |  |    |    | +-------+ |   +------+  | vm0 +------+ port0 +-----+ net0 |  |    |    | +-------+ |   +------+  +-----+    |          |             | +-------+ |   +------+             | | port2 +-----+ net2 |             | +-------+ |   +------+             |           |             +-----+-----+ *

port0为parent_port,其通信流量为正常VM流量,不带tag * port1为sub_port,其通信流量被封装,如vlan id 100 * port2为sub_port,其通信流量被封装,如vlan id 200

2、API接口扩展

  新增一种trunk的资源对象,其中trunk中存在两种port:parent_port和sub_port     

  创建trunk的接口示例如下:   

   $ neutron trunk-create --port-id PORT \    

                      [--subportPORT[,SEGMENTATION-TYPE,SEGMENTATION-ID]] \

                      [--subport ...]

  所有接口内容如下:     

POST /v2.0/trunks       

 ...   

PUT /v2.0/trunks/TRUNK-ID/add_subports     

PUT/v2.0/trunks/TRUNK-ID/delete_subports  {'subports':  [{'port_id': PORT_ID,                'segmentation_type':SEGMENTATION_TYPE,                'segmentation_id':SEGMENTATION_ID},               ...              ]}}     

GET /v2.0/trunks/TRUNK-ID/subports

3.其中trunk与parent_port为一一对应关系,trunk与sub_port为一对多关系。

4.parent_port与sub_port均为真实的port对象且有port的所有属性,仅是在某些字段表现不同,如binding:host_id

5.其中sub_port的segmentation-type字段当前仅支持vlan类型,segmentation-id为对应的vlan id

6.nova不感知trunk和sub_port,如创建VM时指定的port-id仍然是parent_port。

7.sub_port与其他独立的port一样具有独立的mac地址,sub_port也可以指定mac创建为与parent_port相同的mac,但是此时 两个port不允许在同一个网络

8.不支持嵌套sub_port

9.删除trunk自动删除所有sub_port

10.删除trunk内的sub_port是禁止的,必须首先从trunk中删除该sub_port

11.删除trunk内的parent_port是禁止的,必须首先删除trunk

三.CLI接口

* trunk-create * trunk-delete * trunk-list * trunk-show [should not print subports] * trunk-subport-add * trunk-subport-delete * trunk-subport-list

四、使用约束

1.同一个trunk下的每个sub_port应具有唯一(segmentation_type,segmentation_id)。

2.parent_port处理“untagged”流量。parent_port将收到所有不匹配subport的数据包,这是不同于VM普通port当前的的行为。还支持通过 parent_port上设置安全组丢弃所有传入和传出的流量。

3.sub_port从parent_port继承他们的binding:host_id属性。

4.更新sub_port的binding:host_id会出错,如通过一个sub_port创建VM。

5.普通租户仅能添加sub_port到自己的parent_port,admin租户可以添加到不同的租户上的parent_port。

6.在OVS支持QinQ之前,基于OVS的Neutron后端不能支持sub_port附加到“vlan_transparent”网络。这将需要可以通过VLAN标记的子端口传输 VLAN标记的流量(嵌套的VLAN),这是不可能的。

5. 数据模型 Neutron port: 无变更 新增trunks表 *id: int主键 *uuid * name * tenant_id * port_id: 外键→ports.id 新增subports * id * port_id: 外键→ports.id * trunk_id: 外键→trunks.id * segmentation_type * segmentation_id DB约束: * (segmentation_type, segmentation_id, trunk_id) 在subports表中必须唯一。 *被trunks.port_id引用的ports.id不能被subports.port_id引用,反之亦然

--------------------- 
转 https://blog.csdn.net/canxinghen/article/details/53457262

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章