neutron ml2
版权声明:本文为博主原创文章,未经博主同意不得转载。 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的更多相关文章
- Neutron/ML2学习
Neutron/ML2 Neutron ML2 模块层2(ml2)插件是一种允许OpenStack网络同时地利用在复杂现实数据中心发现的各种第二层网络技术的框架.目前它与存在的openvswitch. ...
- openstack学习之neutron ml2初始化代码分析
这里没有 去详细考虑neutron server怎么初始化的,而是直接从加载插件的地方开始分析.首先我们看下下面这个文件. Neutron/api/v2/router.py class APIRout ...
- Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 【OpenStack】OpenStack系列8之Nova详解 Neutron详解
Neutron下载安装 下载:git clone -b stable/icehouse https://github.com/openstack/neutron.git pip install -r ...
- OpenStack源码分析 Neutron源码分析(一)-----------Restful API篇
原文:https://blog.csdn.net/happyanger6/article/details/54586463 首先,先分析WSGI应用的实现. 由前面的文章http://blog.csd ...
- openstack网络服务Neutron(六)
一.Neutron控制节点安装 1.Neutron安装 [root@linux-node1 ~]# yum install -y openstack-neutron openstack-neutron ...
- 理解 neutron
之前大师发个结构图. understanding_neutron.pdf 自己走读了代码: 1. get_extensions_path() # 在/opt/stack/neutron/neutro ...
- Openstack Neutron:三层技术和实现
目录 - 1.Neutron 三层技术简介 - 2.集中式router - 1.在节点上安装L3 agent - 2.配置外部网络 - 3.通过CLI或者Horizon 来创建路由 - 4.连接租户网 ...
- 理解Docker(5):Docker 网络
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
随机推荐
- Eclipse上配置btm
1.新建一个空的工程btm-szny,jdk版本1.6 2.在工程中导入CVS中的代码如下图
- [转]Python中函数的值传递和引用传递
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...
- 微信APP支付 - C#
最近挺忙的,没时间写东西.然后在弄微信APP支付,网上的搜索一趟,都比较凌乱,我也遇到一些坑,不过也算弄好了,记录分享一下. 1.准备各种调用接口需要的参数,配置app.config. <!-- ...
- python的zipfile实现文件目录解压缩
主要是 解决了压缩目录下 空文件夹 的压缩 和 解压缩问题 压缩文件夹的函数: # coding:utf- import os import zipfile def zipdir(dirToZip,s ...
- 通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全。
通过Hadoop安全部署经验总结,开发出以下十大建议,以确保大型和复杂多样环境下的数据信息安全. 1.先下手为强!在规划部署阶段就确定数据的隐私保护策略,最好是在将数据放入到Hadoop之前就确定好保 ...
- 5.3 SpEL语法
SqEL是一个可以独立于spring的表达式语言,即它可以用在XML中对语法进行简化 5.3 SpEL语法5.3.1 基本表达式一.字面量表达式: SpEL支持的字面量包括:字符串.数字类型(int. ...
- 怎么用MathType解决Word公式排版很乱的问题
现在办公室起草文件,期刊论文投稿.学校试着编辑都要先在Word中编辑好后再打印出来.在Word中编辑这些文本内容时,如果遇到公式就要使用专门的MathType公式编辑器.而有很多人在用MathType ...
- SQL操作【整理中...】
/////////////////////////////////////////////////////////////////////////////////////////////////数据库 ...
- 用原生Canvas写贪吃蛇及问题解决
为了学习Canvas,写了这个小游戏贪吃蛇供自己和大家学习 Github: https://github.com/zhiyishou/Gsnake Play On: http://zhiyishou. ...
- Amazon(vpc)对等网络
对等连接测试 1.1 东京账户A创建对等连接 注意,双方的vpc网段不能重复,如果重复会造成无法配置路由表 输入双方信息 账户ID和VPC 1.2 东京账户A查看 查看连接信息 显示正在处理接受,需要 ...