Nova 提供了一个大规模服务框架和对虚拟计算实例的管理。在功能和支持的服务种类上类似于亚马逊的EC2 服务,Nova允许通过API来创建,管理,和销毁基于你自己系统镜像的虚拟服务器。
Nova 架构
Nova是一个多组件的分布式应用,但它的主要部分是由客户使用Python编写的两个后台服务进程。
•Web 服务器网关接口(WSGI)应用程序接受和中转API调用。
•工作进程完成相互协作的任务。
然而,Nova体系中有两个部分既不是客户编写的也不是基于Python:消息队列和数据库。这两个组件通过消息传递和消息共享实现了复杂任务的异步协调。所有关系如图4-1.
可以用三句话概括这个复杂的图。
• 使用Nova的终端用户通过OpenStack API 或者 EC2 API调用nova-api来创建计算实例。
• Nova 后台进程通过消息队列和数据库来交换信息以完成API请求。
• Glance是一个独立的服务,Nova 接口通过Glance API 提供虚拟磁盘镜像服务。
图4-1 Nova 逻辑结构
我们已经看到这些服务进程和它们之间的交互,接下来我们来深入了解每个部分。
API
nova-api 进程是Nova的核心。你可能会在很多Nova的插图中看到它作为API 或者 “云控制器”。然而,这只不完全正确,云控制器仅仅是nova-api内部的一个类。它主要功能是接受和处理API 请求。
为了接收和处理API请求,nova-api 为所有API查询提供了一个端点,出事后大多数协调动作(诸如运行一个实例),同时加强一个策略(大部分是限额检查)。对部分请求,它会通过查询数据库来完成整个请求然后返回结果。对于更加复杂的请求,它会通过写信息连接到数据库从而给其他进程传递消息然后将消息添加到队列。
默认情况下,nova-api 在8773端口监听EC2 API ,在8774端口监听OpenStack API。
调度器
nova-scheduler 进程概念上是nova中最简单的:它从消息队列里取得一个虚拟机实例的请求然后决定虚拟机运行地址(特别的,这个虚拟实例应该在那个服务器主机上运行)。事实上,它可能成为最复杂的部分,因为它需要考虑整个云平台的当前状态,运用复杂的算法来提高使用效率。
为达到此目的,nova-scheduler 实现了插件式体系,它允许你选择(或者写)你自己的调度算法。表4-1详细列出当前调度选择。
表 4-1. Nova 调度器
调度器 | 注释 |
Simple | 每次寻找负载最少的节点 |
Chance | 随机选择节点。此为默认调度器 |
Zone | 从某个可用区里随机挑选 |
为阐述nova-scheduler有多么简单,我们列出在 nova/schedule/chance.py 里的Chance调度类的相关代码。
class ChanceScheduler(driver.Scheduler):
"""Implements Scheduler as a random node selector."""
def schedule(self, context, topic, *_args, **_kwargs):
"""Picks a host that is up at random."""
hosts = self.hosts_up(context, topic)
if not hosts:
raise driver.NoValidHost(_("Scheduler was unable to locate a host"
" for this request. Is the appropriate"
" service running?"))
return hosts[int(random.random() * len(hosts))]
正如以上代码所示,调度方法简单地从主机列表随机选择一个节点,主机列表当前被认为“UP”。(译注:应该就是被选中的意思)
计算工作进程
nova-compute 进程主要是一个工作者进程,它创建和终止虚拟机实例。以这种方式工作的进程相当复杂,但它的本质很简单:接收来自队列的操作然后执行一个或一系列虚拟机API调用,在更新数据库状态时完成这些操作。
Nova-compute有多种管理虚拟机的方式。最常见的方式是通过一个叫做libvirt的软件包实现。它是一个由RedHat公司开发用于大多数Linux虚拟技术交互的工具箱(API,后台进程和使用工具集)。虽然libvirt是最常用的方式,nova-copute 也使用Xen API,vSphere API,Windows 管理接口和其它支持的虚拟技术。
Nova的一个特点是支持大多数虚拟技术。当前版本支持的虚拟技术见表4-2.
表4-2 Nova支持的虚拟技术
虚拟产品 | 是否支持 | 接口 | 注意事项 |
KVM | 支持 | Libvirt | 小规模部署最流行的技术。被证明的最容易的部署和配置。支持高级操作诸如实时迁移和重调大小。 |
Xen | 支持 | Libvirt | 大规模部署最流行的技术 |
Citrix Xen Server | 支持 | XenAPI | 基于Xen虚拟化商业产品。支持高级特性。 |
Xen Clound Platform | 支持 | XenAPI | Citrix XenServer的开源版本。LGPL,GPL授权发布,支持XenServer部分特性 |
VMware ESX/ESXi/vSphere | 支持 | vSphere API | 最流行的企业虚拟化平台。 |
VMware vSphere | 不支持 | ||
User Mode Linux | 支持 | Libvirt | 通常被认为是一个低性能的虚拟化平台,UML在每个客服上作为一个常规进程运行在用户空间。 |
Microsoft Hyper-V | 支持 | WMI | Hyper-v 是微软的基于hypervisor的虚拟技术 |
QEMU | 支持 | Libvirt | 提供对大多数基于linux的虚拟技术的支持(例如KVM和VirtualBox) |
Linux Containers(LXC) | 支持 | Libvirt | LXC 是一个操作系统级分区的技术,它允许在单内核上运行多个隔离服务器。LXC实际上不虚拟服务器。取而代之,它用自己的进程空间提供了虚拟环境。虽然它不允许分区共享内核,但是它提供了IO操作高级特性。 |
卷工作进程
顾名思义,nova-volume 管理创建,附加和分离计算实例的持久卷(功能上类似亚马逊的 Elastic Block Storage)。它能使用包括iSCSI 和 AoE 在内的大多数卷类型。表4-3显示了当前支持的选项。
表4-3 nova 卷类型选项
卷类型 | 注意 |
AoE | 高性能层2以太技术,封装SATA命令到以太帧中。Linux通过AoE 工具包提供支持。 |
iSCSI | 一个广泛使用的基于IP的SCSI命令压缩。大多数操作系统支持,但Nova仅在linux下支持它,该类型磁盘不支持CHAP验证。 |
Solaris iSCSI | 支持Solaris主机iSCSI卷和用户ZFS命令。Solaris服务器必须用nova/volume/san.py 文件中的指令来准备。 |
Sheepdog | 专门为QEMU/KVM设计的开源分布式存储系统,由NIT实验室开发。 |
RBD | RADOS 块驱动器同Ceph交互,是一个基于可信赖和可伸缩分布式对象存储的分布式文件系统。 |
LeftHand | 同HP LeftHand SAN方案交互的磁盘驱动器。不像上述其他类型,它不能直接运行在SAN硬件上,取而代之,它通过SSH命令访问。 |
网络工作进程
Nova-network 进程和nova-compute及nova-volume很相似。它从队列里接收网络任务,执行系统命令来操作网络(例如启动网桥接口或者改变iptables 规则)。
Nova 为一个实例定义了两种不同的IP地址类型:固定IP 和浮动 IP。它们可以被认为是私有IP(固定IP)和公有IP(浮动IP)。固定IP在实例启动时分配并且在运行期间一直保持不变。浮动IP动态分配和某一个域关联以允许外部联通。
为了支持固定IP的分配和连通,Nova支持三种网络管理:
• Flat 是最基本的网络管理。每一个新的实例被分配一个固定IP地址并附加到一个公共的网桥(系统管理员创建)。IP 配置信息必须被“注入“(写进新实例的虚拟磁盘)以配置实例。
• FlatDHCP 基于Flat 建构,通过提供DHCP 服务来处理实例地址和网桥的创建。
• VLAN 支持大多数特性。在此种模式下,nova-network 为每一个项目创建一个VLAN,子网,和一个独立的网桥。每一个项目也仅就收在VLAN范围内可达的IP。
在三种网络管理方式中,VLAN 是最特殊的,Flat是最简单的(但很灵活),FlatDHCP 则兼具两种特点。
队列
队列为进程间消息传递提供了一个交换中心。当前是由RabbitMQ 来实现的功能,但理论上可以是任何支持Python ampqlib 和 carrot 库的AMPQ 消息队列。
Nova 创建几种类型的消息队列以完成不同进程间通信。消息类型包括:主题队列,账号队列和主机队列。主题队列允许消息被广播到特定类别的工作进程。例如:Nova 用它来给计算实例或卷进程传递消息。它允许Nova 用第一个工作进程处理消息。主机队列允许Nova 发送消息到指定主机上的指定服务。例如,Nova 经常需要给一个指定的主机的计算工作进程发送消息来通知它到指定实例上执行。Fanout queues are only currently used for advertising of the service capabilities to nova-scheduler workers.(译注:不会翻译)
下面是一个在RabbitMQ中创建队列的例子,运行在一个安装所有组件的机器上。
$ sudo rabbitmqctl list_queues
Listing queues ...
scheduler_fanout_15b1731c5ac34aae8970369911f04542 0
volume 0
volume_fanout_e42438faedb84ab8aad8d85e29916424 0
compute_fanout_38a37d3dc7564b66a5a540a1e222b12b 0
compute.cactus 0
volume_fanout_d62eb016a76341f4899c91d5a8fbb0a9 0
volume_fanout_dcaebd5edb3045ff8b86636040d34071 0
volume.cactus 0
network_fanout_64b9cb80b2c34c7a8da983219c787147 0
compute 0
network_fanout_362393151e7c465a8e3ed003ac6dbc1b 0
compute_fanout_74165ee38c9d4c1ea1003ccd88a91c22 0
scheduler 0
network.cactus 0
network 0
scheduler_fanout_9444b4c8d5d6497b9b5e2df4eca33b0d 0
scheduler.cactus 0
正如你所看到的,主题,账号和主机队列被每一个服务创建(nova-scheduler,nova-compute,nova-volume,nova-network)。
数据库
数据库存储云平台的配置及运行状态。这包括可用的实例类型,正在使用的实例,可用网络和项目。表4-4 是当前nova 数据库模式里表的详细信息。
表4-4 Nova 数据库结构
表名 | 描述 |
migrate_version | 存储当前数据库模式版本及相关迁移信息。只在内部更新时开发者使用。 |
migrations | 用于端到端迁移 |
auth_tokens | 授权令牌到实际用户的映射 |
certificates | 用于用户,项目和x509授权文件映射 |
networks | nova中定义的网络相关信息,包括IP地址,VLAN,和VPN信息。 |
compute_nodes | 每个计算节点的性能及状态信息 |
projects | 项目相关信息,包括项目管理者 |
quotas | 为特定项目的Quota 重写 |
consoles | 一个实例的控制台会话 |
export_devices | 机架和刀片信息,主要和AoE 卷驱动器一起使用。 |
security_group_rules,security_groups 和security_group_instance_association | 描述安全组及相关规则。 |
fixd_ips 和 floating_ips | 关联固定和浮动IP地址到实例 |
service | 注册服务(nova-scheduler,nova-compute等)清单和它们当前状态。Update_at 域说明给定服务是否是正常的。 |
instance_actions | 列出客户虚拟机动作和结果。 |
user_project_association,user_project_role_association和 user_role_association | 维护用户,项目和角色的关系 |
instance | 描述虚拟机实例 |
user | 描述用户 |
iscsi_targets | iSCSI 目标,主机和卷的映像 |
volumes | 描述云中的卷 |
key_pairs | SSH公钥对 |
zones | 描述一个区的子区。仅用于高级设置 |
Nova 支持很多数据库,包括流行的开源数据库,包括MySql 和 PostgreSQL。 有关如何选择一个合适的数据库,参加34页“DataBase”。