看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)

本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题。

创建 Instance 时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。

OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor 就可以了。

可用的 flavor 在 System->Flavors 中管理。

Flavor 主要定义了 VCPU,RAM,DISK 和 Metadata 这四类。 nova-scheduler 会按照 flavor 去选择合适的计算节点。 VCPU,RAM,DISK 比较好理解,而 Metatdata 比较有意思,我们后面会具体讨论。

下面介绍 nova-scheduler 是如何实现调度的。

在 /etc/nova/nova.conf 中,nova 通过 scheduler_driver,scheduler_available_filters 和 scheduler_default_filters 这三个参数来配置 nova-scheduler。

Filter scheduler

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

  1. 通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute)
  2. 通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。

scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler

Nova 允许使用第三方 scheduler,配置 scheduler_driver 即可。 这又一次体现了OpenStack的开放性。

Scheduler 可以使用多个 filter 依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点。

上图是调度过程的一个示例:

  1. 最开始有 6 个计算节点 Host1-Host6
  2. 通过多个 filter 层层过滤,Host2 和 Host4 没有通过,被刷掉了
  3. Host1,Host3,Host5,Host6 计算权重,结果 Host5 得分最高,最终入选

Filter

当 Filter scheduler 需要执行调度操作时,会让 filter 对计算节点进行判断,filter 返回 True 或 False。

Nova.conf 中的 scheduler_available_filters 选项用于配置 scheduler 可用的 filter,默认是所有 nova 自带的 filter 都可以用于滤操作。

scheduler_available_filters = nova.scheduler.filters.all_filters

另外还有一个选项 scheduler_default_filters,用于指定 scheduler 真正使用的 filter,默认值如下

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

Filter scheduler 将按照列表中的顺序依次过滤。 下面依次介绍每个 filter。

RetryFilter

RetryFilter 的作用是刷掉之前已经调度过的节点。

举个例子方便大家理解: 假设 A,B,C 三个节点都通过了过滤,最终 A 因为权重值最大被选中执行操作。 但由于某个原因,操作在 A 上失败了。 默认情况下,nova-scheduler 会重新执行过滤操作(重复次数由 scheduler_max_attempts 选项指定,默认是 3)。 那么这时候 RetryFilter 就会将 A 直接刷掉,避免操作再次失败。 RetryFilter 通常作为第一个 filter。

AvailabilityZoneFilter

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

例如把一个机架上的机器划分在一个 Availability Zone 中。 OpenStack 默认有一个命名为 “Nova” 的 Availability Zone,所有的计算节点初始都是放在 “Nova” 中。 用户可以根据需要创建自己的 Availability Zone。

创建 Instance 时,需要指定将 Instance 部署到在哪个 Availability Zone中。

nova-scheduler 在做 filtering 时,会使用 AvailabilityZoneFilter 将不属于指定 Availability Zone 的计算节点过滤掉。

RamFilter

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

对于内存有一点需要注意: 为了提高系统的资源使用率,OpenStack 在计算节点可用内存时允许 overcommit,也就是可以超过实际内存大小。 超过的程度是通过 nova.conf 中 ram_allocation_ratio 这个参数来控制的,默认值为 1.5

ram_allocation_ratio = 1.5

其含义是:如果计算节点的内存有 10GB,OpenStack 则会认为它有 15GB(10*1.5)的内存。

DiskFilter

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

Disk 同样允许 overcommit,通过 nova.conf 中 disk_allocation_ratio 控制,默认值为 1

disk_allocation_ratio = 1.0

CoreFilter

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

vCPU 同样允许 overcommit,通过 nova.conf 中 cpu_allocation_ratio 控制,默认值为 16

cpu_allocation_ratio = 16.0

这意味着一个 8 vCPU 的计算节点,nova-scheduler 在调度时认为它有 128 个 vCPU。 需要提醒的是: nova-scheduler 默认使用的 filter 并没有包含 CoreFilter。 如果要用,可以将 CoreFilter 添加到 nova.conf 的 scheduler_default_filters 配置选项中。

ComputeFilter

ComputeFilter 保证只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度。
ComputeFilter 显然是必选的 filter。

ComputeCapabilitiesFilter

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

这个比较高级,我们举例说明。
例如我们的节点有 x86_64 和 ARM 架构的,如果想将 Instance 指定部署到 x86_64 架构的节点上,就可以利用到 ComputeCapabilitiesFilter。

还记得 flavor 中有个 Metadata 吗,Compute 的 Capabilitie s就在 Metadata中 指定。

“Compute Host Capabilities” 列出了所有可设置 Capabilities。

点击 “Architecture” 后面的 “+”,就可以在右边的列表中指定具体的架构。

