Nova概述
IaaS的核心组件,也是openstack的核心组件,提供云计算服务、虚拟化服务,Nova本身不支持虚拟化,而是去管理底层的虚拟化(KVM 或 redhat)。
计算
Nova项目也是有好几个组件构成,组件的关系架构图如下,其中网络模块一个是Nova-networking
,一个是Neutron
,现在大部分使用的都是Neutron
:
可以看到,在Nova中,有这么几个主要的服务:
Nova-api
:用于接收请求,请求的发起方可以是用户通过命令
或者程序编程接口
或GUI
。Scheduler
:调度服务,如果接收到的是新建虚拟机请求,Scheduler需要选择一个compute去启动一个虚拟机。Compute Manager
:管理虚拟机的启动、关闭、停止,管理虚拟化的整个生命周期。Compute Manager并不直接管理虚拟机,而是通过编写的底层驱动 Compute Driver 去控制 Libvirt(redhat开发的虚拟机管理平台),Libvirt再而控制 KVM、Xen等虚拟化平台。DB
:用于数据存储的基础设施数据库。Conductor
:即nova-conductor服务,处理需要协同合作的请求,比如创建实例和调整实例等操作;同时还扮演了数据库代理的角色或者是处理对象转换。
在这个图中,值得注意的一点是Nova的几个主要服务组件之间,是通过oslo.messaging
进行RPC
调用,与外部服务之间通过HTTP
的方式、RESTFul
接口进行通讯和交互。
Hypervisor
在Compute中,有一个 Hypervisor ,这又是什么呢?
我们说,OpenStack其实是一个云管平台,即其本身不提供虚拟化功能,还是要依赖于操作系统底层的虚拟化技术,其中Hypervisor
是虚拟化技术的核心。它是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor)
目前常见的Hypervisor
有QEMU
、KVM
、XEN
、VMware
等,其中,KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT
或AMD-V
)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。最为热门,也最为常用。
qemu-kvm
此外,需要提一下qemu-kvm。
QEMU将KVM整合进来,通过ioctl调用/dev/kvm
接口,将有关CPU指令的部分交由内核模块来做。KVM负责CPU虚拟化+内存虚拟化,实现了CPU和内存的虚拟化,但KVM不能模拟其他设备。QEMU模拟IO设备(网卡,磁盘等),KVM加上QEMU之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm,看图:
如果还没理解,可以查看这篇文章:Openstack(nova)、kvm、qemu和libvirtd之间关系
Libvirt
在KVM这一层之上,是libvirt,它提供统一、稳定、开放源码的对各种虚拟机进行管理的工具(守护进程libvirtd、默认命令行管理工具virsh)和应用程序接口(API)。一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack等)都在底层使用libvirt的应用程序接口。
Libvirt支持的多种虚拟化监视器(hypervisor)
Openstack与Libvirt的关系
nova实质上有两种形式,通常由一个Controller和多个Compute计算节点组成,用户通过命令想nova-api发起创建一个虚拟机请求,nova-api向消息队列(queue)编写数据,随后调度Scheduler、nova-network、nova-volumne。调度成功后也向消息队列写数据,最后Compute接收到消息队列的数据开始响应请求。
虚拟机启动流程
如果创建虚拟机没有指定节点,进行权重计算,计算各个节点的剩余资源,Libvirty会自动检测(一般是1分钟)资源并保存在数据库中,nova-Scheduler可以在数据库拿到节点资源,一旦有新的数据写入Compute节点,会马上更新资源统计并保存在数据库。