深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机

1. Libvirt 在 OpenStack 架构中的位置

在 Nova Compute 节点上运行的 nova-compute 服务调用 Hypervisor API 去管理运行在该 Hypervisor 的虚机。Nova 使用 libvirt 管理 QEMU/KVM 虚机,还使用别的 API 去管理别的虚机。

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第1张图片
深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第2张图片

libvirt 的实现代码在 /nova/virt/libvirt/driver.py 文件中。

这里是 OpenStack Hypervisor Matrix(http://docs.openstack.org/developer/nova/support-matrix.html)

这里是 每个 Linux 发行版里面 libvirt, QEMU/KVM 的版本号(https://wiki.openstack.org/wiki/LibvirtDistroSupportMatrix)

请注意Juno 版本 Nova 对 libvirt 和 QEMU 的各种最低版本要求:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第3张图片

不支持 image 设置 hw_disk_discard 属性,具体参考 BluePrint

2. Nova 中 libvirt 的使用

Nova 使用 libvirt 来管理虚机,包括:

  • 创建虚机

  • 虚机的生命周期管理

  • 添加和删除连接到别的网络的网卡 (interface)

  • 添加和删除 Cinder 卷 (volume)

2.1 创建 QEMU/KVM 虚机

创建虚机的配置有几个来源:

  • 用户的选项,包括虚机的基本信息,比如 name,flavor,image,network,disk等

  • image 的属性,比如 hw_vif_model,hw_scsi_model 等。完整的供 libvirt API 使用的属性列表

  • 管理员在 nova.conf 中的配置

(注意:image 的元数据属性的优先级高于 nova.conf 中的配置。只有在没有property的情况下才使用nova.conf中的配置)

创建虚机的过程的几个主要阶段:

(1)消息由 nova-api 路由到某个 nova compute 节点 (API -> Scheduler -> Compute (manager) -> Libvirt Driver)

(2)调用 Neutron REST API 去准备网络。其返回的数据类似:


(3)从 image 启动话,nova 会调用 Glane REST API 后者 image metadata 和准备本地启动盘

image metadata:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第4张图片

本地启动盘:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第5张图片

本地启动盘的文件信息:


深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第6张图片

(4)根据这些信息,生成 domain xml,然后生成其配置使得它是一个持久性虚机 (调用 libvirt Python DefineXML API)。

一个从 image 启动的 Domain 的配置 XML 实例(#部分是注释说明):

从 bootable volume 启动的话,disk 部分为:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第7张图片

(5). 启动 domain (调用 libvirt Python createWithFlags API)

2.2 添加 volume 到虚机 (nova volume-attach)

(1)使用 volume id 通过 volume driver 找到指定的 volume

(2)调用 volume driver 来建立主机和 Volume 之间的连接

主机信息为:

建立的 iSCSI 连接信息为:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第8张图片

volume 在主机上的磁盘为:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第9张图片

(3)通过 domain name 来找到指定 domain 对象 (通过调用 lookupByName API)

(4)生成 volume 连接的配置 xml,比如:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第10张图片

(5)调用 attachDeviceFlags API 将 volume 挂载到该虚机

2.3 添加连接到新的网络的 interface 给虚机 (nova interface-attach)

(1)运行 nova interface-attach,传入 network-id,Neutron 会分配如下network info 给 Nova

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第11张图片

(2)执行下面的命令,将 Neutron 分配的 port 连接到 OVS

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第12张图片

(3)生成 interface 配置的xml,比如:

深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机_第13张图片

(4)调用 attachDeviceFlags API 来挂载该 interface 到虚机

作者:刘世民(Sammyliu)
博客:http://www.cnblogs.com/sammyliu/

你可能感兴趣的:(深入浅出KVM (六) 丨Nova 通过 libvirt 管理 QEMU/KVM 虚机)