nova简介
nova是openstack的核心组件之一,负责与计算相关的服务,例如对虚拟机的生命周期进行管理,nova是一个针对虚拟机相关操作的一个组件,但是nova不提供任何虚拟化的功能,nova通过第三方接口,例如libvirt api,调用Hypervisors,因此nova可以支持多种虚拟化技术,例如KVM、QEMU、Xen、VMWare等等。nova内部组件之间通过RPC方式通信,nova与外部组件通过http方式通信,且共同使用一个novaDB来存储数据,nova的每个组件都可以部署一个或者多个以实现横向扩展。
API:对应nova中的nova-api服务,对外提供REST API服务,是nova服务的入口,任何第三方组件发送的请求都先到达API,再由API转发给nova内部的各个组件。
Conductor:对应nova中的nova-conductor服务,提供长时间任务编排功能,如将虚拟机的启动、冷迁移、热迁移抽象成任务,对任务状态进行跟踪。其次为compute提供数据库的代理访问机制,出于安全性和可扩展性的考虑,compute不能直接访问数据库。
Compute:对应nova中的nova-compute服务,提供计算服务,通过调用不同Hypervisor的API来完成对虚拟机生命周期的管理。
Scheduler:对应nova中的nova-scheduler服务,提供对计算资源的调度,通过多种算法来应对不同场景下nova对资源的调度,算法与scheduler是松耦合的,可以自定义算法。
placement:对应nova中的nova-placement服务,提供计算资源的管理,其核心是帮助用户寻找满足资源需求的设备。(注:S版本之后,placement组件被剥离出nova项目,成为一个独立的项目)
nova不通服务间的通信
nova-cert:顾名思义,是与证书有关的服务,用于为上传镜像生成X509证书,作为rpc server运行,对外提供证书有关的RpcAPI,作用和CA类似,仅用于调用openstack兼容EC2的API时候使用,。
nova-objectstore:Nova对象存储接口服务,通过此服务来访问swift和S3。
nova-consoleauth:提供VNC的token认证。
nova-console:提供VNC访问虚拟机的服务
nova组件之间没有直连,消息的投递和获取都是通过消息队列,nova-compute与数据库也没有直接联系,nova-compute需要读写数据库时,将请求发送给消息队列,nova-comductor从消息队列读取该请求,再由nova-conductor按照请求读写数据库。
nova组件是相互独立的,可以根据自己需要进行部署和配置,上图中还有一些组件没有没有列出来,例如:nova-xvpvncproxy、nova-spicehtml5proxy、nova-novncproxy、nova-api-metadata等等。
scheduler的调度流程
scheduler的主要功能是实现主机的调度,当创建虚拟机时,scheduler根据用户提供的Flavor以及nova-scheduler对云平台的主机设置进行筛选,选出最合适的主机进行虚拟机的创建,大体流程如下:
1.节点过滤
通过Filters选择满足条件的节点
2.权重计算
通过计算权重,选择权重最小的节点
compute对hypervisor的调用
nova-compute通过调用Hypervisor实现对实例的生命周期的管理,但是Hypervisor有多种类型,nova-compute为了对接各种类型的Hypervisor采用了Diver架构,nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。
nova创建虚拟机的流程
1.获取token
1~3,客户端发起请求时,需要携带自己的用户名/密码,发送到keystone
进行认证,认证成功后,keystone生成一个token,keystone将token和endpoint一起返回。
2.认证token
4~5,nova-api收到请求后,使用请求携带的token到keystone去验证token的有效性,验证通过之后,才会向下传递。
3.参数检查
6~7,参数检查有nova-api发起,检查的内容包括:虚拟机命名是否合法、用户提供的Flavor是否存在、虚拟机使用的镜像是否存在、CPU/RAM的配额情况等等,如果检查通过,则会再第7步更新数据库。
4.nova-api与nova-scheduler的请求传递
8~11,nova-api向消息队列投递”创建虚拟机”的请求,nova-scheduler从消息队列获取”创建虚拟机”的请求,nova-scheduler从数据库中获取主机信息,再通过Filter和Weighting,选出符合条件的主机。
5.nova-scheduler与nova-compute的请求传递
12~13,nova-scheduler通过消息队列将筛选出的主机信息传递给nova-compute,给nova-compute使用。
6.nova-compute与nova-conductor的请求传递
14~18,nova-compute通过消息队列将要更新的数据传递给nova-conductor,再由conductor将更新的数据读写入数据库。
7.nova-compute与glance进行交互
19~21,nova-compute从glance中拉取镜像到本地,交互时,glance也需要到keystone进行验证。
8.nova-compute与neutron进行交互
22~24,nova-compute从neutron获取网络资源,交互时,neutron也需要到keystone进行验证。
9.nova-compute与cinder进行交互
25~27,nova-compute从cinder获取块存储资源,交互时,cinder也需要到keystone进行验证。
10.生成libvirt.xml脚本
libvirt.xml脚本被Hypervisor调用,用于虚拟机的创建,创建出来的虚拟机以一个qemu-kvm进程的形式运行再主机上。