配置好后,ComputeCapabilitiesFilter 在调度时只会筛选出 x86_64 的节点。
如果没有设置 Metadata,ComputeCapabilitiesFilter 不会起作用,所有节点都会通过筛选。

ImagePropertiesFilter

ImagePropertiesFilter 根据所选 image 的属性来筛选匹配的计算节点。
跟 flavor 类似,image 也有 metadata,用于指定其属性。

例如希望某个 image 只能运行在 kvm 的 hypervisor 上,可以通过 “Hypervisor Type” 属性来指定。

点击 “+”,然后在右边的列表中选择 “kvm”。

配置好后,ImagePropertiesFilter 在调度时只会筛选出 kvm 的节点。
如果没有设置 Image 的Metadata,ImagePropertiesFilter 不会起作用,所有节点都会通过筛选。

ServerGroupAntiAffinityFilter

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

例如有 inst1,inst2 和 inst3 三个 instance,计算节点有 A,B 和 C。
为保证分散部署,进行如下操作:

  1. 创建一个 anti-affinity 策略的 server group “group-1”

nova server-group-create --policy anti-affinity group-1

请注意,这里的 server group 其实是 instance group,并不是计算节点的 group

  1. 依次创建 Instance,将inst1, inst2和inst3放到group-1中

nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst1
nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst2
nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst3

因为 group-1 的策略是 AntiAffinity,调度时 ServerGroupAntiAffinityFilter 会将 inst1, inst2 和 inst3 部署到不同计算节点 A, B 和 C。

目前只能在 CLI 中指定 server group 来创建 instance。

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

ServerGroupAffinityFilter

与 ServerGroupAntiAffinityFilter 的作用相反,ServerGroupAffinityFilter 会尽量将 instance 部署到同一个计算节点上。
方法类似

  1. 创建一个 affinity 策略的 server group “group-2”

nova server-group-create --policy affinity group-2

  1. 依次创建 instance,将 inst1, inst2 和 inst3 放到 group-2 中

nova boot --image IMAGE_ID --flavor 1 --hint group=group-2 inst1
nova boot --image IMAGE_ID --flavor 1 --hint group=group-2 inst2
nova boot --image IMAGE_ID --flavor 1 --hint group=group-2 inst3

因为 group-2 的策略是 Affinity,调度时 ServerGroupAffinityFilter 会将 inst1, inst2 和 inst3 部署到同一个计算节点。

创建 instance 时如果没有指定 server group,ServerGroupAffinityFilter 会直接通过,不做任何过滤。

Weight

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

Scheduler 会对每个计算节点打分,得分最高的获胜。
打分的过程就是 weight,翻译过来就是计算权重值,那么 scheduler 是根据什么来计算权重值呢?

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

日志

是时候完整的回顾一下 nova-scheduler 的工作过程了。
整个过程都被记录到 nova-scheduler 的日志中。
比如当我们部署一个 instance 时

打开 nova-scheduler 的日志 /opt/stack/logs/n-sch.log(非 devstack 安装其日志在 /var/log/nova/scheduler.log)

日志显示初始有两个 host(在我们的实验环境中就是 devstack-controller 和 devstack-compute1),依次经过 9 个 filter 的过滤(RetryFilter, AvailabilityZoneFilter, RamFilter,
DiskFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter,
ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter),两个计算节点都通过了。

那么接下来就该 weight 了:

可以看到因为 devstack-controller 的空闲内存比 devstack-compute1 多(7466 > 3434),权重值更大(1.0 > 0.4599),最终选择 devstack-controller。

注:要显示 DEBUG 日志,需要在 /etc/nova/nova.conf 中打开 debug 选项

[DEFAULT]
debug = True

nova-scheduler 就是这些内容了,稍微有些复杂哈(因为灵活嘛),大家这两天可以好好消化一下。

下节我们讨论 nova-compute。

时间: 2024-08-30 21:10:56

看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)的相关文章

Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)

本节我们讨论 Suspend/Resume 和 Rescue/Unrescue 这两组操作. Suspend/Resume 有时需要长时间暂停 instance,可以通过 Suspend 操作将 instance 的状态保存到宿主机的磁盘上.当需要恢复的时候,执行 Resume 操作,从磁盘读回 instance 的状态,使之继续运行. 这里需要对 Suspend 和 Pause 操作做个比较: 相同点两者都是暂停 instance 的运行,并保存当前状态,之后可以通过 Resume 操作恢复

计算节点宕机了怎么办?- 每天5分钟玩转 OpenStack(43)

