本文关键词:OpenStack、Neutron Plugin、Neutron Agent、Core Plugin、ML2插件、ML2架构、Driver、紧耦、解耦。
在OpenStack中,其控制管理着计算、存储、网络三大资源。要想明白OpenStack是如果对计算、存储和网络资源进行管理的,就需要清楚OpenStack的架构,模块组成和各自分工的任务等等。
而网络是作为OpenStack中最为核心之一的、也是相对于其他最为复杂的一块,因此需要细品~
今天就来透过现象看本质,谈一谈ML2插件这回事儿~
Plugin——插件,根据百度搜索的结果,其介绍为:一种遵循一定规范的应用程序接口编写出来的程序。那么什么是Neutron插件呢?不用想太多,其实就是有关网络的插件,可以使Neutron提供完整的服务。
我们知道,在OpenStack中,总的来说插件的作用可以理解为:
处理Neutron Server发来的请求;
维护OpenStack中网络的状态;
由此也可以明白,在OpenStack Neutron项目中,插件和代理服务是相对应的,而且plugin解决的是在数据库中存放网络信息,需要解决的是网络请求时需要什么配置的问题,而agent解决的是如何具体配置网络的问题,而agent处理时需要通过Neutron provider(网络提供者)提供虚拟或物理网络(Linux Bridge或OVS或其他的物理交换机),也可以说这三者需要配套使用。
细的来说,Neutron Plugin 有两种, 一种是Core Plugin——核心插件,主要是在数据库中维护network、subnet和port的状态,并负责调用相应的agent在network provider上执行相关操作,比如创建network;另一种是Service Plugin——服务插件,主要是在数据库中维护router、load balance、security group等资源的状态,并负责调用相应的agent在network provider上执行相关操作,比如创建router。
那么,plugin的其中一个职责就是维护Neutron网络的状态信息的,那么这就产生了一个问题:
对于不同的Neutron Provider的plugin,就需要对每种plugin写一个十分类似的代码用来访问数据库,这样代码又多又冗杂。于是就有了ML2插件,来解决这个问题,当然,也不仅仅是因为这个原因。下面就来聊聊ML2插件吧。
ML2——Moduler Layer 2,是Neutron在H版本实现的一个新的核心插件,用来替代原来的linux bridge plugin 和open vswitch plugin。说白了,就是新的技术来了,用ML2这个核心插件换了原来的插件,一统江山了。
这就又会有两个问题:
我们如果深究这两个问题,不难发现,这两个问题的精髓——一个涉及作用优势,另一个涉及架构原理。
我们一步一步来推究这两个问题。
第一个问题在前面已经提出了,主要是开发成本和效率的问题,这个问题其实从本质上来说就是稍加复杂罢了,倒不至于是最为核心的问题,最麻烦的是不易维护。而最为核心的是这第二个问题:对于不同的Neutron Provider来说,传统的核心插件是不支持它们共存使用的。
怎么来理解这第二个问题呢?
通过之前的了解,我们知道传统的核心插件与其代理是一一对应的,这就意味着假设选择是Linux Bridge Plugin,那么就必须使用Linux Bridge Agent,并且在OpenStack的所有节点上都必须使用Linux Bridge作为虚拟交换机作为网络提供者,OVS同样如此。
我们要知道,在生产环境中,服务器的数量和对应的角色,甚至是所处的位置都可能不一样。如果每一个节点服务器上的都必须统一为同一个网络提供者,这势必会导致一系列的问题,最容易想到的就是技术更新带来的工程量的问题。
ML2 Core Plugin提供了一个允许在OpenStack网络中同时使用多种Layer 2 网络技术的框架,这样可以使不同的节点可以使用不同的网络实现机制。如下图所示:
通过上图所示,在采用ML2核心插件之后,可以在不同的节点服务器上分别部署不同的Agent。并且,ML2不仅支持这样的部署方式,而且可以实现与Agent的无缝集成,也就是说,之前所使用的agent不需要更改,只需要将原来的Neutron Server上的传统的核心插件换为ML2插件即可。
这说明了两个方面:
如果需要了解ML2或者深入理解ML2的工作原理,就先要引入驱动的概念。在计算机中,驱动指的是驱动计算机里软件的程序。而在ML2中,驱动其实就是为了使ML2具备更好的弹性,易于扩展,方便而灵活地支持和访问多种网络类型及其机制的程序。
ML2对二层网络进行的抽象和建模,引入了type driver和mechansim driver,分别对应类型驱动和机制驱动。在讲述这两个驱动之前,先来瞅一眼ML2创建的架构图:
通过这幅图,可以体现出在架构设计乃至程序设计时的解耦思想,这里补充说明一下什么是紧耦和解耦:
这两者的思想恰好相反,紧耦表示二者或二者以上之间的关联、联系非常紧密,谁离开谁,单方面都无法正常工作或提供服务;解耦的意思就是多方之间虽然互相之间有一定联系,但是并非缺少谁就不能工作,例如现在非常火的容器开发,就是基于这样的思想。这样的思想在软件开发层面比较多,在运维方面则体现在架构的设计层面。
有了直观的架构格局,再来说明一下这两类驱动:
type driver——类型驱动,显然从上图就可以明白,Neutron支持的每一种网络类型都有与之对应的ML2的类型驱动。
类型驱动主要负责 维护 网络类型的状态,执行验证创建网络等。这些网络类型可以参考上一篇文章。
Mechansim Driver——机制驱动,Neutron支持的每一种网络机制都有一个对应的ML2 机制驱动。(有的可能没听说过,本文暂且忽略)
机制驱动主要负责 获取 由Type Driver维护的网络状态,并确保在相应的网络设备(物理或虚拟)上正确实现这些状态。
可能,如此直白的解释不仅抽象而且无聊,还是通过一个例子来简述一下吧,也好方便理解一下ML2插件的工作过程。
假设type driver为Vlan,mechansim driver为Linux Bridge,我们需要创建一个vlan 10的网络。这个创建的过程是这样的:
补充说明:
本文将述了有关ML2核心插件的相关内容,通过问题的引出深入浅出理解neutron目前使用最为广泛的ML2核心插件。ML2插件是核心插件,替换了传统的插件,通过引入两个驱动,解决了传统核心插件带来的问题。这也体现出在架构设计中所需要考虑的问题,尤其是可扩展性方面。此外,通过本文可以了解有关驱动的作用以及理解紧耦和解耦的思想。