版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/zhoumingbo532/article/details/27964675

在介绍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)

 

def update_port_postcommit(self, context):

    port = context.current

        if self._is_deviceowner_compute(port) and self._is_status_active(port):

            self._port_action(context, self._configure_switch_entry)

 

Ml2工作机制:

  在ml2框架中实现了两个Manager:TypeManager和MechanismManager,分别管理类型驱动和网络驱动。TypeManager能够依据用户创建的网络类型调用相应的类型驱动,MechanismManager是依据计算节点的部署环境和neuron配置文件决定调用哪种机制驱动。

1)类型驱动:

不同的类型驱动都有自己的ml2_*TYPE*_allocations表。类型驱动主要工作维护自己的数据库表:

ml2_gre_allocations;

+-----------+------------+------+-----+---------+-------+

| Field     | Type       | Null | Key | Default | Extra |

+-----------+------------+------+-----+---------+-------+

| gre_id    | int(11)    | NO   | PRI | NULL    |       |

| allocated | tinyint(1) | NO   |     | NULL    |       |

+-----------+------------+------+-----+---------+-------+

 ml2_vlan_allocations;

+------------------+-------------+------+-----+---------+-------+

| Field            | Type        | Null | Key | Default | Extra |

+------------------+-------------+------+-----+---------+-------+

| physical_network | varchar(64) | NO   | PRI | NULL    |       |

| vlan_id          | int(11)     | NO   | PRI | NULL    |       |

| allocated        | tinyint(1)  | NO   |     | NULL    |       |

+------------------+-------------+------+-----+---------+-------+

2)机制驱动

机制驱动能够在openstack环境中同一时候使用不同的网络机制。那么他是怎样工作的呢?假如我的计算节点A(c-a)。部署了neutron-openvswitch-agent服务,当启动虚拟机时(指定网络id)。nova-scheduler把虚拟机调度到c-a节点上,c-a的nova-compute服务会调用neutron的create_port接口,当中create_port中会使用一个非常重要的方法:bind_port(MechanismManager),MechanismManager.bind_port会循环调用全部支持的网络机制的bind_port方法进行端口与agent绑定,绑定成功则返回。

openvswitch机制驱动bind_port主要依据调度到c-a的主机名和机制驱动的agent_type去数据库agents表中找相应的agent服务的信息(每种机制驱动都有自己的agent_type和vif_type。c-a的主机名是通过create_port携带的binding:host_id获得),再推断openvswitch是否支持端口所在的网络类型。

经过上面的处理就把端口和openvswitch这样的网络机制绑定起来。

详细操作例如以下:

MechanismManager:

    def bind_port(self, context):

        binding = context._binding

        for driver in self.ordered_mech_drivers:#循环顺序调用

            try:

                driver.obj.bind_port(context)#调用机制驱动的bind_port

                if binding.segment:

                    binding.driver = driver.name              

                    return#绑定上则返回

            except Exception:

                LOG.exception(_("Mechanism driver %s failed in "

                                "bind_port"),

                              driver.name)

        binding.vif_type = portbindings.VIF_TYPE_BINDING_FAILED

 

 

MechanismDriver:

    def bind_port(self, context):

        vnic_type = context.current.get(portbindings.VNIC_TYPE,

                                        portbindings.VNIC_NORMAL)

        if vnic_type not in self.supported_vnic_types:

            return   

        for agent in context.host_agents(self.agent_type):#依据agent_type和bind_host从数据库表agents获去

            if agent['alive']:

                for segment in context.network.network_segments:

                    if self.try_to_bind_segment_for_agent(context, segment,

                                                          agent):#检測网络机制是否支持port所在网络的网络类型

                        return#绑定上则返回

            else:

                LOG.warning(_("Attempting to bind with dead agent: %s"),

                            agent)

 

绑定完毕会在数据库中记录绑定的信息

ml2_port_bindings;

+--------------------------------------+--------+----------+-------------+--------------------------------------+-----------+------------------------------------------------+---------+

| port_id                              | host   | vif_type | driver      | segment                              | vnic_type | vif_details                                    | profile |

+--------------------------------------+--------+----------+-------------+--------------------------------------+-----------+------------------------------------------------+---------+

