Nova是OpenStack中的计算服务,计算实例(instances)生命周期的所有活动都由Nova管理。这样使得Nova成为一个负责管理计算资源、网络、认证、所需可扩展性的平台。但是,Nova自身并没有提供任何虚拟化能力,它使用不同的虚拟化驱动来与底层支持的Hypervisors交互。
Nova架构
Nova由nova-api、消息队列、nova-compute、nova-network、nova-volume、nova-scheduler6个组件组成。
API Server(nova-api)
API Server对外提供一个与云基础设施交互的接口,也是外部可用于管理基础设施的唯一组件。管理使用EC2 API通过web services调用实现。然后API Server通过消息队列(Message Queue)轮流与云基础设施的相关组件通信。作为EC2 API的另外一种选择,OpenStack也提供一个内部使用的“OpenStack API”。
Message Queue(消息队列)
OpenStack 节点之间通过消息队列使用AMQP(Advanced Message Queue Protocol)完成通信。Nova 通过异步调用请求响应,使用回调函数在收到响应时触发。因为使用了异步通信,不会有用户长时间卡在等待状态。这是有效的,因为许多API调用预期的行为都非常耗时,例如加载一个实例,或者上传一个镜像。
Compute Worker(nova-compute)
Compute Worker处理管理实例生命周期。他们通过Message Queue接收实例生命周期管理的请求,并承担操作工作。在一个典型生产环境的云部署中有一些compute workers。一个实例部署在哪个可用的compute worker上取决于调度算法。
Network Controller(nova-network)
Network Controller 处理主机地网络配置。它包括IP地址分配、为项目配置VLAN、实现安全组、配置计算节点网络。
Volume Workers(nova-volume)
Volume Workers用来管理基于LVM(Logical Volume Manager)的实例卷。Volume Workers有卷的相关功能,例如新建卷、删除卷、为实例附加卷,为实例分离卷。卷为实例提供一个持久化存储,因为根分区是非持久化的,当实例终止时对它所作的任何改变都会丢失。当一个卷从实例分离或者实例终止(这个卷附加在该终止的实例上)时,这个卷保留着存储在其上的数据。当把这个卷重附加载相同实例或者附加到不同实例上时,这些数据依旧能被访问。
一个实例的重要数据几乎总是要写在卷上,这样可以确保能在以后访问。这个对存储的典型应用需要数据库等服务的支持。
Scheduler(nova-scheduler)
调度器Scheduler把nova-API调用映射为OpenStack组件。调度器作为一个称为nova-schedule守护进程运行,通过恰当的调度算法从可用资源池获得一个计算服务。Scheduler会根据诸如负载、内存、可用域的物理距离、CPU构架等作出调度决定。nova scheduler实现了一个可插入式的结构。
当前nova-scheduler实现了一些基本的调度算法:
随机算法:计算主机在所有可用域内随机选择
可用域算法:跟随机算法相仿,但是计算主机在指定的可用域内随机选择。
简单算法:这种方法选择负载最小的主机运行实例。负载信息可通过负载均衡器获得。
实例规格管理
实例规格定义了计算实例的CPU核数、内存容量和磁盘空间等参数,即实例的配置。
实例规格可以指定一个或某些项目,或者被所有项目共享。
实例规格可定制额外的属性,例如CPU限制、内存限制、磁盘I/O限制、磁盘调优、带宽I/O等优化资源分配。也可根据业务对性能的要求定义CPU拓扑、CPU亲和策略、大页内存分配、PCI直连等属性。
OpenStack提供对实例规格的查看、创建、删除等管理操作。
部署实例
通常情况下,用户创建一个实例,OpenStack会根据过滤算法将实例自动部署到一台计算节点上。用户也可以指定将实例部署到哪台主机上,哪些角色可以在这台主机上启动实例。
在部署实例时,可以为实例注入管理员密码 。例如为Linux实例注入root密码,这样用户使用SSH客户端工具可以通过用户名、密码登录这台Linux实例。
实例管理
OpenStack计算服务提供实例的生命周期管理:
运行实例
删除实例
重启实例
挂载卷
卸载卷
获取控制台输出
分配固定IP地址
配置VLAN
配置计算节点上的网
访问实例
实例创建成功后可以通过多种方式访问实例。例如通过SSH访问Linux实例,通过RDP访问Windows实例。OpenStack也提供了两种远程访问实例桌面的方式:VNC 和SPICE HTML5。这两种方式可通过Dashborad在浏览器端直接打开实例的远程控制台访问,并可通过浏览器与实例交互。
块存储管理
OpenStack提供2类块存储:临时卷和持久卷。
临时存储包括一个根临时卷和一个额外的临时卷。根磁盘与实例关联,它的生命周期与实例一致,实例一旦删除,根磁盘也会被删除。根磁盘的存储空间在实例规格中定义。另一块额外的临时存储是一个裸块设备,没有分区表或文件系统。一个cloud-ware操作系统可以发现、格式化和挂载这样的存储设备。OpenStack计算服务基于不同的操作系统定义默认的文件系统,为Linux发行版定义Ext4,Windows NTFS,非Windows和LInux VFAT。使用virt_mkfs或default_ephemeral_format配置项定义其他的文件系统类型。
持久卷代表独立于特定主机的持久化虚拟块设备,通过OpenStack块存储服务提供。持久卷不能共享,只有单个实例可以访问这个持久卷。通过配置可引导的持久卷用来提供持久的虚拟机实例。虚拟机实例也可以保留临时性存储。在这种情况下,root文件系统可以在持久卷上,即使实例关机了,它的状态也是保留的。
迁移实例
有时出于维护和性能的考虑,会将实例迁移到别的主机。OpenStack支持两种迁移模式,热迁移和冷迁移:
热迁移: 热迁移也叫动态迁移。在迁移的过程中虚拟机仍旧工作,用户可以继续使用虚拟机。
冷迁移:冷迁移也叫静态迁移。在迁移过程中虚拟机必须关机,用户也不能访问虚拟机。因为要关机,所以他适用于用户对系统可用性要求不是很高的时候。
在热迁移时,用户可手动选择目标主机,也可由系统自动选择目标主机。系统可监控实例迁移过程。
虚拟化支持
OpenStack支持的虚拟化类型:裸金属、Docker、Hyper-V、KVM、LXC、QEMU、UML、VMware vSphere、Xen。
性能优化
在某些情况下,业务系统系统虚拟实例提供与物理服务器接近的物理性能。OpenStack通过CPU拓扑、内存巨页、PCI设备直连等特性提供高性能的虚拟实例。
CPU拓扑
自定义实例NUMA放置策略,实例CPU亲和性策略,实例CPU拓扑。
巨页
OpenStack的巨页特性对于与高度内存IO绑定的应用提供性能提升,对内存需求较大或内存敏感型应用可以使用巨页。
直连物理PCI设备
OpenStack的PCI passthrough特性允许实例完全访问和直接控制物理PCI设备。这种机制对任何类型的PCI设备都是通用的,运行一个网卡,一个GPU或者任意连接到PCI总线上的设备。
一些PCI设备提供单根I/O虚拟化和共享(SR-IOV)能力。当使用了SR-IOV,一个物理设备被虚拟化为多个PCI设备。虚拟PCI设备可以关联到相同或者不同的客户机上。PCI直连的情况下,整个物理设备只能分配给一个guest,并且不能被共享。
计算服务安全
OpenStack提供基于角色的访问授权,项目是隔离的资源容器,在计算服务内是主要的资源结构,由一个单独的VLAN、卷、实例、镜像、key和用户组成。可通过配额限制资源使用:卷的数量、处理器数量和内存、浮动IP地址、固定IP地址。
安全组
Openstack中的安全组实现相互信任的虚拟机之间的通信,绑定同一个安全组的虚拟机使用相同的安全策略。安全组作用范围是在虚拟机上,更具体来说是作用在虚拟机的端口而不是网络上。Openstack中安全组基于Iptables实现。
可信计算池
管理员可以指定一组计算主机建立可信计算池,可信的主机使用基于硬件的安全特性,例如TxT。用户可以在可信计算池中申请虚拟机。
计算元数据加密传输
通过HTTPS加密传输元数据。
运维
启用、禁用计算服务
疏散实例
当计算节点发生故障,可以将这台计算节点上的实例疏散到其他节点上,让这些实例恢复正常可用状态。
Compute service groups
计算需要知道每个计算节点的状态,包括事件、调度器向一个正常节点发送请求或者查询ServiceGroup API节点是否活着。当一个计算节点启动后,它调用加入API加入计算组。任意服务可以查询组成员和节点的状态。ServiceGroup客户端驱动自动更新计算节点的状态。
Compute Service Groups支持数据库ServiceGroup驱动、Memcache ServiceGroup驱动