OpenStack虚机网卡的创建过程
  OpenStack最基本和常用的操作就是启动虚机。虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡。虚机的创建和管理是Nova的任务,虚机网络的创建和管理是Neutron的任务,而虚机网卡,作为连接虚机和虚机网络的桥梁,其创建和管理则同时涉及了Nova和Neutron

1、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

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

通过调用Nova的REST API创建一个虚机,并且nova scheduler将虚机分布到了计算节点。
Nova计算节点上的nova-compute进程会做如下事情:
1)调用Neutron REST API创建端口(port)
nova.network.neutronv2.api.API.allocate_for_instance
这里创建端口只是逻辑验证,Neutron Server会在自己的DB里面创建一个相应的,基本为空的端口

2)根据Nova 控制节点掌握的信息,neutron对相应的端口,更新状态:
nova.network.neutronv2.api.API._update_ports_for_instance
这里nova-compute向Neutron传递的端口信息包括:
a、device_id: 虚机的uuid
b、device_owner: 由compute+虚机所在的Nova Availability Zone组成的字符串,例如“compute: nova”
c、dns_name: 虚机的hostname, 通常为虚机name
e、binding:host_id: nova-compute所在的host id,可以是hostname,也可以是IP地址
f、binding:profile: 一些额外的信息,例如SRIOV信息

3)Neutron Server在收到这些信息之后,主要处理流程如下:
a、nova-compute调用Neutron Server更新端口,请求在这里处理:
neutron.plugins.ml2.plugin.Ml2Plugin.update_port
b、处理port bind:
neutron.plugins.ml2.plugin.Ml2Plugin._bind_port
c、调用到Neutron ML2的Mechanism Manger做port bind:
neutron.plugins.ml2.manager.MechanismManager._bind_port_level
d、调用到Neutron ML2的OpenVSwitch Mechanism Driver做实际的port bind:
  neutron.plugins.ml2.drivers.mech_agent.AgentMechanismDriverBase.bind_port
  虽然这是个通用类,但是OVS Mechanism Driver继承自这个类。
  在这个方法里面,会检查在指定的host上有没有相应的L2 Agent,
  所以这一步依赖之前一步的Neutron OpenVSwitch Agent状态上报
  这里的host信息来自于nova-compute传递过来的binding:host_id
e、将OVS对应的vif_type和vif_details两个属性传递给port:
neutron.plugins.ml2.drivers.mech_agent.SimpleAgentMechanismDriverBase.try_to_bind_segment_for_agentOVS的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规则,即qbrXXX,就是因为这个字段为True,才会在后面的步骤被创建

这部分Neutron的行为都是在ML2中完成。这部分除了更新Neutron自身的数据之外,比较重要的就是将vif_type和vif_details作为port的一部分数据,返回给nova-compute。到此为止,虚机的网卡还没有创建,所有的操作都还只是在逻辑层面,只有数据库的数据发生了变化。并且,在Neutron的数据库中,port的状态现在是Down。但是,Nova和Neutron都知道了接下来要创建的网卡的具体信息,这一步的实际意义在于两个相对独立的项目之间的数据同步。
4)nova-compute创建虚拟网卡

虽然说Neutron是OpenStack里面的网络服务项目,但是OpenStack里面的虚机网卡,却是由Nova创建的。
nova-compute在从Neutron Server拿到了端口的信息之后(通过update port的返回数据):
a、调用相应的虚拟化Driver,继续创建虚机
nova.compute.manager.ComputeManager._build_and_run_instance
b、在Driver内部,创建网络相关内容:
nova.virt.libvirt.driver.LibvirtDriver.spawn
c、在Driver内部,通过调用os-vif库,创建虚机网卡。由于nova-compute现在已经知道了虚机网卡的所有信息,所以虚机的网卡被创建出来
nova.virt.libvirt.driver.LibvirtDriver.plug_vifs
至此,虚机的虚拟网卡真正的创建出来了。但是,在Neutron的数据库中,port的状态现在是Down
5)Neutron检测虚拟网卡状态并更新port状态
虚机的虚拟网卡被插入到OVS网桥上,对于Neutron来说,接下来就是接管这个网卡
a、Neutron OpenVSwitch Agent进程中会监听OVS网桥的状态:
neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent.rpc_loop
b、当发现有新增的虚拟网卡时,先从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
c、 Neutron OpenVSwitch Agent本地更新完虚拟网卡之后,再通过RPC通知Neutron Server端口上线:
neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent._bind_devices
至此,Neutron已经接管了虚拟网卡,并且在Neutron的数据库中,port的状态现在是Active
总结
所以,简单来说,在OpenStack中,首先需要各个服务上线;之后Nova会创建逻辑网卡,但是Nova只知道虚机所在的host;Neutron会根据所在的host,判断出相应的网络虚拟化机制,例如ovs,linuxbridge,Neutron会把这些信息回传给Nova;Nova拿到这些信息,调用相应的方法创建虚拟网卡,并接入到虚机;Neutron会监听网桥上端口的变化,发现有上线的端口,与自己本身的数据进行匹配,匹配到了之后接管这个虚拟网卡。对于Neutron来说,它不关心虚拟网卡接的是虚机还是容器还是别的什么,它只能看到虚拟网卡

