OpenStack Nova秒级创建虚拟机方案

OpenStack管理虚拟机生命周期的组件是NovaNova创建虚拟机从后端存储类型分为本地LVM存储和远程分布式存储(例如:Ceph/SheepDog/GlusterFS),从启动方式一般分为镜像启动和卷启动两大类,按启动方式和存储后端可以有4种组合:

组合1本地LVM + 镜像启动
此种方式,虚拟机镜像事先一般也会存放在远端的分布式存储上(CephSwift)。当在计算节点首次创建虚拟机时,会从远端分布式存储下载镜像到计算节点做格式转换并缓存为base-image,然后复制完整的镜像到/var/lib/nova/instances/{instance-uuid}目录下作为系统盘,耗时跟镜像大小和带宽有关,一般约数分数以上。
如果在相同的计算节点上第二次以相同的镜像创建虚拟机,因为已经有了镜像缓存,不需要再到远端分布式存储下载镜像,直接从本地计算节点拷贝镜像到虚拟机启动目录作为系统盘,耗时跟镜像大小有关,一般也得数分钟以上。
组合2:本地LVM + 卷启动
此种方式,虚拟机镜像事先一般也会存放在远端的分布式存储上(CephSwift)。当在计算节点首次创建虚拟机时,会从远端分布式存储下载镜像到计算节点做格式转换并缓存为base-image,然后调用cinder在控制节点以base-image创建可bootable的卷,最后以该卷启动虚拟机。耗时跟镜像大小和带宽有关,一般也得数分钟以上。
如果在相同的计算节点上第二次以相同的镜像从卷启动创建虚拟机,因为已经有了镜像缓存,不需要再到远端分布式存储下载镜像,直接调用cinder在控制节点以base-image创建可bootable的卷,最后以该卷启动虚拟机。耗时跟镜像大小和带宽有关,一般也得数分钟以上。
组合3:远程分布式存储Ceph + 镜像启动(采用默认配置)
此种方式,虚拟机镜像事先一般也会存放在远端的分布式存储Ceph上。当在计算节点首次创建虚拟机时,首先会从远程Ceph上下载镜像到该计算节点做格式转换并缓存为base-image,然后上传base-image到远程Ceph Rbd pool中作为系统盘,最后以CephRbd pool中的系统盘启动虚拟机。耗时跟镜像大小和带宽有关,一般也得数分钟以上。
在相同的计算节点上第二次以相同的镜像创建虚拟机,因为已经有了镜像缓存,不需要再到远端Ceph下载镜像,直接上传base-image到远程Ceph Rbd pool中作为系统盘,最后以CephRbd pool中的系统盘启动虚拟机。耗时跟镜像大小和带宽有关,一般也得数分钟以上。
组合4:远程分布式存储Ceph + 卷启动(采用默认配置)
此种方式,虚拟机镜像事先一般也会存放在远端的分布式存储Ceph上。当在计算节点首次创建虚拟机时,首先会从远程Ceph上下载镜像到该计算节点做格式转换并缓存为base-image,然后调用cinder通过base-image在远程Ceph Rbd pool中创建可bootable的启动卷,最后以Ceph Rbd pool中的卷启动虚拟机。耗时跟镜像大小和带宽有关,一般也得数分钟以上。
在相同的计算节点上第二次以相同的镜像以卷启动创建虚拟机,因为已经有了镜像缓存,不需要再到远端Ceph下载镜像,直接调用cinder通过base-image在远程Ceph Rbd pool中创建可bootable的启动卷,最后以Ceph Rbd pool中的卷启动虚拟机。耗时跟镜像大小和带宽有关,一般也得数分钟以上。
秒级创建虚拟机优化方案
在优化之前,如果按照上述4种组合任一一种来创建虚拟机,如果批量创建几百台虚拟机,因为有镜像的下载、上传或者拷贝流程,整个创建流程会非常耗时,有些会因为接口超时导致失败。
为了达到秒级创建虚拟机的性能,GlanceCinderNova的后端存储统一以Ceph作为共享存储。Glance上传的虚拟机镜像会上传到Ceph images pool中,Cinder创建的卷会保存在Ceph volumes pool中,Nova系统盘保存在Cephinstances pool中。
如果是以镜像启动创建虚拟机,在同一个计算节点选择相同的镜像不论是第一次还是第二次创建虚拟机,会直接基于ceph images pool的镜像先做snapshot,然后基于该snapshot 进行clonecopy on write)到Cephinstances pool,最后以该系统盘启动虚拟机。利用ceph写时复制特性,不存在镜像的上传、下载和完整拷贝,所以创建速度非常快,可以达到秒级。
如果是以卷启动创建虚拟机,在同一个计算节点选择相同的镜像不论是第一次还是第二次创建虚拟机,会直接基于ceph images pool的镜像先做snapshot,然后调用cinder基于该snapshot 进行clonecopy on write)到Ceph volumes pool,最后以该卷启动虚拟机。利用ceph写时复制特性,不存在镜像的上传、下载和完整拷贝,所以创建速度非常快,可以达到秒级。
秒级创建虚拟机的优化步骤如下:
1.controller控制节点上修改/etc/glance/glance-api.conf镜像配置文件,把show_image_direct_url 参数设置为True
vim /etc/glance/glance-api.conf

