前言   
    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的。
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
 #欢迎指正错误

Openstack之Nova创建虚机流程分析的更多相关文章

  1. openstack nova 创建虚机流程

    1文件 nova.api.openstack.coumpute.servers1函数 def create(self, req, body):1调用 (instances, resv_id) = se ...

  2. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...

  3. nova创建虚拟机源码分析系列之七 传入参数转换成内部id

    上一篇博文将nova创建虚机的流程推进到了/compute/api.py中的create()函数,接下来就继续分析. 在分析之前简单介绍nova组件源码的架构.以conductor组件为例: 每个组件 ...

  4. nova创建虚拟机源码分析系列之一 restful api

    开始学习openstack源码,源码文件多,分支不少.按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程.从这一条线入手,能够贯穿openstack核心服务.写博文仅做学习 ...

  5. nova start 虚机的代码流程分析

    nova start 虚机的代码流程分析,以ocata版本为分析基础1.nova api服务接受用户下发的 nova start启动虚机请求其对应的http restfull api接口为post / ...

  6. OpenStack 创建虚机过程简要汇总

    1. 总体流程 翻译自原文(英文):https://ilearnstack.com/2013/04/26/request-flow-for-provisioning-instance-in-opens ...

  7. openstack网络(四)-虚机流量分析

    几种网络名词解释 使用LinuxBridge时虚机流量分析 VLAN FLAT Local VXLAN 使用OVS时虚机流量分析 几种网络名词解释 1.local网络:local网络是与其他网络和节点 ...

  8. OpenStack配置串口显示虚机界面

    OpenStack配置串口显示虚机界面 OpenStack的horizon能够显示虚拟机的界面.horizon是web界面,在我们的电脑上,姑且称之为本地,虚拟机运行在远端服务器上,称之为远端.本地显 ...

  9. Docker创建虚机和swarm

    创建虚机: First, quickly create a virtual switch for your virtual machines (VMs) to share, so they will ...

随机推荐

  1. Android音频文件浏览+音频播放

    该Demo执行后,会显示全部你sd卡上的音乐文件列表, 并能够点击列表选择某一首歌曲进行播放. 执行效果: 点击download出现: 然后点击歌曲调用系统播放器播放. 源码: activity_au ...

  2. mybatis 入门学习

    所须要jar包:mybatis-3.x.x.jar .假设须要和spring整合,还须要增加相关的包 1:看项目文件夹 红颜色不要关心 2:依照步骤: 1:增加jar包 2:创建数据源(configu ...

  3. c++11小计

    [capture] (parameters) mutable -> return-type { statement } " (parameters)" 和 "-&g ...

  4. plsql参数

    PL/SQL中对out,in out参数使用的? 默认形参会复制一份实参的副本,然后在内部传递,修改等,发生异常,不会赋值给实参,控制权交还调用环境,而实参值不变,还是调用前的值.而使用了NOCOPY ...

  5. 第十篇:顺序容器vector,deque,list的选用规则

    前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(v ...

  6. pocket

    Pocket是一个离线阅读服务软件. Pocket的主要功能就是将你要阅读或者一时没有读完的网页标记下来,接着同步到服务器端,然后你就可以在不同的设备上阅读.如果你在电脑上网的时间不多,一些东西又来不 ...

  7. GIT界的神探--bisect

    GIT界的神探--bisect 今天我们需要使用git命令中的bisect破获一起凶杀案,下面请看具体案件: 在一个git仓库中有a,b,c,d,e,f,g,h,i,j,k这几个提交,在k提交中发现软 ...

  8. Post And Get接口测试

    public class TestPost {   public static String do_post(String url, Map<String, String> params) ...

  9. ThinkPHP中通过URL重写隐藏应用的入口文件index.php的相关服务器的配置

    [ Apache ] 将httpd.conf配置文件中mod_rewrite.so所在行前面的‘#’去掉 AllowOverride None 将None改为 All 效果图

  10. matplotlib图像中文乱码(python3.6)

    方法一:(在代码中添加如下代码) import matplotlib #指定默认字体 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matpl ...