玩转 OpenStack(五)Nova 模块

Compute Service Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。虚拟机的生命周期也是通过 Nova 来实现的。

一、Nova 架构

玩转 OpenStack(五)Nova 模块_第1张图片
Nova 架构

1. API

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

2. Compute Core

  • nova-scheduler
    虚拟机调度服务,负责决定在哪个计算几点上运行虚拟机。

  • nova-compute
    管理虚拟机的核心服务,通过调用 Hypervisor API 实现虚拟机生命周期管理。

  • Hypervisor
    计算节点上的虚拟化管理程序,虚拟机管理最底层的程序。

  • nova-conductor
    nova-compute 经常需要操作数据库来更新虚拟机的状态。出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库,而是将这个任务委托个 nova-conductor 来完成。

3. Console Interface

  • nova-console
    访问虚拟机的控制台:
    nova-novncproxy:基于 Web 游览器的 VNC 访问。
    nova-spicehtml5proxy:基于 HTML5 游览器的 SPICE 访问。
    nova-xvpnvncproxy:基于 Java 客户端的 VNC 访问。

  • nova-consoleauth
    负责对访问虚拟机控制台请求提供 Token 认证。

  • nova-cert
    提供 X509 证书支持

4. Database

一般使用MySQL。
表信息如下:内容较多隐藏了一部分,下面是查看方法。

root@controller:~# su - stack
stack@controller:~$ mysql
mysql> use nova
mysql> show tables;
+--------------------------------------------+
| Tables_in_nova                             |
+--------------------------------------------+
| agent_builds                               |
| aggregate_hosts                            |
.......

5. Message Queue

OpenSack 默认使用的是 RabbitMQ 作为 Message Queue。有关 RabbitMQ 查看 RabbitMQ原理和使用场景以及模式

二、部署方案

1. 首先来查看 Nova 模块的运行情况

  • 计算节点
root@compute:~# ps -e | grep nova
28197 pts/3    00:00:02 nova-compute
  • 控制节点
root@controller:~# ps -e | grep nova
20973 pts/7    00:05:46 nova-api
27075 pts/13   00:05:46 nova-conductor
27968 pts/13   00:01:59 nova-conductor
27969 pts/13   00:01:58 nova-conductor
28051 pts/14   00:00:44 nova-scheduler
28541 pts/15   00:00:19 nova-novncproxy
29180 pts/16   00:00:47 nova-consoleaut
29741 pts/17   00:03:27 nova-compute

可以发现在控制节点中运行了很多 nova 进行,其中包括 compute 进行。在计算节点中只有 compute。controller 即是控制节点,又是计算节点。

这说明了 OpenStack 这种分布式架构部署上的灵活性:

  • 可以将所有服务器放在一台物理机上,作为一个 All-in-One 的测试环境
  • 可以将服务部署到多台物理机上,获得更好的性能和高可用。

也可以使用 nova service-list 查看 nova 服务分布

root@controller:/opt/stack# nova service-list
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary           | Host       | Zone     | Status  | State | Updated_at                 | Disabled Reason |
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
| 3  | nova-conductor   | controller | internal | enabled | up    | 2019-03-09T04:35:04.000000 | -               |
| 4  | nova-scheduler   | controller | internal | enabled | up    | 2019-03-09T04:35:05.000000 | -               |
| 5  | nova-consoleauth | controller | internal | enabled | up    | 2019-03-09T04:35:04.000000 | -               |
| 6  | nova-compute     | controller | nova     | enabled | up    | 2019-03-09T04:35:00.000000 | -               |
| 7  | nova-compute     | compute    | nova     | enabled | up    | 2019-03-09T04:35:02.000000 | -               |
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+

三、OpenStack Nova 设计思路

1. API 前端服务

每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求。这里的客户包括终端用户、命令行和 OpenStack 其他组件。

设计 API 前端服务的优点:

  • 对外提供统一接口,隐藏实现细节。
  • API 提供 REST 标准调用服务,便于与第三方系统集成。
  • 可以通过多个 API 服务实例轻松实现 API 的高可用。

2. Scheduler 调度服务

Nova 由多个计算节点,当需要创建虚拟机时,nova-scheduler 会根据计算节点当时的资源使用情况选择一个最适合的计算节点来运行云主机。

比如:调度服务是一个开发团队的项目经理,当接到新的开发任务时,项目经理会评估任务的难度,考虑团队成员目前的工作负荷和技能水平,然后将任务分配给最合适的开发人员。

3. Worker 工作服务

