版权声明:本文为博主原创文章,未经博主同意不得转载。 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. C# 静态构造函数使用

    当我们想初始化一些静态变量的时候,就需要用到静态构造函数了.这个静态构造函数属于类,而不属于实例,就是说这个构造函数只会被执行一次,即:在创建第一个实例或引用任何静态成员之前,由.NET自动调用. 现 ...

  2. 矩阵hash + KMP - UVA 12886 The Big Painting

    The Big Painting Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=88791 M ...

  3. 微软ASP.NET网站部署指南(8):部署Code-Only更新

    1.  综述 初始化部署以后,你须要继续维护和更新你的网站.本章节将向你展示一个不包含数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:假设依据本章节所做的操作出现错误信息 ...

  4. hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. leetcode 153: Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  6. 做一个WINDOWS下破解WIFI。不须要Linux抓包!

    搬家了,没网了. 没有WIFI了! 想破解,只是没有Linux环境,不能抓包!破解! 于是自己动手开工. 在windows 下直接破解.貌似国内 还没看到.假设有了,那么请各位童鞋 提醒一下.赶急 要 ...

  7. Hadoop单机安装配置过程:

    1. 首先安装JDK,必须是sun公司的jdk,最好1.6版本以上. 最后java –version 查看成功与否. 注意配置/etc/profile文件,在其后面加上下面几句: export JAV ...

  8. Visual Studio 32位64位的问题和如何编译32位64位工程的问题

    Visual Studio自身没有32位和64位的分别,对于某一个特定的版本只有一个版本安装文件(即不存在32位版本的VS2015安装文件和64位版本的VS2015安装文件) 对于自己开发的工程,编译 ...

  9. m2014-software->Word2010发布博客文章至Cnblogs

    转自:http://www.cnblogs.com/xfiver/archive/2011/12/26/2301591.html 昨夜喝醉,今天早起梳理情绪,看下如何使用word2010直接写cnbl ...

  10. Java知识点梳理——集合

    1.定义:Java集合类存放于java.util包,是存放对象的容器,长度可变,只能存放对象,可以存放不同的数据类型: 2.常用集合接口: a.Collection接口:最基本的集合接口,存储不唯一, ...