Openstack之Nova分析

前言 

Openstack作为一个虚拟机管理平台,核心功能自然是虚拟机的生命周期的管理,而负责虚机管理的模块就是

Nova。

本文就是openstack中Nova模块的分析,所以本文重点是以下三点:

  • 先了解Openstack的整体架构,搞清楚为什么要用这样的架构;
  • 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互;
  • 了解虚机的启动过程,能在遇到问题时发现问题出在哪个模块中的哪个组件。

Nova组件介绍

接下来进行详细介绍,如有错误,欢迎拍砖!

下图为创建虚拟机的一个大概流程图。

客户端:可以认为是web页面op或者Horizonl;也可以是命令行的nova client。

Nova Api:用于接收和处理客户端发送的HTTP请求;

Nova Scheduler:nova的调度宿主机的服务,决定虚拟机创建在哪个节点上。

Nova compute:Nova中最和新的服务,负责虚拟机的生命周期的管理。

nova conductor:数据访问权限的控制操作,可以理解为数据库代理服务。

其他服务:nova cert管理证书,为了兼容aws;nova vncproxy和consoleauth控制台服务。

不同的模块之间是通过HTTP请求REST API服务

同一个模块不同组件之间(如nova-scheduler请求nova-compute)是RPC远程调用,通过Rabbmq来实现。

虚机创建流程梳理

1.客户端使用自己的用户名密码请求认证。
2.keystone通过查询在keystone的数据库user表中保存了user的相关信息,包括password加密后的hash值,并返回一个token_id(令牌),和serviceCatalog(一些服务的endpoint地址,cinder、glance-api后面下载镜像和创建块存储时会用到)。

3.客户端带上keystone返回的token_id和创建虚机的相关参数,Post请求nova-api创建虚拟机

4.nova-api接收到请求后,首先使用请求携带的token_id来访问该api,以验证请求是否有效。

5.keystone验证通过后返回更新后的认证信息。

6.nova api检查创建虚拟机参数是否有效与合法。

检查虚拟机name是否符合命名规范,flavor_id是否在数据库中存在,image_uuid是否是正确的uuid格式

检查instance、vcpu、ram的数量是否超过配额。

7.当且仅当所有传参都有效合法时,更新nova数据库,新建一条instance记录,vm_states设为BUILDING,task_state设为SCHEDULING.

8.nova api 远程调用传递请求、参数给nova scheduler,把消息“请给我创建一台虚拟机”丢到消息队列,然后定期查询虚机的状态。

9.nova scheduler从queue中获取到这条消息

10.nova scheduler访问nova 数据库,通过调度算法,过滤出一些合适的计算节点,然后进行排序。

11.更新虚机节点信息,返回一个最优节点id给nova scheduler。

12.nova scheduler选定host之后,通过rpc调用nova-compute服务,把“创建虚机请求”消息丢个mq。

13.nova compute收到创建虚拟机请求的消息

#nova-compute有个定时任务,定期从数据库中查找到运行在该节点上的所有虚拟机信息,统计得到空闲内存大小和空闲磁盘大小。然后更新数据库compute_node信息,以保证调度的准确性。

14.nova compute通过rpc查询nova数据库中虚机的信息例如主机模板和id

15.nova conductor从消息队列中拿到请求查询数据库

16.nova conductor查询nova数据库

17.数据库返回虚机信息

18.nova compute从消息队列中获取信息。

19.nova compute 请求glance 的rest api,下载所需要的镜像,一般是qcow2的。

http://www.cnblogs.com/zhoumingang/p/5522463.html

20.glance api 也会去验证请求的token的有效性。

21.glance api 返回镜像信息给nova-compute。

22.同理,nova compute请求neutron api配置网络,例如获取虚机ip地址

23.验证token的有效性

24.neutron返回网络信息

25-27 同glance、neutron验证token返回块设备信息

28.据上面配置的虚拟机信息,生成xml,写入libvirt,xml文件,然后调用libvirt driver去使用libvirt.xml文件启动虚拟机。

总结:

1、Openstack这种分布式的架构,各个模块之间松耦合,可以很容易的新增模块,而且配置灵活,服务可以安装在不同节点,即使部分服务挂了也不会影响。

2、虚拟机创建简单说来三步,nova api接受创建虚机请求,nova scheduler为创建虚机指定宿主机,nova compute启动虚拟机。如果能够理解上面的所有步骤,那么对于定位问题可以精准,甚至有些问题可以自己解决,譬如虚机error了,如果你看到虚机的信息已经有host信息了,那基本能从nova-compute的日志中看到问题所在,如果没有,基本是scheduler会有错误信息提示。