OpenStack Nova秒级创建虚拟机方案

注意:一定要在【DEFAULT】下添加。
然后利用命令serviceopenstack-glance-api restart重启镜像管理服务。
2. 转换镜像格式,通过glance上传的镜像一定要是raw格式。
在上传之前需要命令转换好后上传,转换命令:
qemu-img convert -O raw src-img.qcow2dst-img.raw
用命令行转换成raw格式,主要是解决如下no bootable device问题。

OpenStack Nova秒级创建虚拟机方案

3.在计算节点上进入 /var/lib/nova/instances/_base/ 目录,清空该目录下所有的缓存镜像。由于后台程序会先检测该目录下有没有缓存镜像,如果有,会把该缓存镜像上传到ceph中,如果没有,直接在cephclone镜像。
步骤如下:
[root@openstack _base]# cd/var/lib/nova/instances/_base/
[root@openstack _base]# ll
-rw-r–r–. 1 qemu qemu 41126400 Jul 24 01:01d7fca384a7c355afa3b70667b60f04dd08cd6f35
[root@openstack _base]# rm -rfd7fca384a7c355afa3b70667b60f04dd08cd6f35
[root@openstack _base]# ll
total 0
4.相关的流程源码如下:

OpenStack Nova秒级创建虚拟机方案

OpenStack Nova秒级创建虚拟机方案

[root@openstack ~]# vim /usr/lib/python2.7/site-packages/nova/virt/libvirt/imagebackend.py

OpenStack Nova秒级创建虚拟机方案

[root@openstack~]#vim/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py

OpenStack Nova秒级创建虚拟机方案

[root@openstack ~]# vim/usr/lib/python2.7/site-packages/glance/api/v2/images.py

OpenStack Nova秒级创建虚拟机方案

总结
上述介绍的不同种类的创建虚拟机的组合方式,从核心原理分析其实只有两类。一种是需要完整拷贝镜像,另一种是写时复制(copy on write)。
1. 完整拷贝镜像创建虚拟机
优点:是每个虚拟机独立,不会相互影响。
缺点:存在镜像下载、上传或者拷贝,创建速度慢。
2. 写时复制(copyon write
优点:每次创建虚拟机都只有很小的增量文件,不存在全量镜像拷贝,创建速度很快。
缺点:以相同的镜像创建的所有虚拟机依赖共同的base-image,如果base-image意外损坏或删除,上层依赖的虚拟机都会受到影响。
速度和安全性往往是一对矛盾体,两种方式需要做一定的权衡。可以在完整拷贝镜像创建虚拟机的方案中提升硬件性能,比如通过高配的磁盘和带宽来降低拷贝镜像的时间。也可以在写时复制(copy on write)的方案中,在虚拟机创建成功后的某个恰当时刻,通过后台执行ceph rbd flatten命令断开base-image和增量clone虚拟磁盘的依赖链,达到每个虚拟机相互独立。