********************对OpenStack前辈们知识的整理******************

转载于:https://www.cnblogs.com/potato-chip/p/9127083.html

OpenStack虚机网卡的创建过程相关推荐

  1. Openstack虚机实例状态错误手工恢复vm_state:error

    Openstack虚机实例状态错误手工恢复vm_state:error Openstack虚机实例状态错误手工恢复vm_state:error 1.找到状态为出错状态的VM.在数据库里面表现Statu ...

  2. Openstack 虚机忘记密码

    如果我们一时间想不起来虚机的密码怎么办 不要担心,我们先在控制节点上查看一下我们的虚机列表,然后将忘记密码的虚机进行关机处理 命令:nova list  &&  nova stop I ...

  3. Azure进阶攻略丨如何驾驭罢工的Linux虚机网卡?

    很多人的生活中,流传着一个屡试不爽,据说可以解决任何问题的百宝锦囊: 所以经常可以听到类似这样的对话: -我的电脑咋上不去网了? -重启一下电脑. -还是不行呢! -重启一下路由器. -怎么还不行-_ ...

  4. 【云计算 | OpenStack】从零开始使用libvirt创建一个kvm虚机

    环境: os镜像:CentOS-7-x86_64-Minimal-2009.iso qemu-kvm:qemu-kvm.x86_64 10:1.5.3-175.el7_9.6 Libvirt:libv ...

  5. openstack实例状态错误_Openstack虚机操作总结

    1. 概览 Openstack作为常见的IAAS服务,其最核心的对象就是虚机实例,而Openstack下支持的虚机操作有很多种,有些是特别常见的虚机操作比如创建虚机.启动虚机.删除虚机等,而有些虚机操 ...

  6. 【云计算 | Openstack】KVM虚机通过dhcp自动获取地址

    环境: os:centos7 1. 背景 前文 [云计算 | OpenStack]从零开始使用libvirt创建一个kvm虚机 中的虚机使用的是基于Linux网桥的虚拟网卡,如下xml文件中的定义 # ...

  7. OpenStack+Ceph集群 虚机实例扩容

    OpenStack+Ceph集群 虚机实例扩容 在虚机上进行minio测试操作的时候,提示fatal error: runtime: out of memory 怀疑是虚机分配的1G内存不够用了,需要 ...

  8. 一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法

    一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法 一.发明名称 一种云平台中基于虚机和订单元信息的跨租户数据迁移实现统一纳管的方法 二.技术领域 云计算 数据迁移 统一纳管 三.现有 ...

  9. VLAN网络支持ipv6的交换机和虚机配置

    VLAN支持ipv6的交换机和虚机配置 前言 一.创建VLAN网络并配置交换机 1.规划并在OpenStack上创建 VLAN网络 2.在交换机上配置VLAN 二.Ubuntu虚机配置 1.创建虚机 ...

最新文章

  1. 福布斯:2022年计算机视觉领域五大发展趋势
  2. 电脑下边的任务栏不见了_XP系统任务栏被空白工具栏占领快速删除办法
  3. 限制EditText 输入的字节数
  4. CodeProject 工具收藏
  5. 图像重建算法_基于深度学习图像重建算法(DLIR)对CT图像质量和剂量优化的研究:体模实验...
  6. mysql 两张表差集_mysql中两张表使用left join on 求差集详解
  7. LintCode-- Remove Linked List Elements
  8. 利用 Composer 完善自己的 PHP 框架(二)——发送邮件
  9. linux w3m命令
  10. wav音频文件转换为sbc音频文件
  11. 易语言大漠插件制作脚本教程
  12. Trunk详解(笔记)
  13. 币圈投资必败的5种“韭菜”人格
  14. 【转】在数学的海洋中飘荡
  15. 组合数据类型练习,英文词频统计实例上
  16. java画板小demo
  17. 用Python绘制K线图
  18. IO系统性能之二:缓存和RAID如何提高磁盘IO性能
  19. 线性规划模型应用的2个案例
  20. flex:1 的含义 以及属性值1的含义

热门文章

  1. 优秀学生是如何高效利用时间的?
  2. 关于Block Formatting Context--BFC和IE的hasLayout
  3. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试...
  4. HttpHandler在IIS中的部署问题(扩展名映射)
  5. (转载)为什么欧美拿金牌不感谢祖国
  6. ArrayList转Json的2个坑
  7. EPSON机器人_SPEL+语言
  8. sap运维要做哪些工作_社会工作师可以做哪些工作?考试难不难?
  9. css文字向右对齐_web前端入门到实战:css常用样式对文本的处理演练
  10. qt 程序异常结束。_博声医疗:QT间期,QT间期正常范围