学习nova之前我们需要先了解一下关于虚拟化的知识
QEMU
其实就是一个模拟器,它可以通过动态的二进制转换来模拟cpu以及一系列的硬件,让我们的操作系统就认为就是与硬件进行交互,这种模式下存在一个弊端,所有指令都需要QEMU进行转译,会使得性能较差
KVM
是linux提供的一个虚拟化架构,通过/dev/kvm,用户程序可以通过这个接口的ioctl函数实现vcpu和内存的创建,那么就就省去了QEMU的转译,大大提升性能效率
QEMU-KVM
其实就是qemu将kvm整合起来,通过kvm实现vcpu,内存的创建,qemu那么就实现虚拟硬件设备的创建
Libvirtd
Libvirtd是目前使用最广泛的对kvm虚拟机进行管理的工具和api。Libvirtd是一个Domain进程
可以被本地virsh调用,也可以被远端的virsh
调用,libvirtd调用kvm-qemu
控制虚拟机
opentack与Libvirtd关系
架构
nova-api:用于接收请求,请求可以是用户通过命令,接口,GUI调用
Scheduler:调度服务,若收到创建一台新的虚拟机的话,那么Scheduler就会通过选择一台主机去启动改虚拟机
Computer Manager:管理虚拟机的启动、关闭、停止,管理虚拟机化的整个生命周期;过编写的底层驱动 Compute Driver 去控制 Libvirt;通过Libvirt控制kvm虚拟化平台
DB:用于数据存储的基础设施数据库
Conductor:即nova-conductor服务,处理需要协同合作的请求,比如创建实例和调整实例等操作;同时还扮演了数据库代理的角色或者是处理对象转换。
nova的通信架构
nova实质上有两种形式,通常由一个Controller和多个Compute计算节点组成,用户通过命令想nova-api发起创建一个虚拟机请求,nova-api向消息队列(queue)编写数据,随后调度Scheduler、nova-network、nova-volumne。调度成功后也向消息队列写数据,最后Compute接收到消息队列的数据开始响应请求。
如果创建虚拟机没有指定节点,进行权重计算,计算各个节点的剩余资源,Libvirty会自动检测(一般是1分钟)资源并保存在数据库中,nova-Scheduler可以在数据库拿到节点资源,一旦有新的数据写入Compute节点,会马上更新资源统计并保存在数据库。