nova 之compute服务

nova 之compute服务首先回顾一下nova的体系结构,nova-api接到client发来的创建虚拟机请求之后将请求转发给conductor,conductor将请求发送给scheduler,scheduler接到请求后,对主机进行筛选,选择合适的主机,接着把结果告诉conductor,最后到了compute节点,compute节点完成虚拟机的创建。

nova 之compute服务

所以,scheduler的工作是选主机,而compute节点的任务就是在主机上创建虚拟机,openstack的核心是nova。而nova的核心是compute,所以compute是openstack的核心中的核心。那么compute服务是如何创建虚拟机的呢?

nova 之compute服务

Compute节点接到请求后,首先调用的是computeManager类中的build_and_run_instance方法,然后执行_locked_do_build_and_run_instance方法,这个方法是一个加了锁的方法,保证同一时刻只能执行一个任务。接下来,调用该类中的_do_build_and_run_intance方法,然后直接调用_build_and_run_instance方法,这个方法的作用就是做一些准备工作,例如更新数据库中虚拟机的状态,选择虚拟机上的一个可用节点作为运行虚拟机的节点,准备工作做好之后开始执行核心工作,调用spawn方法。这个computeDriver中的spawn方法是一个抽象方法,而实际执行的是它的子类libvirtlDriver类中的spawn方法,该方法脉络十分清晰,主要做了三件事:第一件:就是创建image,第二件就是创建xml文件,第三件就是创建虚拟机和网络,也就是前两个方法为后面的方法打下基础。第一个_create_image方法中,做的工作是检查镜像缓存的目录是否存在,如果不存在则创建一个目录,这个目录等下要用来存储镜像,接着再获取实例的类型,然后调用了Image类中的cache方法,cache方法会根据实际情况决定执行的是哪一个子类的create_image方法,以Qcow2为例,就是执行Qcow2类中的create_image方法,在该方法中,会判断本地的是否有缓存的镜像,如果没有缓存的镜像,就要从glance下载,检查下载的格式是否正确,如果是非raw格式,且配置文件中有要求,要求一定是raw格式的话,就把镜像转化为raw格式。镜像文件搞定之后就可以为虚拟机创建磁盘镜像文件了。调用libvirtutils包中的create_cow_image方法,该方法就会告诉libvirt创建虚拟机磁盘镜像文件。镜像文件创建好之后,开始创建xml文件,get_guest_xml方法调用get_guest_config方法, get_guest_config创建了LibvirtManager对象,这个对象里面存储了虚拟机的相关信息,初始值均为空值,在get_guest_config中以各种方法,为其赋值,处理完成后,再调用to_xml方法,将对象中的值转为xml的形式,最后创建xml文件。最后一步,创建虚拟机和网络,在create_domain_and_nework方法中直接调用libvirt的接口,完成虚拟机的创建。

以上有没有什么问题?没有,那好

下面对row格式与qcow2格式进行一个比对:

创建一个20G的raw格式image——立马用掉20G的空间

创建一个20G的qcow2格式image ——如果没有写入数据,几乎不会占用空间

raw格式不支持快照

qcow2格式支持快照

用row创建20台虚拟机的话,假设每个虚拟机是20G,则要复制20个20G,时间很长,而用qcow2格式就不需要这么长的时间,因为qcow2占用空间较少,所以适合批量创建虚拟机。而只需要有一个backing file就行了

nova 之compute服务nova 之compute服务

对于compute的实现是离不开libvirt的。

云计算管理存在两个问题:1.如果采用混合虚拟技术,上层就需要对不同的虚拟化技术调用不同管理工具,很是麻烦。2.虚拟化技术发展很迅速,系统虚拟化和容器虚拟化均在发展和演化中。可能有新的虚拟化技术更加符合现在的应用场景,需要迁移过去。这样管理平台就需要大幅改动。

llibvirt是为了更方便地管理平台虚拟化技术而设计的,应用程序接接口、守护进程、管理工具。支持python\perl\java\ruby\php\Ocaml等

nova 之compute服务

可以看出,一些虚拟机的管理,可以通过libvirt实现很好的解耦。

然后,没了。