| 54259db7-68f2-4b33-a37c-8f134100f3fc | ubuntu | ovs      | openvswitch | 884cc396-ccec-4e56-9dc8-e6ccd3e7c9ea | normal    | {"port_filter": true, "ovs_hybrid_plug": true} |         |

| 5e1c574a-e345-4c65-889f-59bff79fa31d | ubuntu | ovs      | openvswitch | 884cc396-ccec-4e56-9dc8-e6ccd3e7c9ea | normal    | {"port_filter": true, "ovs_hybrid_plug": true} | {}      |

+--------------------------------------+--------+----------+-------------+--------------------------------------+-----------+------------------------------------------------+---------+

Nova端会依据vif_type使用不同的网络机制。

neutron ml2的更多相关文章

  1. Neutron/ML2学习

    Neutron/ML2 Neutron ML2 模块层2(ml2)插件是一种允许OpenStack网络同时地利用在复杂现实数据中心发现的各种第二层网络技术的框架.目前它与存在的openvswitch. ...

  2. openstack学习之neutron ml2初始化代码分析

    这里没有 去详细考虑neutron server怎么初始化的,而是直接从加载插件的地方开始分析.首先我们看下下面这个文件. Neutron/api/v2/router.py class APIRout ...

  3. Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  4. 【OpenStack】OpenStack系列8之Nova详解 Neutron详解

    Neutron下载安装 下载:git clone -b stable/icehouse https://github.com/openstack/neutron.git pip install -r ...

  5. OpenStack源码分析 Neutron源码分析(一)-----------Restful API篇

    原文:https://blog.csdn.net/happyanger6/article/details/54586463 首先,先分析WSGI应用的实现. 由前面的文章http://blog.csd ...

  6. openstack网络服务Neutron(六)

    一.Neutron控制节点安装 1.Neutron安装 [root@linux-node1 ~]# yum install -y openstack-neutron openstack-neutron ...

  7. 理解 neutron

    之前大师发个结构图. understanding_neutron.pdf 自己走读了代码: 1.  get_extensions_path() # 在/opt/stack/neutron/neutro ...

  8. Openstack Neutron:三层技术和实现

    目录 - 1.Neutron 三层技术简介 - 2.集中式router - 1.在节点上安装L3 agent - 2.配置外部网络 - 3.通过CLI或者Horizon 来创建路由 - 4.连接租户网 ...

  9. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

随机推荐

  1. HashMap原理<转>

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  2. OSX活动监视器关闭spotlight 、mds_stores等进程

    如果是机械盘,spotlight .mds_stores严重影响使用体验 今天早上一开机,设备速度慢的受不了,随便打开一个应用都几分钟.通过top查看,CPU剩余90%以上.所以并不是CPU不足导致. ...

  3. java的开发主要以http为基础

    java的开发主要以http为基础. 反射:主要用于工具和框架的开发. 反射是对于类的再抽象:通过字符串来抽象类. JAVA类的运行:classLoader:加载到虚拟机(vm) Vm中只能存储对象( ...

  4. 测试RESTful API利器-Postman

    对于前端开发者而言,最需要的往往不是技术本身,其实技术都没什么难的,而最缺少的则是各种各样好的兵器,比如调试,开发工具等等. 我们这里就推荐一款前端开发的利器-Postman,它是Google Chr ...

  5. javascript -- 事件捕获,事件冒泡

    使用js的时候,当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,单击子元素时,父元素的onclick事件也会被触发.js里称这种事件连续发生的机制为事件冒泡或者事件捕获. 为什么会 ...

  6. duilib Webkit内核dui化浏览器控件

    參考http://blog.csdn.net/zhuhongshu/article/details/38540711 改进: 1.跟其它duilib控件一样,不包括窗体 2.将onURLChanged ...

  7. redis的使用和安装,redis基础和高级部分

    redis的使用和安装,redis基础和高级部分 在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数 ...

  8. js 文件上传进度条

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. asp.net后台cs中的JSON格式变量在前台Js中调用方法(前后台示例代码)

    //后台cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  10. JBPM4 经常使用表结构及其说明

    首先我想说.这不一篇原创博文. 这里设置成原创.主要是为了分享,由于它对于jbpm的刚開始学习的人,真的值得一看.原作者的博文地址并没有查到,我是在还有一位转载此文的博主那儿获得的.地址在这儿. 本文 ...