OpenStack虚机网卡的创建过程

原文:https://www.sdnlab.com/20286.html

OpenStack最基本和常用的操作就是启动虚机。虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡。虚机的创建和管理是Nova的任务,虚机网络的创建和管理是Neutron的任务,而虚机网卡,作为连接虚机和虚机网络的桥梁,其创建和管理则同时涉及了Nova和Neutron。这次介绍一下,OpenStack中虚机的网卡的创建过程。虽然本文的介绍将基于OpenVSwitch,但是你可以发现,很少有特殊于OpenVSwitch的地方,所以其他的二层机制(例如:Linux Bridge)过程都是类似的。

注:本文的所有分析都是基于OpenStack 17年上半年的代码(Pike版本),因此本文只反应OpenStack在那个时间点的行为。

先假设我们有一个典型的基于OpenVSwitch的OpenStack环境,服务的分布如下。

Neutron L2 Agent上线:

首先是所有的服务上线,看neutron-openvswitch-agent的启动。

  • OpenVSwitch agent 启动,注册一个定时程序:neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent.__init__
  • 在定时程序内部,通过RPC向Neutron Server定时上报自己的状态:neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent._report_state
  • 在Neutron Server,对应的RPC处理方法中,Neutron Server将Agent上报的状态写入自己的DB:neutron.db.agents_db.AgentExtRpcCallback.report_state

到此为止,Neutron Server知道了Neutron OpenVSwitch Agent的状态及相关信息,这一步的示意图如下所示。

设想有这么一个场景,如果同时有N个计算节点,由于电源问题,这些计算节点同时断电重启。那么当这些计算节点上的OpenVSwitch Agent恢复之后,由于启动时间比较集中,它们会在一个相对集中的时间点,定时向Neutron Server上报自己的状态。这涉及到Neutron Server处理RPC请求,写DB,还有一些逻辑处理。所以当N足够大时,会周期性的给Neutron Server带来高负荷。这是实际应用和优化需要注意的一个地方。

创建一个虚机,OpenStack创建逻辑端口(port)

接下来通过调用Nova的REST API创建一个虚机,并且nova scheduler将虚机分布到了计算节点。Nova计算节点上的nova-compute进程会:

  • 调用Neutron REST API创建端口(port):nova.network.neutronv2.api.API.allocate_for_instance

这里创建端口只是逻辑验证,Neutron Server会在自己的DB里面创建一个相应的,基本为空的端口

  • 根据Nova掌握的信息,更新端口:nova.network.neutronv2.api.API._update_ports_for_instance

这里nova向Neutron传递的端口信息包括(列举一部分):

  • device_id: 虚机的uuid
  • device_owner: 由compute+虚机所在的Nova Availability Zone组成的字符串,例如“compute: nova”
  • dns_name: 虚机的hostname, 通常为虚机name
  • binding:host_id: nova-compute所在的host id,可以是hostname,也可以是IP地址
  • binding:profile: 一些额外的信息,例如SRIOV信息

Neutron Server在收到这些信息之后,主要处理流程如下:

  • nova-compute调用Neutron Server更新端口,请求在这里处理:neutron.plugins.ml2.plugin.Ml2Plugin.update_port
  • 之后处理port bind:neutron.plugins.ml2.plugin.Ml2Plugin._bind_port
  • 调用到Neutron ML2的Mechanism Manger做port bind:neutron.plugins.ml2.manager.MechanismManager._bind_port_level
  • 再调用到Neutron ML2的OpenVSwitch Mechanism Driver做实际的port bind:neutron.plugins.ml2.drivers.mech_agent.AgentMechanismDriverBase.bind_port
  1. 虽然这是个通用类,但是OVS Mechanism Driver继承自这个类。
  2. 在这个方法里面,会检查在指定的host上有没有相应的L2 Agent,所以这一步依赖之前一步的Neutron OpenVSwitch Agent状态上报
  3. 这里的host信息来自于nova-compute传递过来的binding:host_id
  • 将OVS对应的vif_type和vif_details两个属性传递给port:neutron.plugins.ml2.drivers.mech_agent.SimpleAgentMechanismDriverBase.try_to_bind_segment_for_agent
  • OVS的vif_type和vif_details在OVS Mechanism Driver的初始化函数里面定义:neutron.plugins.ml2.drivers.openvswitch.mech_driver.mech_openvswitch.OpenvswitchMechanismDriver.__init__

这里,定义了OVS对应的vif_type是“ovs”,而vif_details包含了一些辅助信息
vif_details里面包含了一个字段OVS_HYBRID_PLUG,如果这个字段为True,则最后虚机的网卡和br-int之间会有一个Linux Bridge来应用iptables规则。如果你了解过OpenStack底层OpenVSwitch网卡连接方式,那么你一定见过下面这张图,其中浅紫色的qbrXXX,就是因为这个字段为True才会在后面的步骤被创建。

