透过现象看本质——谈谈ML2 plugin这回事儿

透过现象看本质——谈谈ML2 plugin这回事儿

本文关键词:OpenStack、Neutron Plugin、Neutron Agent、Core Plugin、ML2插件、ML2架构、Driver、紧耦、解耦。

前言

​ 在OpenStack中,其控制管理着计算、存储、网络三大资源。要想明白OpenStack是如果对计算、存储和网络资源进行管理的,就需要清楚OpenStack的架构,模块组成和各自分工的任务等等。

​ 而网络是作为OpenStack中最为核心之一的、也是相对于其他最为复杂的一块,因此需要细品~

​ 今天就来透过现象看本质,谈一谈ML2插件这回事儿~

Neutron Plugin是个什么鬼?

​ Plugin——插件,根据百度搜索的结果,其介绍为:一种遵循一定规范的应用程序接口编写出来的程序。那么什么是Neutron插件呢?不用想太多,其实就是有关网络的插件,可以使Neutron提供完整的服务。

​ 我们知道,在OpenStack中,总的来说插件的作用可以理解为:

  • 处理Neutron Server发来的请求;

  • 维护OpenStack中网络的状态;

  • 调用agent处理请求;

​ 由此也可以明白,在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 Core Plugin又是个什么鬼?

​ ML2——Moduler Layer 2,是Neutron在H版本实现的一个新的核心插件,用来替代原来的linux bridge plugin 和open vswitch plugin。说白了,就是新的技术来了,用ML2这个核心插件换了原来的插件,一统江山了。

​ 这就又会有两个问题:

  • 为什么要更换核心插件?
  • ML2核心插件怎么用?

我们如果深究这两个问题,不难发现,这两个问题的精髓——一个涉及作用优势,另一个涉及架构原理。

​ 我们一步一步来推究这两个问题。

1、传统Core Plugin在使用过程中出现的主要问题

​ 第一个问题在前面已经提出了,主要是开发成本和效率的问题,这个问题其实从本质上来说就是稍加复杂罢了,倒不至于是最为核心的问题,最麻烦的是不易维护。而最为核心的是这第二个问题:对于不同的Neutron Provider来说,传统的核心插件是不支持它们共存使用的。

​ 怎么来理解这第二个问题呢?

​ 通过之前的了解,我们知道传统的核心插件与其代理是一一对应的,这就意味着假设选择是Linux Bridge Plugin,那么就必须使用Linux Bridge Agent,并且在OpenStack的所有节点上都必须使用Linux Bridge作为虚拟交换机作为网络提供者,OVS同样如此。

​ 我们要知道,在生产环境中,服务器的数量和对应的角色,甚至是所处的位置都可能不一样。如果每一个节点服务器上的都必须统一为同一个网络提供者,这势必会导致一系列的问题,最容易想到的就是技术更新带来的工程量的问题。

2、ML2 Core Plugin 是怎么解决传统Core Plugin的问题的?

​ ML2 Core Plugin提供了一个允许在OpenStack网络中同时使用多种Layer 2 网络技术的框架,这样可以使不同的节点可以使用不同的网络实现机制。如下图所示:

​ 通过上图所示,在采用ML2核心插件之后,可以在不同的节点服务器上分别部署不同的Agent。并且,ML2不仅支持这样的部署方式,而且可以实现与Agent的无缝集成,也就是说,之前所使用的agent不需要更改,只需要将原来的Neutron Server上的传统的核心插件换为ML2插件即可。

​ 这说明了两个方面:

  • 其他节点上的Agent可以是不一样的,并且无需更改;
  • 只需要针对ML2实现机制的原理进行研究和开发对应的功能即可(下面了解ML2的架构时再细说);

3、瞅一瞅ML2的架构

​ 如果需要了解ML2或者深入理解ML2的工作原理,就先要引入驱动的概念。在计算机中,驱动指的是驱动计算机里软件的程序。而在ML2中,驱动其实就是为了使ML2具备更好的弹性,易于扩展,方便而灵活地支持和访问多种网络类型及其机制的程序。

​ ML2对二层网络进行的抽象和建模,引入了type driver和mechansim driver,分别对应类型驱动和机制驱动。在讲述这两个驱动之前,先来瞅一眼ML2创建的架构图:

通过这幅图,可以体现出在架构设计乃至程序设计时的解耦思想,这里补充说明一下什么是紧耦和解耦:

这两者的思想恰好相反,紧耦表示二者或二者以上之间的关联、联系非常紧密,谁离开谁,单方面都无法正常工作或提供服务;解耦的意思就是多方之间虽然互相之间有一定联系,但是并非缺少谁就不能工作,例如现在非常火的容器开发,就是基于这样的思想。这样的思想在软件开发层面比较多,在运维方面则体现在架构的设计层面。

有了直观的架构格局,再来说明一下这两类驱动:

(1)Type Driver

​ type driver——类型驱动,显然从上图就可以明白,Neutron支持的每一种网络类型都有与之对应的ML2的类型驱动。

​ 类型驱动主要负责 维护 网络类型的状态,执行验证创建网络等。这些网络类型可以参考上一篇文章。

(2)Mechansim Driver

​ Mechansim Driver——机制驱动,Neutron支持的每一种网络机制都有一个对应的ML2 机制驱动。(有的可能没听说过,本文暂且忽略)

​ 机制驱动主要负责 获取 由Type Driver维护的网络状态,并确保在相应的网络设备(物理或虚拟)上正确实现这些状态。

4、理一理ML2驱动工作的过程

​ 可能,如此直白的解释不仅抽象而且无聊,还是通过一个例子来简述一下吧,也好方便理解一下ML2插件的工作过程。

​ 假设type driver为Vlan,mechansim driver为Linux Bridge,我们需要创建一个vlan 10的网络。这个创建的过程是这样的:

  1. vlan type driver会确保将vlan10的信息保存到Neutron数据库中,包括network的名称,vlan ID等;
  2. 对应的linux bridge 的mechanism driver会确保各节点上的linux brige agent在物理网卡上创建ID为10的vlan设备和bridge设备,并将两者进行桥接;

补充说明:

  1. Linux Bridge Driver支持的type包括local、flat、vlan、and vxlan;
  2. Open Vswitch Driver除了这4种type还支持gre;
  3. L2 population driver作用是优化和限制overlay网络中的广播流量;
  4. vxlan和gre都属于overlay网络;

结尾来一个小总结

​ 本文将述了有关ML2核心插件的相关内容,通过问题的引出深入浅出理解neutron目前使用最为广泛的ML2核心插件。ML2插件是核心插件,替换了传统的插件,通过引入两个驱动,解决了传统核心插件带来的问题。这也体现出在架构设计中所需要考虑的问题,尤其是可扩展性方面。此外,通过本文可以了解有关驱动的作用以及理解紧耦和解耦的思想。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章