转自:http://www.cnblogs.com/zhoumingang/p/5532409.html

#欢迎指正错误

时间: 2024-10-01 03:09:32

Openstack之Nova分析的相关文章

Openstack之Nova创建虚机流程分析

前言  Openstack作为一个虚拟机管理平台,核心功能自然是虚拟机的生命周期的管理,而负责虚机管理的模块就是Nova. 本文就是openstack中Nova模块的分析,所以本文重点是以下三点: 先了解Openstack的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互: 了解虚机的启动过程,能在遇到问题时发现问题出在哪个模块中的哪个组件. Nova组件介绍 接下来进行详细介绍,如有错误,欢迎拍砖! 下图为创建虚拟机的一个大概流程图.

nova分析(4)—— nova-cells

cells的功能允许用户以更分散的方式去扩展OpenStack计算云而无需使用复杂的技术,比如数据库和消息队列的集群.它的目的是支持非常大规模的部署. 当启用了此功能,在OpenStack计算云中的主机被划分为组称为cells.cells可以被配置成树形结构.顶层的cell的主机应该运行nova-api服务,但是没有nova-compute服务.每一个childcell在常规的计算云中应该运行除了nova-api之外的所有nova-*类型的服务.可以认为,作为正常的计算部署的cells,每一个c

nova分析(3)—— nova-api

nova-api是nova对外提供Restful API的服务,Horizon.novaclient等均通过该api与nova进行通信. nova其实对外提供了多个api服务,包括下面这些服务: nova-apinova-api-ec2nova-api-metadatanova-api-os-compute 其中,nova-api用于启动其他三个服务.下面逐个分析下. nova-api 入口在 nova.cmd.api:main ,主要是基于WSGI.PasteDeploy.Webob.Rout

Nova分析(1)——整体架构

Conceptual Diagram Logical diagram Nova is the most complicated and distributed component of OpenStack. A large number of processes cooperate to turn end user API requests into running virtual machines. Below is a list of these processes and their fu

nova分析(10)—— nova-rootwrap

一.nova-rootwrap的作用 部署玩过openstack的都应该知道,它会生成一个nova用户来管理所有服务.nova身份在linux中属于普通用户级别,避免了一些需要root身份运行的操作,提高linux系统的安全性.但是openstack在实际过程中会调用很多外部命令,例如就network服务而言就有:`ip`,`ovs-vsctl`,`iptables`,`dnsmasq`,`brctl`等等,这些命令在linux中都是需要以root身份来运行的,如果是普通用户通常的做法是在命令前

nova分析(7)—— nova-scheduler

Nova-Scheduler主要完成虚拟机实例的调度分配任务,创建虚拟机时,虚拟机该调度到哪台物理机上,迁移时若没有指定主机,也需要经过scheduler.资源调度是云平台中的一个很关键问题,如何做到资源的有效分配,如何满足不同情况的分配方式,这些都需要nova-scheduler来掌控,并且能够很方便的扩展更多的调度方法,可能我需要虚拟机调度到空闲的机器,可能还需要将某类型的虚拟机调度到固定的机架等等,现在就来看看Nova-Scheduler是如何完成调度任务的. Scheduler启动后,相

玩转Openstack之Nova中的协同并发(二)

玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. eventlet 在nova/cmd/__init__.py中,就直接调用了eventlet的方法,代码如下: 1 from nova import debugger 2 3 if debugger.enabled(): 4 eventlet.monkey_patch(os=False, thread=False) 5 els

eclipse调试openstack的nova代码

前段时间一直在研究openstack的nova部分的代码.特别想知道,如何用eclipse来调试代码,也在论坛上问了别人,无果,没人回复我.最后还是自己摸索出了出路. 下面写出自己探索之路.我是用devstack搭建的openstack环境.搭建步骤可以参见我另一篇博客文章. 我的nova代码是这段代码里面没有bin目录,这就使得程序没有入口.但是devstack安装的环境中,在/usr/loacl/bin/目录下有nova-api文件. 在你自己的项目下,新建一个bin文件下,将nova-ap

玩转Openstack之Nova中的协同并发(二) · voidy

玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. ##eventlet 在nova/cmd/init.py中,就直接调用了eventlet的方法,代码如下: from nova import debugger if debugger.enabled(): eventlet.monkey_patch(os=False, thread=False) else: eventlet.