这部分Neutron的行为都是在ML2中完成,如果你对其中一些概念不清楚,可以参考我之前介绍的ML2架构。这部分除了更新Neutron自身的数据之外,比较重要的就是将vif_type和vif_details作为port的一部分数据,返回给nova-compute。到此为止,虚机的网卡还没有创建,所有的操作都还只是在逻辑层面,只有数据库的数据发生了变化。并且,在Neutron的数据库中,port的状态现在是Down。但是,Nova和Neutron都知道了接下来要创建的网卡的具体信息,这一步的实际意义在于两个相对独立的项目之间的数据同步。现在,OpenStack整体示意图如下所示:

 

Nova-compute创建虚拟网卡

虽然说Neutron是OpenStack里面的网络服务项目,但是OpenStack里面的虚机网卡,却是由Nova创建的。nova-compute在从Neutron Server拿到了端口的信息之后(通过update port的返回数据):

  • 调用相应的虚拟化Driver,继续创建虚机:nova.compute.manager.ComputeManager._build_and_run_instance
  • 在Driver内部,创建网络相关内容:nova.virt.libvirt.driver.LibvirtDriver.spawn
  • 在Driver内部,通过调用os-vif库,创建虚机网卡。由于nova-compute现在已经知道了虚机网卡的所有信息,适用于虚机的网卡被创建出来:nova.virt.libvirt.driver.LibvirtDriver.plug_vifs

至此,虚机的虚拟网卡真正的创建出来了。但是,在Neutron的数据库中,port的状态现在是Down。到此为止,OpenStack的整体示意图如下所示:

 

Neutron检测虚拟网卡状态并更新port状态

虚机的虚拟网卡被插入到OVS网桥上,对于Neutron来说,接下来就是接管这个网卡。

  • Neutron OpenVSwitch Agent进程中会监听OVS网桥的状态:neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent.rpc_loop
  • 当发现有新增的虚拟网卡时,先从Neutron Server获取详细的网卡信息:neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent.treat_devices_added_or_updated

nova-compute在创建虚拟网卡的时候,已经将Neutron port id和一些其他信息写入到OVS port/interface中,因此Neutron从新增的虚拟网卡就能知道对应的port是那个,下图是截取的OVS数据,里面的iface-id就是Neutron port对应的ID

  • Neutron OpenVSwitch Agent本地更新完虚拟网卡之后,再通过RPC通知Neutron Server端口上线:neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent._bind_devices

至此,Neutron已经接管了虚拟网卡,并且在Neutron的数据库中,port的状态现在是Active。Neutron从这个时候开始正式接管虚机网络。OpenStack整体示意图如下所示:

总结

所以,简单来说,在OpenStack中,首先需要各个服务上线;之后Nova会创建逻辑网卡,但是Nova只知道虚机所在的host;Neutron会根据所在的host,判断出相应的网络虚拟化机制,例如ovs,linuxbridge,Neutron会把这些信息回传给Nova;Nova拿到这些信息,调用相应的方法创建虚拟网卡,并接入到虚机;Neutron会监听网桥上端口的变化,发现有上线的端口,与自己本身的数据进行匹配,匹配到了之后接管这个虚拟网卡。对于Neutron来说,它不关心虚拟网卡接的是虚机还是容器还是别的什么,它只能看到虚拟网卡。

转载于:https://www.cnblogs.com/liuhongru/p/11076750.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js中的原型与原型链

js的学习有三座大山, 原型/原型链 、 作用域/闭包 、 异步/单线程,这三个知识点虽然基础但是入门时理解起来比较困难,本文先整理总结原型和原型链这一知识点。 1. 原型链怎么来的?对象的原型和function的prototype属性有什么关系…

HTML5 audio 如何实现播放多个MP3音频

<audio>标签是HTML5中的新标签&#xff0c;定义声音用于嵌入音频内容&#xff0c;比如音乐或其他音频流。用的比较多音频格式是.mp3。 <audio>标签常用属性如下表 属性值描述autoplayautoplay添加该属性后&#xff0c;音频会自动播放controlscontrols设置后&…

windwos下ntp服务器配置 arm平台ntp客户端获取同步时间

项目需要使用同步时间&#xff0c;在arm-linux开发板上&#xff0c;移植了ntp客户端&#xff0c;查看了一些资料&#xff0c;最终发现使用windows自带的ntp服务器比较方便&#xff0c;而且很靠谱&#xff0c;使用配置了一番&#xff0c;已经能够正常使用 详细步骤&#xff1a; …

BOM(Browser Object Model)

BOM&#xff08;浏览器对象模型&#xff09;&#xff0c;提供了一系列操作浏览器&#xff0c;获取浏览器信息的接口。这些接口在平时的工作中会经常用到&#xff0c;例如当前页面的刷新&#xff0c;获取url的参数等等。 注&#xff1a;图片来自 http://www.dreamdu.com/javascr…

入门 IT 行业,该具备哪些技能?

对于刚开始进入IT的新人来说&#xff0c;“必备技能”往往意味着一个长长的、标有重要度的学习列表&#xff0c;但是过长的列表通常会导致新人不知如何开始学习&#xff0c;压力倍增。本文尝试列举出最重要的几个技能&#xff0c;也期望通过此列表能给新人一个比较明确的学习重…

