• 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的。
    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文件启动虚拟机。
     
    image
     
    总结:
    1、Openstack这种分布式的架构,各个模块之间松耦合,可以很容易的新增模块,而且配置灵活,服务可以安装在不同节点,即使部分服务挂了也不会影响。
    2、虚拟机创建简单说来三步,nova api接受创建虚机请求,nova scheduler为创建虚机指定宿主机,nova compute启动虚拟机。如果能够理解上面的所有步骤,那么对于定位问题可以精准,甚至有些问题可以自己解决,譬如虚机error了,如果你看到虚机的信息已经有host信息了,那基本能从nova-compute的日志中看到问题所在,如果没有,基本是scheduler会有错误信息提示。
     
     转自:http://www.cnblogs.com/zhoumingang/p/5532409.html
     #欢迎指正错误
  • 相关阅读:
    实现Vector对象的序列化的例子
    BigDecimal
    java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?
    删除表中重复记录的方法
    使用PreparedStatement为不同的数据库编写可移植的数据库存取方法
    hsqldb介绍
    ant管理项目
    在jsp中点击按钮,在bean中把已经查出的数据,生成csv文件,然后在ie中自动打开
    用JAVA操作日期类型
    ORACLE默认用户的问题?
  • 原文地址:https://www.cnblogs.com/zhoumingang/p/5532409.html
Copyright © 2020-2023  润新知