openstack学习之neutron_ml2_plugin

40阅读 0评论2019-10-22 hiyachen
分类:云计算

neutron中定义了许多Rest API,API的具体实现放到plugin中实现。

neutron plugin

neutron设计了plugin的机制来实现这些定义的API。网络虚拟化的是实现技术可以有很多种(可以参考博文《网络虚拟化技术》),不同的是实现技术可以使用一个plugin来实现。

每种plugin代表了一种网络虚拟化的实现技术。不同的实现技术所提供的对外管理接口各不相同,plugin用来实现neutron rest api和相应实现接口之间的适配。

实现技术可以有两种部署方式:

1)分布式方式,多为VEB技术采用。VEB安装在每个计算节点上,每个计算节点同时安装一个core agent。plugin通过和几点上的agent通信来在节点上实现neutron中定义的网络结构。代表产品如open vswitch, cisco Nexus 1000V等。
2)集中式方式,多为硬件实现采用。硬件实现网络虚拟化实现类似于传统的交换机,内部支持VEPA或VN-TAG技术。计算节点接入该交换机,通过neutorn plugin实现对交换机的配置来实现neutron中定义的网络结构。硬件实现会有更好的性能,但一个问题是扩展性(scalability),目前的Plugin中,一般只能管理一个交换机。代表产品有brocade的VDX 67xx series等

neutron中只能加载一个plugin,这导致了openstack中只能使用一种虚拟网络实现技术,为了解决这个问题,出现了meta plugin和ml2 plugin。

meta plugin

meta plugin可以同时加载多个plugin,并将rest api转发给各个plugin。meta plugin是一种比较巧妙的设计,对现有的plugin不需要改动。meta应该是一个权宜之计(work around),并不是完美的解决方案。

ml2 plugin

ml2 plugin则是重新定义了一套框架,来支持不同的虚拟网络实现技术。ml2 plug和原来的plugin不兼容,原来的plugin需要改写成ml2 mechanism driver。和meta比,ml2的结构更清晰,扩展性更强,ml2应该是未来neutron plugin的方向。

核心概念:

TypeDriver

关于segment:Segment可以描述为对物理网络一部分的描述,比如它可以是物理网络中很多VLAN中的一个VLAN。ML2使用下面结构定义一个Segment
{NETWORK_TYPE,PHYSICAL_NETWORK,SEGMENTATION_ID}
如果Segment对应了物理网络中的一个VLAN,则这里的SEGMENTATION_ID就是这个VLAN的VLAN ID,如果Segment对应了物理网络中的一个Tunnel,则SEGMENTATION_ID就是这个Tunnel的Tunnel ID。
和neutron中的网络拓扑对应,有local,flat,vlan,gre,vxlan等。实现和底层实现技术无关的代码,有4个接口:(./neutron/plugins/ml2/drivers/type_vlan.py)
def validate_provider_segment(self, segment): 检查
def reserve_provider_segment(self, session, segment):预分配
def allocate_tenant_segment(self, session): 分配
def release_segment(self, session, segment): 释放
TypeDriver的代码和具体的底层实现无关,所有的实现都可以复用这部分代码。

MechanismDriver

用来将rest api转化为底层实现技术的调用,类似于原来的Plugin实现。每种网络虚拟化实现要实现自己的MechanismDriver来驱动后端的实现。

ml2的核心就是可以加载多个mechanism drivers,在一个openstack环境中支持多种虚拟网络实现技术。如有些节点可以使用openvswitch,有些则使用cisco Nexus 1000V等。

ml2的基本代码逻辑:

针对每个rest api,会调用所有mechanism driver的相应方法(这个思路和meta中遍历调用Plugin的方法类似)。如create network:
self.mechanism_manager.create_network_precommit(mech_context)
self.mechanism_manager.create_network_postcommit(mech_context)

mechanism driver提供2个方法,一个是XXX_precommit,一个是XXX_postcommit.
XXX_precommit在一个事物中调用,过程中抛出异常,neutron中的数据库会自动回滚。
XXX_postcommit在事物外调用,过程中出现异常,neutron中的数据库不变。
开发人员需要根据业务特点,来决定使用哪种方式。

MechanismManager:
    def _call_on_drivers(self, method_name, context,
                         continue_on_failure=False):
该方法用来调用ml2加载的所有meachnism driver。

对于采用core agent的实现技术,ml2提供了可复用的框架代码,相应的mechanism driver的开发非常简单。
SimpleAgentMechanismDriverBase:提供了框架代码。
LinuxbridgeMechanismDriver:支持linux bridge的mechanism driver.
OpenvswitchMechanismDriver:支持open vswitch的mechanism driver.

其他的plugin,会逐步迁移到ml2plugin框架中。

参考:
https://wiki.openstack.org/wiki/Neutron/ML2
https://www.openstack.org/summit/openstack-summit-hong-kong-2013/session-videos/presentation/openstack-neutron-modular-layer-2-plugin-deep-dive

上一篇:nova cell v2的实现过程
下一篇:关于ssh-loopback地址