调度服务只管分配工作,真正执行任务的是 Worker 工作服务。
在 Nova 中,Worker 就是 nova-comput。

将 Scheduler 和 Worker 从职能上进行划分使得 OpenStack 很容易扩展

  • 当计算资源不够时,可以添加计算几点(增加 Worker)
  • 当客户请求量太大调度不过来时,可以添加 Scheduler

4. Driver 框架

OpenStack 的计算节点支持多种 Hypervisor。包括KVM、Hyper-V、VMWare、Xen、Docker、LXC等。
nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 driver 的形式即插即用到 OpenStack 中。

在 nova-compute 的配置文件 /etc/nova/nova.conf 中。由 compute_driver 配置项指定该计算节点使用那种 Hypervisor 的 driver。

compute_driver = libvirt.LibvirtDriver

在 Glance 模块中,OpenStack 支持多种 backend 来存放 image,如:本地系统、Cinder、Ceph、Swift等。这其实也是一个 driver 框架。

5. Messaging 服务

为什么使用分布式。
程序之间调用分为两种:同步调用和异步调用

  • 同步调用
    API 直接调用 Scheduler 的接口就是同步调用。特点是 API 发出请求后需要一直等待,直到 Scheduler 完成对 Compute 的调度,将结果返回给 API 后 API 才能够继续后面的工作。

  • 异步调用
    API 通过 Messaging 间接调用 Scheduler 就是异步调用。特点是 API 发出请求后不需要等待,直接返回,继续做后面的事。
    Scheduler 从 Messaging 接收到请求后执行操作,完成后将结果返回给 Messaging 发送给 API。

OpenStack 分布式系统采用异步调用的好处:

  • 解耦各子服务
    子服务不需要知道其他服务在哪运行,只需要发消息给 Messaging 就可。

  • 提高性能
    异步调用使调用者无需等待结果返回。这样可以执行更多操作。提供系统吞吐量。

  • 提高伸缩性
    子服务可以根据需要进行扩展,启动更多的实例处理更多的请求,在提供可用性的同时也提高整个系统的伸缩性。而这种变化不会影响其他子服务。

5. Database

每个组件都需要维护自己的状态信息。这些信息都是存放在数据库中。

四、Nova 组件的详细说明

1. nova-api

nova-api 是整个 Nova 组件的门户,所有对 Nova 的请求都先由 nova-api 处理。nova-api 向外界暴露若干 HTTP REST API 接口。

nova-api 对接到的请求做如下处理:

  • 检查客户端传入的参数是否合法有效。
  • 调用 Nova 其他子服务的处理客户端 HTTP 请求。
  • 格式化 Nova 其他子服务返回的结果并返回给客户端。

nova-api 接收只和虚拟机生命周期相关的操作。如下图中的所有操作:


玩转 OpenStack(五)Nova 模块_第2张图片
虚拟机生命周期相关操作

2. nova-scheduler

在创建 Instance 时用户可以选择 flavor(实例类型) 来设置虚拟机的CPU,内存等。用户也可以自定义 flavor 的内容。
flavor 位置如下图:


玩转 OpenStack(五)Nova 模块_第3张图片
flavor

如何实现调度:

(1)Filter scheduler

Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分两部:

  • 通过过滤器(filter)选择满足条件的计算节点
  • 通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。

配置:

scheduler_driver = filter_scheduler
(2)Filter

/ect/nova/nova.confscheduler_default_filters 选项用于配置 scheduler 可用的 filter, 默认是所有 nova 自带的 filter 都可以用来过滤操作。
配置:

scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,SameHostFilter,DifferentHostFilter

以下逐个介绍过滤器的意义:

  • RetryFilter

ReryFilter 作用是刷掉之前已经调度过的节点。
RetryFilter 通常作为第一个 filter

假设 A,B,C 三个节点都用过了过滤,最终 A 因为权重值最大被选中执行操作。
但是由于一些原因在 A 上执行的操作失败了。
默认情况下,nova-scheduler 会重新执行过滤操作。这个时候 RetryFilter 就会将 A 直接刷掉,避免操作再次失败。

  • AvailabilityZoneFilter

为了提高容灾性和提供隔离服务,可以将计算节点划分到不同 Availability Zone 中。
在创建虚拟机时需要指定 Availability Zone。nova-scheduler 在做 filtering 时,会使用 AvailabilityZoneFilter 将不属于 Availability Zone 的计算节点过滤掉。

OpenStack 默认有一个 Availability Zone 叫 nova,用户也可以自己创建。位置如下图:


