原文链接:https://www.cnblogs.com/potato-chip/p/9127083.html

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 虚机网卡的创建过程的更多相关文章

  1. OpenStack虚机网卡的创建过程

    OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机.虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡.虚机的创建和管理是Nova的任 ...

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

    Openstack虚机实例状态错误手工恢复vm_state:error 1.找到状态为出错状态的VM.在数据库里面表现Status为ERROR而非ACTIVE. 2.找到出错状态VM的UUID. 3. ...

  3. OpenStack虚机状态变化图解

    对官网上内容的一个翻译,方便自己以后查找资料用 The following diagrams and tables show the required virtual machine (VM) sta ...

  4. OpenStack虚机相关错误

    OpenStack配置起来还是挺麻烦的,特别是网络那块.虽然官方文档越来越清晰,但有时还是会出各种错.排错主要是看日志.看官方文档和google 以下就一些虚机相关常见的错误做一下总结(基于Iceho ...

  5. openstack 虚机热迁移问题:虚机状态一直处于迁移中的情况处理

    前提:在偶尔的虚机热迁移中,发现虚机一直属于迁移状态中. 但是查看后台流量监控,发现没有流量已经下来了.然后在目标机器上查看,发现kvm已经在目标机器上. 1.查看kvm 实际所处宿主机方法: a.拿 ...

  6. KVM修改虚机网卡模式:由NAT模式改为Bridge模式

    1)关闭虚机# virsh  shutdown  vm1 2)编辑虚机配置文件# virsh  edit  vm1 <interface type='default'> 改为<int ...

  7. 克隆虚机网卡出现 Device eth0 does not seem to be present, delaying initialization 错误

    错误原因    克隆的Linux系统在新的机器上运行,新服务器网卡物理地址已经改变.而/etc/udev/rules.d/70-persistent-net.rules这个文件确定了网卡和MAC地址的 ...

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

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

  9. openstack 虚机迁移 Unacceptable CPU info: CPU doesn't have compatibility

    问题: Unacceptable CPU info: CPU doesn't have compatibility 解决: vim /usr/lib/python2.7/site-packages/n ...

随机推荐

  1. CentOS设置yum存储库 (nginx)

    要为RHEL / CentOS设置yum存储库,请创建/etc/yum.repos.d/nginx.repo 使用以下内容命名的文件 : [nginx] name=nginx repo baseurl ...

  2. Visual Event查看页面相关绑定事件

    页面相关绑定的事件比较复杂,在不熟悉的情况下很难找到相关逻辑的位置,所以希望借助工具来帮自己理清相关事件的脉络走向. 浏览器 工具 chrome( 58.0.3029.110) Visual Even ...

  3. 通过yiic来创建yii应用

    一.通过yiic来创建yii应用 (*yiic命令在yii下载包的framework目录下) 1.把你自已的php环境添加到系统环境变量中. 2.在命令行下输入: yiic webapp 位置\名称 ...

  4. Codeforces 703B. Mishka and trip 模拟

    B. Mishka and trip time limit per test:1 second memory limit per test:256 megabytes input:standard i ...

  5. 电商类Web原型制作分享——聚美优品

    这是一家化妆品限时特卖商城.作为美妆电商类网站的佼佼者,网站以用户体验为核心,画面主色调符合女性消费者审美.排版整齐,布局合理.网站用弹出面板实现点击弹出内容,鼠标悬停文字按钮颜色改变等交互效果. 本 ...

  6. 彻底关闭win10的自动更新,一定要坚持看到最后一页

    https://jingyan.baidu.com/article/9faa7231e7b78b473c28cbb6.html 是否好使我还在测试,不好使的话,再跟新 2018-05-20 今天电脑又 ...

  7. sql join用法(转)

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  8. java NIO编程(转)

    一.概念 在传统的java网络编程中,都是在服务端创建一个ServerSocket,然后为每一个客户端单独创建一个线程Thread分别处理各自的请求,由于对于CPU而言,线程的开销是很大的,无限创建线 ...

  9. 深入浅析JavaScript中with语句的理解

    JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变 ...

  10. C/C++的Name Mangling

    C语言 函数 1.void __CALLTYPE f();2.int __CALLTYPE f();3.int __CALLTYPE f(int);4.double __CALLTYPE f(int, ...