openstack学习之neutron_ml2_plugin


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
和neutron中的网络拓扑对应,有local,flat,vlan,gre,vxlan等。实现和底层实现技术无关的代码,有4个接口:
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

你可能感兴趣的:(openstack)