玩转 OpenStack(五)Nova 模块_第4张图片
Availability Zone
  • RamFilter

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

nova 内存超分配置:默认值1.5

ram_allocation_ratio = 1.5

意义:如果计算节点内存有 10GB,OpenStack 则会认为他有 15GB(10 * 1.5)的内存

  • DiskFilter

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

nova 磁盘超分配置: 默认值 1.0

disk_allocation_ratio = 1.0
  • CoreFilter

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

nova vCPU超分配置:默认 16.0

cpu_allocation_ratio = 16.0

意义:一个有 8CPU 的计算节点,在 nova-scheduler 在调度时认为他有 128 个 vCPU。
在 nova-scheduler 默认使用 filter 中是没有 CoreFilter 的。如果需要将 CoreFilter 加入到 nova.conf 配置文件中去。

  • ComputeFilter

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

  • ComputeCapabilitiesFilter

ComputeCapabilitiesFilter 根据计算节点的特性来筛选

举例:节点有 X8664 和 ARM 框架,如果想将 Instance 指定部署到 X8664 架构的节点上,就可以利用 ComputeCapabilitiesFilter。

在 flavor 的 Metadata 中,有一个 Compute 的 Capabilities 来设置过滤信息。如下图:


玩转 OpenStack(五)Nova 模块_第5张图片

玩转 OpenStack(五)Nova 模块_第6张图片
  • ImagePropertiesFilter

ImagePropertiesFilter 根据所选 Image 的属性来筛选匹配的计算节点。

image 中也有 metadata 用来指定属性。在创建镜像时可以设置。如下图:


玩转 OpenStack(五)Nova 模块_第7张图片
镜像元数据
玩转 OpenStack(五)Nova 模块_第8张图片

以上设置,ImagePropertiesFilter 在调度时只会筛选出 kvm 节点。

  • ServerGroupAntiAffinityFilter

ServerGroupAntiAffinityFilter 可以尽量将 Instance 分散部署到不同节点上。

例:有三个 Instance 分别是 ins1、ins2、ins3,计算节点A、B、C
分散部署操作:
(1)创建一个 anti-affinity 策略的 server group "group-1"

root@controller:~# nova server-group-create --policy anti-affinity group-1

(2)依次创建 Instance,将 ins1、ins2、ins3 放到 group-1 中

root@controller:~# nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst1
root@controller:~# nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst2
root@controller:~# nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst3

创建 Instance 时,如果没有指定 server group,ServerGroupAntiAffinityFilter 不会做任何过滤。

  • Weight

空闲内存越多,权重越大,Instance 将被部署到当前空闲内存最多的计算节点上。

(3)日志

