在介绍ml2之前,先介绍下以往的core-plugin,它主要的工作是与数据库打交道,真正起作用的是agent,然而对于每种core-plugin来说他们绝大部代码是重复的,在实际的网络部署中,想用linuxbridge就不能用openvswitch,想用vlan就不能用gre。Ml2插件就可以很好解决这样的问题,在复杂的二层网络中可以灵活地部署网络。
Ml2插件是一种允许OpenStack网络同时地利用多种二层网络技术的框架。目前与openswitch、linuxbridge、hyperv L2 agent协同工作。ml2框架对简化新增L2网络技术的做了很好支持,比起以往新增加的核心插件,ML2框架需要更少的初期以及后期维护工作。
ML2驱动包括类型驱动和机制驱动,分别实现了网络类型和网络机制的可扩展性。
1)类型驱动(TypeDriver):
类型驱动可以管理多种网络类型,目前支持local, flat, vlan, gre, vxlan等。
2)机制驱动(MechanismDriver):
机制驱动处理由类型驱动建立的信息,并且确保能够用于指定的网络机制。机制驱动接口支持网络、子网、端口的创建、更新、删除操作。对每个资源,机制驱动暴露出两种方法ACTION_RESOURCE_precommit,和ACTION_RESOURCE_postcommit。这种precommit方法用于验证action是否有效和维护机制驱动的私有的数据库,并且这种方法不能被阻塞。postcommit主要负责操作资源。
举个例子,看下cisco的update_port机制驱动的两个方法,你可以自己跟踪一下, update_port_precommit维护自己私有的数据库,update_port_postcommit配置物理交换机。
def update_port_precommit(self, context):
port = context.current
if self._is_deviceowner_compute(port) and self._is_status_active(port):
self._port_action(context, self._configure_nxos_db)