一、nova介绍

    nova是openstack 最核心的服务,负责维护和管理云环境的计算资源。 管理 VM 的生命周期


二、nova架构

    nova 的架构比较复杂,包含很多组件。 

upload-ueditor-image-20160419-1461074078681029733.png

    这些组件以子服务(后台 deamon 进程)的形式运行,可以分为以下几类:

    1、API

        nova-api:接收和响应客户的 API 调用。

    2、Computer Core

        1)nova-scheduler:管理虚机的核心服务,通过调用 Hypervisor API 实现虚机生命周期管理

        2)nova-compute:管理虚机的核心服务,通过调用Hypervisor API实现虚机圣母那个周期管理

        3)Hypervisor:计算节点上跑的虚拟化管理程序,虚机管理最底层的程序。 不同虚拟化技术提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等

        4)nova-conductor:nova-compute 经常需要更新数据库,比如更新虚机的状态。出于安全性和伸缩性的考虑,nova-compute 不直接访问数据库,而是将这个任务委托给 nova-conductor。

    3、Console Interface

        1)nova-console:用户可以通过多种方式访问虚机的控制台

            (1)nova-novncproxy:基于Web浏览器的VNC访问

            (2)nova-apicehtml5proxy:基于Html5浏览器的SPICE访问

            (3)nova-x***vncproxy:基于JAVA客户端的VNC访问

        2)nova-consoleauth:负责对访问虚机控制台请求提供Token认证

        3)nova-cert:提供x590证书支持

    4、DateBase

        1)mysql:Nova 会有一些数据需要存放到数据库中,一般使用 MySQL。 

    5、消息队列

         1)Nova 包含众多的子服务,这些子服务之间需要相互协调和通信。为解耦各个子服务,Nova 通过 Message Queue 作为子服务的信息中转站。


三、nova物理部署方案

    对于 Nova,这些服务会部署在两类节点上:计算节点和控制节点。 

        计算节点上安装了 Hypervisor,上面运行虚拟机。nova-compute 也需要放在计算节点上。 

        控制节点上安装了nova的其他子服务。

        mysql单独部署。


四、从虚机创建流程看 nova-* 子服务如何协同工作

nova.png

    1、客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我创建一个虚机”

    2、API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个虚机”

    3、Scheduler(nova-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点 A

    4、Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上创建这个虚机”

    5、计算节点 A 的 Compute(nova-compute)从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机。

    6、在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor(nova-conductor)发送消息,Conductor 负责数据库访问。


五、子服务详解

    1、nova-api 

        nova-api会对接收到的 HTTP API 请求(跟虚拟机生命周期相关的操作)会做如下处理: 

            1)检查客户端传人的参数是否合法有效 

            2)调用 Nova 其他子服务的处理客户端 HTTP 请求 

            3)格式化 Nova 其他子服务返回的结果并返回给客户端

    2、nova-conductor

        在操作虚机的过程中nova-compute 需要获取和更新数据库中 instance 的信息。 为了不让其直接访问数据库,而是通过nova-conductor访问。

        这样做有两个显著好处:

            1)更高的系统安全性

            2)更好的系统伸缩性

    3、nova-scheduler

        nova-scheduler的作用是选择在哪个计算节点上启动instance;

        1)Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步:

    1. 通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute)

    2. 通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。        

        2)filter

           RetryFilter:刷掉之前已经调度过的节点

           AvailabilityZoneFilter:为提高容灾性和提供隔离服务,可以将计算节点划分到不同的Availability Zone中

           RamFilter: 将不能满足 flavor 内存需求的计算节点过滤掉

           DiskFilter: 将不能满足 flavor 磁盘需求的计算节点过滤掉

           CoreFilter: 将不能满足 flavor vCPU 需求的计算节点过滤掉

           ComputeFilter: 保证只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度。 

        3)Weight

           经过前面一堆 filter 的过滤,nova-scheduler 选出了能够部署 instance 的计算节点。 如果有多个计算节点通过了过滤,那么最终选择哪个节点呢?

            Scheduler 会对每个计算权重值,目前 nova-scheduler 的默认实现是根据计算节点空闲的内存量计算权重值。空闲内存越多,权重越大,instance 将被部署到当前空闲内存最多的计算节点上。

