原文:Request Flow for Provisioning Instance in Openstack
译注:这篇博文讲述的是 OpenStack 中虚拟机创建过程中所涉及到的请求流程,非常简明易懂。而且作者的文笔也比较好,逻辑清晰。本文在必要的地方会进行一定意译。
在任何云平台上,其中一个最重要的使用场景就是虚拟机(Virtual Machin, VM)创建(Provision)。在这篇文章中,我们将会过一遍基于 OpenStack 的云平台的虚拟机创建流程。文章关注的是 OpenStack 中各个子项目之间的交互和请求流程,最终结果是启动一个虚拟机。
译注:感觉我们只要看这张图就够了…
虚拟机创建过程涉及到了 OpenStack 中各个子模块之间的交互:
- 命令行界面 CLI:命令行解释器,以向 OpenStack 计算节点(译注:本文主要跟计算节点相关,所以作者只提到这个)提交命令
- **面板 Dashboard(Horizon)**:为 OpenStack 服务提供一个人机交互界面
- 计算 Nova:从 Glance 中获取虚拟机镜像(image),依附主机模板(flavor)和相关元数据(metadata)和转换用户 API 请求到正在运行的虚拟机当中
- **网络 Network(Quantum)**:为计算节点提供虚拟化网络服务,允许用户创建自己的网络并将它们跟虚拟机关联起来
- 块存储 Cinder:为计算节点提供持久存储服务
- 虚拟机镜像 Glance:存储虚拟机镜像
- 身份验证 Keystone:为 OpenStack 所有服务提供身份验证和授权服务
- 消息队列 RabbitMQ:处理 OpenStack 各模块(如 Nova、Quantum、Cinder)之间的内部通信
创建一个虚拟机的请求流程大概是这样子的:
- Dashboard 或者 CLI 接收到了用户的身份验证信息,并将这些信息以 REST 调用的方式发送到 Keystone
- Keystone 对这些信息进行验证,同时生成和返回授权 token。这个 token 将会用于向 OpenStack 中其他模块以 REST 调用方式发送请求
- Dashboard 或 CLI 将创建虚拟机的类似“launch instance”或者“nova-boot”的请求转化为 REST API,并将其发送至 nova-api
- nova-api 接收到请求,并向 keystone 发送验证 token 和访问权限的请求
- Keystone 验证 token,并返回更新的包含角色(role)和权限的(HTTP响应)头部
- nova-api 与数据库 nova-database 进行交互
- 在数据库中为虚拟机创建一条记录
- nova-api 向调度器 nova-scheduler 发送一个 RPC(Remote Procedure Call Protocol) 请求,期望获得更新的包含主机 ID 的虚拟机入口(entry)
- nova-scheduler 从消息队列中提取请求
- nova-scheduler 与 nova-database 进行交互,通过过滤条件和权重,找到一个可用的主机 ID
- nova-scheduler 返回更新后的包含主机 ID 的虚拟机入口
- nova-scheduler 向 nova-compute 发送 RPC 请求,以在可用的计算节点上启动虚拟机
- nova-compute 从消息队列中提取请求
- nova-compute 向 nova-conductor 发送 RPC 请求,以获取虚拟机信息,例如主机 ID、主机模板(Ram、CPU、磁盘)
- nova-conductor 从消息队列中提取消息
- nova-conductor 与 nova-database 进行交互
- 返回虚拟机信息
- nova-compute 从消息队列中提取虚拟机信息
- nova-compute 通过传递 token 向 glance-api 发送 REST 请求,以通过镜像 ID 从 Glance 中获得镜像 URL 和从镜像存储池中上传镜像
- glance-api 向 keystone 验证 token
- nova-compute 获得镜像元信息(metadata)
- nova-compute 通过传递 token 向 Network 发送 REST API 请求分配和配置网络资源,为虚拟机分配 IP
- quantum-server 向 keystone 验证 token
- nova-compute 获得网络信息
- nova-compute 通过传递 token 向 Volume 发送 REST API 请求为虚拟机分配存储资源(块存储)
- cinder-api 向 keystone 验证 token
- nova-compute 获得块存储信息
- nova-compute 为监控器(hypervisor)驱动生成数据并在其上执行请求(通过 libvirt 或者 api)
下表展示了虚拟机创建过程中在不同步骤是的状态: