目录
文章目录
- 目录
- 创建并绑定虚拟机的虚拟网卡
- 1、创建 VM 和 Port 记录
- 2、创建 VM 和 Port 实体
- 3、更新 Port 状态
创建并绑定虚拟机的虚拟网卡
在 OpenStack 中,Nova 负责虚拟机的生命周期管理,Neutron 负责虚拟网络的生命周期管理。而虚拟机的虚拟网卡作为连接虚拟机和虚拟网络的桥梁,其生命周期管理(创建并绑定 / 解绑定并删除虚拟机的虚拟网卡)由 Nova 和 Neutron 协同完成。
1、创建 VM 和 Port 记录
调用 API 创建一个 VM 时,nova-compute 会调用 neutron-server API 同步创建一个 Port 并绑定到 VM 所在的 Compute Node 中:
-
调用 Neutron Server API 创建 Port(nova.network.neutronv2.api.API.allocate_for_instance),此时 Neutron Server 验证 API 请求参数并创建一条 Port 的 DB 记录。 实际上还没有创建 Port 的实体。
-
根据 Nova 提供的信息,调用 Neutron Server API 更新 Port 信息(nova.network.neutronv2.api.API._update_ports_for_instance),包括:
- device_id:VM_UUID
- device_owner:compute: AZ_NAME
- dns_name:VM_HOSTNAME
- binding:host_id:COMPUTE_NODE_ID
- binding:profile:额外的 Port 信息。
-
Neutron Server 更新 Port 的 DB 记录后,调用 ML2 的 Mechanism Manger 的 Port Binding(neutron.plugins.ml2.plugin.Ml2Plugin.update_port),确定 Port 和 Compute Node 及其之上的 OvS Agent 的关系,并更新 Port 的 vif_type 和 vif_details 信息。此时依旧没有创建 Port 的实体。
- neutron.plugins.ml2.plugin.Ml2Plugin._bind_port
- neutron.plugins.ml2.manager.MechanismManager._bind_port_level
- neutron.plugins.ml2.drivers.mech_agent.AgentMechanismDriverBase.bind_port
- neutron.plugins.ml2.drivers.mech_agent.SimpleAgentMechanismDriverBase.try_to_bind_segment_for_agent
- neutron.plugins.ml2.drivers.openvswitch.mech_driver.mech_openvswitch.OpenvswitchMechanismDriver.init
2、创建 VM 和 Port 实体
Port 实体实际上是由 nova-compute 来完成创建的。在上述的步骤 1 中填充完毕 Port 的 DB 记录信息之后,nova-compute 就会获取到这些信息(从 Neutron Server Update Port API 返回),并在指定的 Compute Node 上创建 Port 的实体。
启用 VM 实例(nova.compute.manager.ComputeManager._build_and_run_instance):
- nova.virt.libvirt.driver.LibvirtDriver.spawn 启动 VM 实例;
- nova.virt.libvirt.driver.LibvirtDriver.plug_vifs 调用 os-vif 库,创建 Port 实体(一张 Vtap 虚拟网卡)并接入到 OvS Bridge 上。
但是,此时 Port 的 states 还是 Down 的。
3、更新 Port 状态
在 nova-compute 创建了 Port 的实体之后,neutron-server 就要开始 “接管” 这张虚拟网卡了(更新其 DB 信息)。
- Neutron OvS Agent 监听 OvS Bridge 的状态(neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent.rpc_loop);
- Neutron OvS Agent 监听到虚拟网卡的接入时间(neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent.treat_devices_added_or_updated);
- Neutron OvS Agent 上报 Port 状态到 Neutron Server(neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent.OVSNeutronAgent._bind_devices);
- Neutron Server 更新 Port 的 states 为 Active。
由于 nova-compute 在创建虚拟网卡时,已经将 Neutron Port ID(iface-id)等信息写入到 OvS port/interface 中了,因此 Neutron Server 可以识别到具体的 Port 记录。