4、nova-compute

     nova-compute 在计算节点上运行,负责管理节点上的 instance。nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。

     nova-compute 的功能可以分为两类:

             定时向 OpenStack 报告计算节点的状态;

             实现 instance 生命周期的管理(launch、shutdown、reboot、suspend、resume、terminate、resize、migration、snapshot等);

     nova-compute 创建 instance 的过程可以分为 4 步:

            (1)为 instance 准备资源

                    分配内存、磁盘空间和 vCPU 网络资源

            (2)创建 instance 的镜像文件

                    首先将该 image 下载到计算节点(没有命中缓存的时候)

                    然后将其作为 backing file(可能需要格式转化) 创建 instance 的镜像文件。

            (3)创建 instance 的 XML 定义文件

            (4)创建虚拟网络并启动虚拟机


六、虚机管理的场景

upload-ueditor-image-20160607-1465256704490062241.png

如上图所示,我们把对 Instance 的管理按运维工作的场景分为两类:常规操作和故障处理。

1、常规操作中,Launch、Start、Reboot、Shut Off 和 Terminate 都很好理解。 下面几个操作重点回顾一下:

        Launch:新建一个instance。

        Start:instance启动

        Reboot:instance重启(软重启和硬重启)

            软重启:只是重启操作系统,整个过程中,instance依然处于运行状态;

            硬重启:是重启instance,相当于关机后在重启;

        Shut Off:instance关机

        Terminate:instance删除

        Resize:通过应用不同的 flavor 调整分配给 instance 的资源。

Lock/Unlock:可以防止对 instance 的误操作。

Pause/Suspend/Resume:暂停当前 instance,并在以后恢复。

             Pause 和 Suspend 的区别在于 Pause 将 instance 的运行状态保存在计算节点的内存中,而 Suspend 保存在磁盘上。

             Pause 的优点是 Resume 的速度比 Suspend 快;缺点是如果计算节点重启,内存数据丢失,就无法 Resume 了,而 Suspend 则没有这个问题。

Snapshot:备份 instance 到 Glance。产生的 image 可用于故障恢复,或者以此为模板部署新的 instance。

2、故障处理有两种场景:计划内和计划外。

    1)计划内是指提前安排时间窗口做的维护工作,比如服务器定期的微码升级,添加更换硬件等。

    对于计划内的故障处理,可以在维护窗口中将 instance 迁移到其他计算节点。涉及如下操作:

        Migrate:将 instance 迁移到其他计算节点。迁移之前,instance 会被 Shut Off,支持共享存储和非共享存储。

        Live Migrate:与 Migrate 不同,Live Migrate 能不停机在线地迁移 instance,保证了业务的连续性。也支持共享存储和非共享存储(Block Migration)

        Shelve/Unshelve Shelve 将 instance 保存到 Glance 上,之后可通过 Unshelve 重新部署。

        Shelve 操作成功后,instance 会从原来的计算节点上删除。

        Unshelve 会重新选择节点部署,可能不是原节点。

    2)计划外是指发生了没有预料到的突发故障,比如强行关机造成 OS 系统文件损坏,服务器掉电,硬件故障等。

    计划外的故障按照影响的范围又分为两类:Instance 故障和计算节点故障

    (1)Instance 故障只限于某一个 instance 的操作系统层面,系统无法正常启动。可以使用如下操作修复instance:

            Rescue/Unrescue:用指定的启动盘启动,进入 Rescue 模式,修复受损的系统盘。成功修复后,通过 Unrescue 正常启动 instance。

            Rebuild:如果 Rescue 无法修复,则只能通过 Rebuild 从已有的备份恢复。Instance 的备份是通过 snapshot 创建的,所以需要有备份策略定期备份。

    (2)计算节点故障:无法与节点的nova-compute通信,其上运行的所有instance都会受到影响。这个时候可以使用如下操作修复instance:

         Evacuate:利用共享存储上 Instance 的镜像文件在其他计算节点上重建 Instance。所以提前规划共享存储是关键。