自动化程序员

深入浅出KVM (六) 丨Nova 通过 libvirt 管理

2018-01-31  本文已影响180人  51reboot

1. Libvirt 在 OpenStack 架构中的位置

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

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 的各种最低版本要求:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">不支持 image 设置 hw_disk_discard 属性,具体参考 BluePrint</pre>

2. Nova 中 libvirt 的使用

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

2.1 创建 QEMU/KVM 虚机

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

(注意: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:

本地启动盘:


本地启动盘的文件信息:


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

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

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

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

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

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

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

主机信息为:

建立的 iSCSI 连接信息为:

volume 在主机上的磁盘为:

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

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

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

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

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

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

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

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

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

上一篇下一篇

猜你喜欢

热点阅读