一、概述
虚拟机调度器主要完成以下工作:
- 过滤掉不满足虚拟机要求的主机
- 对剩余主机进行权重计算
- 选取权重计算值最优的主机返回
OpenStack 的虚拟机调度策略主要是由 FilterScheduler 和 ChanceScheduler 实现的,其中FilterScheduler 作为默认的调度器实现了基于主机过滤(filtering)和权值计算(weighing)的调度算法,而 ChanceScheduler 则是基于随机算法来选择可用主机的简单调度引擎。
下图是 FilterScheduler 的虚拟机调度过程,它支持多种内置的 filter 和 weigher 来满足一些常见的业务场景。在设计上,OpenStack 基于 filter 和 weigher 支持第三方扩展,因此用户可以通过自定义filter 和 weigher,或者使用 json 资源选择表达式来影响虚拟机的调度策略从而满足不同的业务需求。
作为 nova-scheduler 默认的调度器,FilterScheduler 调度过程分为两步:
1)通过过滤(filtering)选择满足条件的计算节点(运行 nova-compute)。
2)通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建实例。
上图是调度过程的一个示例:
- 最开始有 6 个计算节点 Host1-Host6
- 通过多个 filter 层层过滤,Host2 和 Host4 没有通过,被刷掉了
- Host1,Host3,Host5,Host6 计算权重,结果 Host5 得分最高,最终入选
二、主机过滤
当 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 及其他 filter。
1.RetryFilter
RetryFilter 的作用是刷掉之前已经调度过的节点。
举例: 假设 A,B,C 三个节点都通过了过滤,最终 A 因为权重值最大被选中执行操作,但由于某个原因,操作在 A 上失败了。 默认情况下,nova-scheduler 会重新执行过滤操作(重复次数由 scheduler_max_attempts 选项指定,默认是 3)。这时候 RetryFilter 就会将 A 直接刷掉,避免操作再次失败。
RetryFilter 通常作为第一个 filter。
2.AvailabilityZoneFilter
为提高容灾性和提供隔离服务,可以将计算节点划分到不同的 Availability Zone (可用域) 中,例如把一个机架上的机器划分在一个 Availability Zone 中。关于 Availability Zone 和 Region 等的区别,请参见《OpenStack几个物理上的概念总结》。
OpenStack 默认有一个命名为 “nova” 的可用域,所有的计算节点初始都是放在 “nova” 中。用户可以根据需要创建自己的可用域。
创建实例时,需要指定将实例部署到在哪个可用域中。
3.RamFilter
RamFilter 将不能满足 flavor 内存需求的计算节点过滤掉。
为了提高系统的资源使用率,OpenStack 在计算节点可用内存时允许 overcommit(超配),也就是可以超过实际内存大小。超过的程度是通过 nova.conf 中 ram_allocation_ratio
这个参数来控制的,默认值为 1.5。
ram_allocation_ratio = 1.5
其含义是:如果计算节点的内存有 10GB,OpenStack 则会认为它有 15GB(10*1.5)的内存。
4.DiskFilter
DiskFilter 将不能满足 flavor 磁盘需求的计算节点过滤掉。
Disk 同样允许超配,通过 nova.conf 中 disk_allocation_ratio
控制,默认值为 1。
disk_allocation_ratio = 1.0
在生产环境中,建议磁盘不超配。
5.CoreFilter
CoreFilter 将不能满足 flavor vCPU 需求的计算节点过滤掉。
vCPU 同样允许超配,通过 nova.conf 中 cpu_allocation_ratio
控制,默认值为 16。
cpu_allocation_ratio = 16.0
这意味着一个 8 CPU 的计算节点,nova-scheduler 在调度时认为它有 128 个 vCPU。
注意: nova-scheduler 默认使用的 filter 并没有包含 CoreFilter。 如果要用,可以将 CoreFilter 添加到 nova.conf 的 scheduler_default_filters
配置