实验七作业

Part 1:验证性实验 将line29&#xff1a;for(i0;i<N;i)改为while(!feof(fp)) // 从文本文件file1.dat中读取数据&#xff0c;找出最高分和最低分学生信息&#xff0c;并输出在屏幕上 #include <stdio.h> #include <stdlib.h>#define N 10// 定义一个结构体类型…

块级格式化上下文(Block Formatting Context)

CSS块级格式化上下文是块级盒子的一种能力&#xff0c;这种能力并不是直接通过css属性声明而获得的&#xff0c;而是添加css的一部分相关属性之后自动获得的能力&#xff0c;也就是说没有一个明确的属性就是生成块级格式化上下文的。 块级格式化上下文的能力就是让具有该能力的…

前端性能优化方法总结

一个网站前端性能的好坏很大程度上影响了用户愿不愿意使用访问这个网站&#xff0c;因此对前端进行性能优化是个很重要的事情。  对于前端性能优化这个问题&#xff0c;主要学习自yahoo前端性能团队总结的35条黄金定律总结&#xff0c;觉得很全很赞&#xff0c;做个学习总结和…

Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单&#xff0c;一旦您开始看到性能改进&#xff0c;它就会变得非常有趣。 但是&#xff0c;当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时&a…

Java英雄:丹·艾伦

“ Java英雄 ”系列休息了很长时间。 老实说&#xff0c;我想即使有很多人想在这里收录&#xff0c;它也可能会以虚无收场。 其中之一是丹。 我第一次要求他捐款已经将近一年半了&#xff0c;与此同时发生的一切&#xff0c;让我不再有任何答案就让我安心了。 但是以下内容在Ja…

Java-Class-I:java.util.List

ylbtech-Java-Class-I&#xff1a;java.util.List1.返回顶部 1.1、import java.util.ArrayList;import java.util.List; 1.2、List<Integer> newList new ArrayList<Integer>();newList.add(3); 2、 2.返回顶部1.1、import java.util.*;public class Test{public …

推荐:个人时间跟踪工具 ManicTime

在《个人管理 &#xff0d; 目标管理之前&#xff0c;你会时间管理吗》中我介绍的时间管理三阶段之一“对时间的实际去处进行记录”时说过现在有很多时间管理工具&#xff0c;也有人希望我介绍一下我使用的工具&#xff0c;那么我就利用中午休息时间&#xff0c;马上给大家介绍…

SQL Server 2005怎样进行性能排错

很少会有偶然的性能下降。设计不良的数据库或工作负载配置不正确的系统会经常导致性能问题。管理员需要能预先阻止或最小化问题的影响&#xff0c;当管理员遇到问题时&#xff0c;应该诊断问题并采取正确操作来修复问题。本文提供了按部就班的指导&#xff0c;通过使用可用的工…

JVM PermGen –您在哪里?

这篇文章介绍了JVM内存结构的一些基础知识&#xff0c;并快速窥视了PermGen&#xff0c;以了解自Java SE 8出现以来它已消失的地方。 裸基础 JVM只是系统上运行的另一个进程&#xff0c;魔术始于java命令。 像任何OS进程一样&#xff0c;它需要内存才能运行。 记住– JVM本身是…

python6-函数

转载于:https://www.cnblogs.com/WIU1905/p/11101249.html

Windows Phone 7.1 “芒果” SDK Beta 下载地址

Windows Phone 7.1 “芒果” SDK Beta 今天早上发布&#xff0c;第一时间下载体验。功能果然激动人心。 下载地址&#xff1a; 离线ISO请点我&#xff0c; 在线安装请点我。转载于:https://www.cnblogs.com/finehappy/archive/2011/05/25/2056849.html

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址&#xff1a;https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置&#xff0c;在搜索框输入&#xff1a;系统高级设置。 新建环境变量&#xff0c;并输入bin目录具体位置。 安装检查 按住 w…

Java黑科技之源:JVMTI完全解读

Java生态中有一些非常规的技术&#xff0c;它们能达到一些特别的效果。这些技术的实现原理不去深究的话一般并不是广为人知。这种技术通常被称为黑科技。而这些黑科技中的绝大部分底层都是通过JVMTI实现的。 形象地说&#xff0c;JVMTI是Java虚拟机提供的一整套后门。通过这套后…

常见的CSS布局

各种常见的CSS布局 在工作中会经常用到很多的布局方式&#xff0c;这里总结一下所遇到的布局&#xff0c;会持续更新。 悬挂布局 实现这种布局的方式有很多&#xff0c;这边主要挑两个&#xff0c;如下&#xff1a; 方式一&#xff1a;使用浮动和块级格式化上下文特性 这种…

OSCP-Kioptrix2014-2 漏洞利用

pChart 2.1.3 文件包含漏洞 搜索漏洞查看漏洞理由代码:hxxp://localhost/examples/index.php?ActionView&Script%2f..%2f..%2fetc/passwd 之前的8080端口禁止访问,看看apache的配置:http://192.168.1.78/pChart2.1.3/examples/index.php?ActionView&Script%2f..%2f..…