1.逻辑架构
nova是云主机控制器。它包含了很多组件,API服务器(nova-api),计算服务器(nova-compute),网络控制器(nova-network),调度器(nova-schedule),卷控制器(nova-volume),消息队列以及DashBoard。
Nova各个模块之间的协作交互图如下所示:
nova-api负责接受和响应终端用户有关虚拟机和云硬盘的请求,提供了openstackAPI、亚马逊EC2API以及管理员控制API。一句话:nova-api是整个nova的入口。它接受用户请求,将指令发送至消息队列,由相应的服务执行相关的指令消息。
nova-compute是主要的执行守护进程,职责是基于各种虚拟化技术Hyperivisor实现创建和终止虚拟机。nova-compute有两个工作,接受消息队列中的执行指令,并执行相关指令,如部署虚拟机。维护数据库相关模型的状态数据。
nova-compute整合了计算资源CPU,存储,网络三类资源部署管理虚拟机,实现计算能力的交付。包括如下内容:运行虚拟机,终止虚拟机,重启虚拟机,挂载虚拟机,挂载云硬盘,卸载云硬盘,控制台输出。
nova-volume/Cinder的职责是创建,挂载,和卸载持久化的磁盘虚拟机,运行机制类似nova-compute。同样是接受消息队列中的执行指令,并执行相关指令。volume的职责包括如下:创建云硬盘,删除云硬盘,弹性计算硬盘。一句话:就是为虚拟机增加块设备存储。
nova-network的职责是实现网络资源池的管理,包括IP池,网桥接口,VLAN,防火墙的管理。接受消息队列指令消息并执行。network的职责包括如下:分配私有云,VLAN管理,配置计算节点网络。Nova-network解决云计算网络资源池的网络问题。
nova-schedule的职责是调度虚拟机载哪个物理宿主机上部署,接受消息队列指令消息并执行。
Queue也就是消息队列,它就像是网络上的一个hub,nova各个组件之间的通信几乎都是靠它进行的,当前的Queue是用RabbitMQ实现的,它和database一起为各个守护进程之间传递消息。
2.运行架构
nova-api对外统一提供标准化接口,各子模块,如计算资源,存储资源和网络资源子模块通过相应的API接口服务对外提供服务。
这里的WSGI就是nova-api。API接口操作DB实现资源数据模型的维护。通过消息中间件,通知相应的守护进程如nova-compute等实现服务接口。API与守护进程共享DB数据库,但守护进程侧重维护状态信息,网络资源状态等。守护进程之间不能直接调用,需要通过API调用,如nova-compute为虚拟机分配网络,需要调用network-api,而不是直接调用nova-network,这样有易于解耦合。
下面以创建虚拟机为例,分析Nova的不同关键子模块之间的调用关系。因为启动一个新的instance涉及到很多openstacknova里面的组件共同协作。
1、通过调用nova-api创建虚拟机接口,nova-api对参数进行解析以及初步合法性校验,调用compute-api创建虚拟机VM接口,compute-api根据虚拟机参数(CPU,内存,磁盘,网络,安全组等)信息,访问数据库创建数据模型虚拟机实例记录(创建1个虚拟机实例)
2、接下来需要调用具体的物理机实现虚拟机部署,在这里就会涉及调度模块novascheduler,compute-api通过RPC的方式将创建虚拟机的基础信息封装成消息发送至消息中间件指定消息队列“scheduler”。
3.nova-scheduler订阅了消息队列“scheduler”的内容,接受到创建虚拟机的消息后,进行过滤,根据请求的虚拟资源,即flavor的信息。scheduler会找到一个可用的主机,如果没有找到就设置虚拟机的状态设置成ERROR选择一台物理主机部署,如果有主机,如物理主机A。nova-scheduler将虚拟机基本信息,所属物理主机信息发送至消息中间件指定消息队列“compute.物理机A”
4.物理机A上nova-compute守护进程订阅消息队列“compute.物理机A”,接到消息后,根据虚拟机基本信息开始创建虚拟机
5.nova-compute调用network-api分配网络ip
6.nova-network接收到消息就,从fixedIP表(数据库)里拿出一个可用IP,nova-network根据私网资源池,结合DHCP,实现IP分配和IP地址绑定
7.nova-compute通过调用volume-api实现存储划分,最后调用底层虚拟化Hypervisor技术,部署虚拟机。
3.开发架构
nova的主要代码都是nova文件夹之下。
/nova/service.py:主机上运行所有服务的通用节点基类;所有服务的start位置。
/nova/config.py :配置信息
/nova/api/openstack:提供openstacknova REST API接口服务
/nova/api/ec2:提供兼容亚马逊标准化接口
/nova/compute:计算资源池
/nova/compute/api.py:处理关于计算资源的所有的请求;
/nova/compute/manager.py:对实例相关的所有进程的处理;
ComputeVirtAPI类:计算VirtAPI;
ComputeManager类:管理实例从建立到销毁的运行过程;
/nova/network:网络资源池
/nova/scheduler:调度资源池
4.数据库表
compute_nodes:计算节点信息
consoles
block_device_mapping:实例所在的磁盘分区信息
fixed_ips:固定ip表,虚机实例的ip地址就是从这张表获取
floating_ips:
instance_actions:实例的所有操作都会在这张表中记录,包括create.delete.stop等操作。
instance_action_events:实例操作的事件
instance_faults:实例错误信息
instance_metadata:为实例增加的元数据会记录在这张表中
instance_types:就是flavorlist的信息
instances:记录所有实例信息的表,删除的实例信息也会存储在这张表里面。
key_pairs:记录key值信息的表
migrations:将实例移到了可执行的主机的信息
networks:网络信息
s3_images:
security_groups:记录安全组信息表
security_group_instance_association:
security_group_rules:安全组规则表
services:记录服务的信息。有compute,networks等
创建一个实例所涉及的表有一下一些:
block_device_mapping
instance_actions
instance_actions_events
instance_info_caches :记录了网络的一些信息
instance_system_metadata:记录每一实例的详细信息。例如:实例类型。镜像类型等
security_group_instance_association实例和安全组连接在一起的信息记录表
instances