Rebuild 可以恢复损坏的 instance. 那如果是宿主机坏了怎么办呢? 比如硬件故障或者断电造成整台计算节点无法工作,该节点上运行的 instance 如何恢复呢? 用 Shelve 或者 Migrate 可不可以? 很不幸,这两个操作都要求 instance 所在计算节点的 nova-compute 服务正常运行. 幸运的是,还有 Evacuate 操作. Evacuate 可在 nova-compute 无法工作的情况下将节点上的 instance 迁移到其他计算节点上.但有个前提

Nova 组件如何协同工作 - 每天5分钟玩转 OpenStack(24)

Nova 物理部署方案 前面大家已经看到 Nova 由很多子服务组成,同时我们也知道 OpenStack 是一个分布式系统,可以部署到若干节点上,那么接下来大家可能就会问: Nova 的这些服务在物理上应该如何部署呢? 对于 Nova,这些服务会部署在两类节点上:计算节点和控制节点. 计算节点上安装了 Hypervisor,上面运行虚拟机. 由此可知: 1. 只有 nova-compute 需要放在计算节点上. 2. 其他子服务则是放在控制节点上的. 下面我们可以看看实验环境的具体部署情况. 通

1 张图秒懂 Nova 16 种操作 - 每天5分钟玩转 OpenStack(44)

前面我们讨论了 Instance 的若干操作,有的操作功能比较类似,也有各自的适用场景,现在是时候系统地总结一下了. 如上图所示,我们把对 Instance 的管理按运维工作的场景分为两类:常规操作和故障处理. 常规操作 常规操作中,Launch.Start.Reboot.Shut Off 和 Terminate 都很好理解. 下面几个操作重点回顾一下: Resize通过应用不同的 flavor 调整分配给 instance 的资源. Lock/Unlock可以防止对 instance 的误操作

Nova 组件详解 - 每天5分钟玩转 OpenStack(26)

本节开始,我们将详细讲解 Nova 的各个子服务. 前面架构概览一节知道 Nova 有若干 nova-* 的子服务,下面我们将依次学习最重要的几个.今天先讨论 nova-api 和 nova-conductor. nova-api Nova-api 是整个 Nova 组件的门户,所有对 Nova 的请求都首先由 nova-api 处理. Nova-api 向外界暴露若干 HTTP REST API 接口. 在 keystone 中我们可以查询 nova-api 的 endponits. 客户端就

教你看懂 OpenStack 日志 - 每天5分钟玩转 OpenStack(29)

  instance 从创建到删除的整个生命周期都是由 Nova 管理的. 后面各小节我们以 instance 生命周期中的不同操作场景为例,详细分析 Nova 不同组件如何协调工作,并通过日志分析加深大家对 Nova 的理解. 在研究 Nova 各个操作之前,我们先来学习一个重要的内容:OpenStack 日志.OpenStack 的日志记录了非常详细的细节信息,是我们学习和 troubleshoting 的利器. 日志的位置 我们实验环境使用的是 devstack,日志都统一放在 /opt/

Nova reboot 和 lock 操作 - 每天5分钟玩转 OpenStack(32)

前面 CloudMan 通过日志详细分析了 nova 的 launch, shut off 和 start 操作.不知道大家现在是否已经掌握了日志分析的技能? 今天咱们就来检验一下.本节讨论的是 nova 相对较简单的操作: reboot 和 lock/unlock.我首先会讲解这几个操作的理论知识,然后将日志分析留给大家来完成.大家在分析过程中如有任何疑问,可以给我留言. Soft/Hard Reboot soft reboot 与 hard reboot 的区别在于: 1. soft reb

我在安装Essex 版openstack 多节点时遇到不同计算节点的VM之间网络不通问题!

问题描述 大家好!我在安装Essex版openstack多节点时遇到不同计算节点的VM之间网络不通问题!具体情况是这样的,之前我是把所有的组件都安装在一台机器上的后来不够用了我想扩展一台,可是按官方文档(os-compute-starterguide-trunk.pdf)多节点安装手册安装后,确实也能分配到另外的节点上创建虚拟机,就是不同的计算节点上的虚拟机之网络怎么都不通,不过同一台计算节点上的虚拟机是通的.比如:在host1(150.236.48.135控制节点)上有192.168.4.45

《OpenStack实战指南》—— 2.1.3 计算节点的安装

2.1.3 计算节点的安装 计算节点主要负责运行虚拟机.在这个测试案例中,使用KVM作为底层的虚拟化技术,OpenStack采用libvirt库来管理KVM.网络使用Open vSwitch来和其他计算节点及网络节点通信.在计算节点上,需要安装以下几个部分: Open vSwitch neutron-plugin-openvswitch-agent nova-compute open-iscsi 1.?系统环境准备 操作系统仍旧使用Ubuntu 12.04 LTS.网络节点需要两个网口,分别连接