/etc/nova/nova.confdebug = True。后创建虚拟机,在 nova 的日志中可以查看到创建流程,以及过滤过程,权重的计算。
日志文件:/opt/stack/logs/n-sch.log (非 devstack 安装日志 /var/log/nova/scheduler.log

3. nova-compute

nova-compute 在计算节点运行,负责管理节点上 Instance。
OpenStack 对 Instance 的操作,最后都是交给 nova-compute 来完成的。
nova-compute 与 Hypervisor 一起实现 OpenStack 对 Instance 生命周期的管理。

支持多种 Hypervisor

/opt/stack/nova/nova/virt 目录下可查看到 OpenStack 源码中已经自带了几个 Hypervisor 的 Driver。

root@controller:/opt/stack/nova/nova/virt# ll
drwxr-xr-x  2 stack stack    4096 Feb 23 18:45 hyperv/
drwxr-xr-x  4 stack stack    4096 Feb 23 19:07 libvirt/
drwxr-xr-x  2 stack stack    4096 Feb 23 18:45 vmwareapi/
drwxr-xr-x  3 stack stack    4096 Feb 23 18:45 xenapi/

每个计算节点只能运行一种 Hypervisor 。在 计算节点的 nova-compute 的配置文件 /etc/nova/nova.comf 中配置所对应的 compute_driver 即可。

nova-compute 的功能

(1) 定期向 OpenStack 报告计算节点的状态

(2) 实现 Instance 生命周期的管理

  • Instance 创建过程分为 4 步:

     a. 为 Instance 准备资源

     b. 创建 Instance 的镜像文件
         首先判断 image 是否下载到计算节点(如果没下,从 Glance 下载 image)。
         然后将其作为backing file 创建 Instance 的镜像文件。
         注意:image 指的是 Glance 上保存的镜像,作为 instance 运行模板。
                    镜像文件指的是 Instance 启动盘所对应的文件。
                    二者的关系是:image 是镜像文件的 backing file。image 不会变,而镜像文件会发生变化。

    c. 创建 Instance 的 XML 定义文件
        XML 保存在目录 /opt/stack/data/nova/instances/fle.... 中,命名为 libvirt.xml

    d. 创建虚拟机网络并启动虚拟机

4. nova-conductor

nova-compute 需要获取和更新数据库中 Instance 的信息。
但是 nova-compute 并不会直接访问数据库,而是通过nova-conductor 实现数据的访问。

五、OpenStack 日志

1. 日志位置

devstack 日志统一放在 /opt/stack/logs 中。

root@controller:/opt/stack/logs# ls
c-api.log                         n-api.log                            q-l3.log
c-api.log.2019-03-09-152514       n-api.log.2019-03-09-152514          q-l3.log.2019-03-09-152514
c-sch.log                         n-cauth.log                          q-meta.log
c-sch.log.2019-03-09-152514       n-cauth.log.2019-03-09-152514        q-meta.log.2019-03-09-152514
c-vol.log                         n-cond.log                           q-svc.log
c-vol.log.2019-03-09-152514       n-cond.log.2019-03-09-152514         q-svc.log.2019-03-09-152514
dstat-csv.log                     n-cpu.log                            screen
dstat.log                         n-cpu.log.2019-03-09-152514          stack.sh.log
dstat.log.2019-03-09-152514       n-dhcp.log                           stack.sh.log.2019-03-09-152347
g-api.log                         n-novnc.log                          stack.sh.log.2019-03-09-152347.summary.2019-03-09-152347
g-api.log.2019-03-09-152514       n-novnc.log.2019-03-09-152514        stack.sh.log.2019-03-09-152514
g-reg.log                         n-sch.log                            stack.sh.log.2019-03-09-152514.summary.2019-03-09-152514
g-reg.log.2019-03-09-152514       n-sch.log.2019-03-09-152514          stack.sh.log.summary
horizon.log                       placement-api.log                    worlddump-2019-02-23-084143.txt
horizon.log.2019-03-09-152514     placement-api.log.2019-03-09-152514  worlddump-2019-02-23-084728.txt
key-access.log                    q-agt.log                            worlddump-2019-02-23-085240.txt
key-access.log.2019-03-09-152514  q-agt.log.2019-03-09-152514          worlddump-2019-03-09-072414.txt
key.log                           q-dhcp.log

如:nova-* 各个子服务的日志是以 n- 开头:

  • n-api.log 是 nova-api 的日志
  • n-cpu.log 是 nova-compute 的日志
  • n-cond.log 是 nova-conductor 的日志
  • n-sch.log 是 nova-scheduler 的日志

Glance 的日志是 g- 开头:

  • g-api.log 是 glance-api 的日志
  • g-reg.log 是 glance-registry 的日志

Cinder 的日志是 c- 开头
Neutron 的日志是 q- 开头

对于其他非 devstack 安装的 OpenStack 日志一般放在 /var/log/xxx/ 目录下。

2. 日志格式

<时间><日志登记><代码模块><日志内容><源代码位置>
  • 时间,日志记录的时间
  • 日志等级,有 INFO WARNING ERROR DEUBG 等
  • 代码模块,当前运行的模块
  • Request ID,日志记录联系不同的操作,为了便于区分和增加可读性,每个操作都被分配唯一的 Request ID。
  • 日志内容,记录当前正在执行的操作和结果等重要信息
  • 源代码位置,日志代码的位置,包括方法名,源代码文件的目录位置和行号

示例:

2019-03-10 16:59:15.588
DEBUG
nova.compute.api
[req-89caccca-ecf0-40f2-a9e3-b2638cc49427 demo admin]
[instance: cb00bd21-908f-4f05-b367-553c6c548f58] Going to try to stop instance from (pid=29543) force_stop
/opt/stack/nova/nova/compute/api.py:2282

时间:2019-03-10 16:59:15.588
日志登记:DEBUG
代码块是:nova.compute.api
Request ID:[req-89caccca-ecf0-40f2-a9e3-b2638cc49427 demo admin]
内容:[instance: cb00bd21-908f-4f05-b367-553c6c548f58] Going to try to stop instance from (pid=29543)
代码位置:force_stop /opt/stack/nova/nova/compute/api.py:2282

下一节介绍 OpenStack Cinder 模块

你可能感兴趣的:(玩转 OpenStack(五)Nova 模块)