OpenStack Nova
简介
OpenStack 中的 Nova 负责维护和管理云环境的计算资源
Nova 在现有 Linux 服务器上作为一组守护线程来提供服务
Nova 由多个服务器进程组成,每个进程执行不同的功能
面向用户的界面是 REST API ,而 Nova 组件内部通过 RPC 消息传递机制进行通信
需要以下额外的服务来实现基本功能:
- Keystone :为所有的 OpenStack 服务提供认证 (identity and authentication)
- Glance :提供计算镜像仓库 (compute image repository),所有的计算实例均由计算镜像启动
- Neutron :负责配置计算实例在启动时连接到的虚拟或物理网络
- Placement :跟踪云中可用资源的清单,并帮助选择创建虚拟机时资源的提供者
Nova 包含以下组件:
API
nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 Nova 能够提供的功能。当客户需要执行虚拟机相关的操作时,能且只能向 nova-api 发送 REST 请求
nova-api service
接收和响应 end user 的 API 调用
nova-api-metadata service
接收来自实例的源数据请求
通常只在安装有 nova-network 服务的多主机模式下使用
compute core
nova-compute service
管理虚机的核心服务,通过调用 Hypervisor API 实现虚机生命周期管理
nova-scheduler service
虚拟机调度服务,从队列中获取虚拟机实例请求,并确定它在哪个计算节点上运行
nova-conductor module
调解 nova-compute service 和 database 之间的交互,使得 nova-compute service 不会对云数据库直接访问
不要把它部署在运行 nova-compute service 的节点上
console interface
nova-console
用户可以通过多种方式访问虚机的控制台:
nova-novncproxy,基于 Web 浏览器的 VNC 访问
nova-spicehtml5proxy,基于 HTML5 浏览器的 SPICE 访问
nova-xvpnvncproxy,基于 Java 客户端的 VNC 访问
nova-consoleauth daemon
负责对访问虚拟机控制台请求提供 Token 认证
必须运行此服务才能使控制台代理生效
Database
SQL database
存储云基础架构大多数构建时和运行时的状态,包括:
- 可用的实例类型 (Available instance types)
- 正在使用的实例 (Instances in use)
- 可用的网络 (Available networks)
- 项目 (Projects)
Message queue
The queue
用于在守护进程之间传递消息
典型的 Nova 部署
Nova 的关键组件和它们之间传递信息的方式
通信方式
API 服务器处理 REST 请求,通常涉及数据库读/写,可选地将 RPC 消息发送到其他 Nova 服务,以及生成对 REST 调用的响应。
RPC 消息传递是通过 oslo.messaging 库完成的,这是一个消息队列之上的抽象
大多数主要的 nova 组件可以在多个服务器上运行,并且有一个正在侦听 RPC 消息的管理器。 一个例外是 nova-compute,其中一个进程在它正在管理的虚拟机 hypervisor 上运行(除了使用 VMware 或 Ironic 驱动程序时)。 管理员还可以选择定期执行任务。
数据库
Nova 还使用在所有组件之间(逻辑上)共享的*数据库。 但是为了确保升级后的控制平面仍然可以与运行先前版本的 nova-compute 进行通信,可以通过对象层访问数据库。因此 nova-compute 代理通过 RPC 将 DB 请求发送到名为 nova-conductor 的*管理器,而不是直接向数据库发送请求
创建虚拟机的流程
通过创建一个虚拟机的核心流程可以更好地理解 Nova 各个子服务如何协同工作
- 客户 (可以是 OpenStack 最终用户,也可以是其他程序) 向 API (nova-api) 发送请求:“创建一个虚拟机”
- API 对请求做一些必要处理后,向 Messaging (RabbitMQ) 发送了一条消息:“让 Scheduler 创建一个虚拟机”
- Scheduler (nova-scheduler) 从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点 A
- Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上创建这个虚机”
- 计算节点 A 的 Compute (nova-compute) 从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机
- 在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor (nova-conductor )发送消息,Conductor 负责数据库访问