计算使用 nova-scheduler 服务来确定如何调度计算请求
默认配置中,调度程序会考虑以下所有条件的主机:
- 位于请求的可用区 (map_az_to_placement_aggregate) 放置预过滤器中
- 可以为请求提供服务,这意味着处理目标节点的 nova-compute 服务可用且未禁用(ComputeFilter)。
- 满足与实例类型 (ComputeCapabilityFilter) 关联的额外规范。
- 满足在实例的映像属性 (ImagePropertiesFilter) 上指定的任何体系结构、管理程序类型或虚拟机模式属性。
- 与组的其他实例位于不同的主机上(如果请求)(ServerGroupAntiAffinityFilter)。
- 位于一组组主机中(如果需要)(ServerGroupAffinityFilter)。
从主机撤离实例时,调度程序服务将遵循管理员在 nova evacuate 命令上定义的目标主机,如果管理员未定义目标,则调度程序将确定目标主机。
Prefilters
从 Rocky 版本开始,调度过程包括预过滤步骤,以提高后续阶段的效率。这些预过滤器在很大程度上是可选的,用于增强发送到放置的请求,以根据放置能够提前为我们回答的属性来减少候选计算主机集。
The Filter Scheduler(过滤器调度器)
删除了对自定义调度程序驱动程序的支持。 nova 现在仅支持过滤器调度程序。
Nova 的调度程序(称为过滤调度程序)支持过滤和加权,以便就应在何处创建新实例做出明智的决策。
当调度程序收到资源请求时,它首先应用过滤器来确定在分派资源时哪些主机有资格考虑,过滤器是二元的:过滤器要么接受主机,要么拒绝主机。然后,过滤器接受的主机将通过不同的算法进行处理,以决定哪些主机用于该请求,如“权重”部分所述。
filter_scheduler.available_filters 配置选项为计算服务提供可供调度程序使用的过滤器列表。默认设置指定计算服务中包含的所有过滤器。该配置选项可以指定多次。例如,如果您在 Python 中实现了自己的自定义过滤器(名为 myfilter)。如果您想同时使用内置过滤器和自定义过滤器,您的 nova.conf 文件将包含:
[filter_scheduler]
available_filters = nova.scheduler.filters.all_filters
available_filters = myfilter.MyFilter
nova.conf 中的 filter_scheduler.enabled_filters 配置选项定义 nova-scheduler 服务应用的过滤器列表。
Filters(过滤器)
以下部分描述了可用的计算过滤器
过滤器使用以下配置选项进行配置:
- filter_scheduler.available_filters - 定义可供调度程序使用的过滤器类。该设置可以多次使用。
- filter_scheduler.enabled_filters - 在可用过滤器中,定义调度程序默认使用的过滤器。
每个过滤器以不同的方式选择主机并具有不同的成本。filter_scheduler.enabled_filters的顺序影响调度性能。一般建议是尽快过滤掉无效主机,避免不必要的成本。我们可以按相反的顺序按成本对 filter_scheduler.enabled_filters 项目进行排序。例如,ComputeFilter 优于任何资源计算过滤器(如 NUMATopologyFilter)。
1、AggregateImagePropertiesIsolation
在 12.0.0 Liberty 之前,可以通过此过滤器指定和使用任意元数据。从 Liberty 开始,nova 仅解析标准元数据。如果您希望使用任意元数据,请考虑使用 AggregateInstanceExtraSpecsFilter 过滤器。
将图像元数据中定义的属性与聚合的属性进行匹配,以确定主机匹配:
- 如果主机属于聚合,并且聚合定义了一个或多个与映像属性匹配的元数据,则该主机是启动映像实例的候选主机。
- 如果主机不属于任何聚合,则它可以从所有映像启动实例。
例如,以下聚合 myWinAgg 将 Windows 操作系统作为元数据(名为“windows”):
openstack aggregate show myWinAgg
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | zone1 |
| created_at | 2017-01-01T15:36:44.000000 |
| deleted | False |
| deleted_at | None |
| hosts | ['sf-devel'] |
| id | 1 |
| name | myWinAgg |
| properties | os_distro='windows' |
| updated_at | None |
+-------------------+----------------------------+
在此示例中,由于以下 Win-2012 映像具有 windows 属性,因此它在 sf-devel 主机上启动(所有其他过滤器相同):
openstack image show Win-2012
+------------------+------------------------------------------------------+
| Field | Value |
+------------------+------------------------------------------------------+
| checksum | ee1eca47dc88f4879d8a229cc70a07c6 |
| container_format | bare |
| created_at | 2016-12-13T09:30:30Z |
| disk_format | qcow2 |
| ... |
| name | Win-2012 |
| ... |
| properties | os_distro='windows' |
| ... |
您可以使用 nova.conf 文件中的以下选项来配置 AggregateImagePropertiesIsolation 过滤器:
- filter_scheduler.aggregate_image_properties_isolation_namespace
- filter_scheduler.aggregate_image_properties_isolation_separator
2、AggregateInstanceExtraSpecsFilter
将实例类型的额外规范中定义的属性与主机聚合上管理员定义的属性进行匹配。适用于aggregate_instance_extra_specs 范围内的规范。可以以逗号分隔的列表形式给出多个值。为了向后兼容,也适用于非范围规范;强烈建议不要执行此操作,因为当您启用这两个过滤器时,它会与 ComputeCapabilityFilter 过滤器发生冲突。
3、AggregateIoOpsFilter
使用每个聚合的 max_io_ops_per_host 值按磁盘分配过滤主机。如果未找到每个聚合值,该值回退到由:oslo.config:option:filter_scheduler.max_io_ops_per_host 配置选项定义的全局设置。如果主机属于多个聚合并且找到多个值,则将使用最小值。
4、AggregateMultiTenancyIsolation
确保租户隔离的主机聚合中的主机仅可供指定的一组租户使用。如果主机位于具有 filter_tenant_id 元数据键的聚合中,则主机只能从该租户或以逗号分隔的租户列表构建实例。主机可以位于不同的聚合中。如果主机不属于具有元数据键的聚合,则主机可以从所有租户构建实例。这不会限制租户在租户隔离聚合之外的主机上创建服务器。
例如,考虑有两个可用的主机用于调度:HostA 和 HostB。 HostB 处于与租户 X 隔离的聚合中。来自租户 X 的服务器创建请求将导致 HostA 或 HostB 在调度期间作为候选者。来自另一个租户 Y 的服务器创建请求将导致只有 HostA 成为调度候选者,因为 HostA 不是租户隔离聚合的一部分。
5、AggregateNumInstancesFilter
使用每个聚合的 max_instances_per_host 值,按实例数量过滤聚合中的主机。如果未找到每个聚合值,则该值将回退到由filter_scheduler.max_instances_per_host 配置选项定义的全局设置。如果主机属于多个聚合,因此找到多个值,则将使用最小值。
6、AggregateTypeAffinityFilter
如果实例风味的名称与聚合元数据中设置的instance_type 键匹配,或者未设置instance_type 键,则过滤聚合中的主机。
instance_type 元数据条目的值是一个字符串,可以包含单个instance_type 名称或以逗号分隔的instance_type 名称列表,例如m1.nano 或m1.nano,m1.small。
7、AllHostsFilter
这是一个无操作过滤器。它不会消除任何可用的主机。
8、ComputeCapabilitiesFilter
通过将实例类型额外规范中定义的属性与计算功能相匹配来过滤主机。如果额外的specs键包含冒号(:),则冒号之前的任何内容都将被视为命名空间,而冒号之后的任何内容都将被视为要匹配的键。如果命名空间存在且不是功能,则过滤器会忽略该命名空间。例如,capability:cpu_info:features 是有效的范围格式,为了向后兼容,如果不存在命名空间,过滤器还将额外的规范键视为要匹配的键;强烈建议不要执行此操作,因为当您启用这两个过滤器时,它会与 AggregateInstanceExtraSpecsFilter 过滤器发生冲突。
9、ComputeFilter
通过所有可操作且已启用的主机。
一般来说,您应该始终启用此过滤器。
10、DifferentHostFilter
将实例安排在一组实例中不同的主机上。要利用此过滤器,请求者必须传递调度程序提示,使用 different_host 作为键,使用实例 UUID 列表作为值。此过滤器与 SameHostFilter 相反。
例如,当使用** openstack server create** 命令时,请使用 --hint 标志:
openstack server create \
--image cedef40a-ed67-4d10-800e-17455edce175 --flavor 1 \
--hint different_host=a0cf03a5-d921-4877-bb5c-86d26cf818e1 \
--hint different_host=8c19174f-4220-44f0-824a-cd1eeef10287 \
server-1
对于 API,请使用 os:scheduler_hints 键。例如:
{
"server": {
"name": "server-1",
"imageRef": "cedef40a-ed67-4d10-800e-17455edce175",
"flavorRef": "1"
},
"os:scheduler_hints": {
"different_host": [
"a0cf03a5-d921-4877-bb5c-86d26cf818e1",
"8c19174f-4220-44f0-824a-cd1eeef10287"
]
}
}
11、ImagePropertiesFilter
根据实例映像上定义的属性过滤主机。它传递可以支持实例中包含的指定映像属性的主机。属性包括体系结构、虚拟机管理程序类型、虚拟机管理程序版本和虚拟机模式。
例如,实例可能需要运行基于 ARM 的处理器和 QEMU 作为虚拟机管理程序的主机。您可以使用以下属性来装饰图像:
openstack image set --architecture arm --property img_hv_type=qemu img-uuid
过滤器检查的图像属性是:
hw_architecture(硬件架构)
描述镜像所需的机器架构。示例包括 i686、x86_64、arm 和 ppc64。
img_hv_type
描述映像所需的虚拟机管理程序。例如 qemu 和 hyperv。
img_hv_requested_version
hw_vm_mode
12、IsolatedHostsFilter
允许管理员定义一组特殊(隔离)映像和一组特殊(隔离)主机,使得隔离映像只能在隔离主机上运行,并且隔离主机只能运行隔离映像。标志 limit_isolated_hosts_to_isolated_images 可用于强制隔离主机仅运行隔离映像。
过滤器内的逻辑取决于restrict_isolated_hosts_to_isolated_images 配置选项,该选项默认为True。当为 True 时,卷支持的实例将不会放置在隔离主机上。当为 False 时,卷支持的实例可以运行在任何主机上,无论是否隔离。
管理员必须使用filter_scheduler.isolated_hosts 和filter_scheduler.isolated_images 配置选项指定隔离的映像和主机集。例如:
[filter_scheduler]
isolated_hosts = server1, server2
isolated_images = 342b492c-128f-4a42-8d3a-c5088cf27d13, ebd267a6-ca86-4d6c-9a0e-bd132d6b7d09
您还可以使用 filter_scheduler.restrict_isolated_hosts_to_isolated_images 配置选项指定隔离主机仅用于特定的隔离映像。
13、IoOpsFilter
按主机上的并发 I/O 操作过滤主机。并发 I/O 操作过多的主机将被过滤掉。filter_scheduler.max_io_ops_per_host 选项指定允许在主机上运行的 I/O 密集型实例的最大数量。如果主机上运行的构建、调整大小、快照、迁移、救援或取消搁置任务状态的实例数量超过filter_scheduler.max_io_ops_per_host,则调度程序将忽略该主机。
14、JsonFilter
不常用,省略
15、NumInstancesFilter
与 MetricsWeigher 秤配合使用。过滤不报告metrics.weight_setting中指定指标的主机,从而确保指标权重器不会因这些主机而失败。
16、PciPassthroughFilter
如果主机具有满足风味的 extra_specs 属性中的设备请求的设备,则过滤器会在主机上调度实例。
如果使用具有 PCI 设备请求的实例或在主机上使用基于 SR-IOV 的网络,则此过滤器至关重要。
17、SameHostFilter
将实例安排在与一组实例中的所有其他实例相同的主机上。要利用此过滤器,请求者必须传递调度程序提示,使用 same_host 作为键,使用实例 UUID 列表作为值。此过滤器与 DifferentHostFilter 相反。
例如,当使用 openstack server create 命令时,请使用 --hint 标志:
openstack server create \
--image cedef40a-ed67-4d10-800e-17455edce175 --flavor 1 \
--hint same_host=a0cf03a5-d921-4877-bb5c-86d26cf818e1 \
--hint same_host=8c19174f-4220-44f0-824a-cd1eeef10287 \
server-1
对于 API,使用 os:scheduler_hints 键:
{
"server": {
"name": "server-1",
"imageRef": "cedef40a-ed67-4d10-800e-17455edce175",
"flavorRef": "1"
},
"os:scheduler_hints": {
"same_host": [
"a0cf03a5-d921-4877-bb5c-86d26cf818e1",
"8c19174f-4220-44f0-824a-cd1eeef10287"
]
}
}
18、ServerGroupAffinityFilter
将属于同一服务器组的实例限制在同一主机上。要利用此过滤器,请求者必须创建具有关联性策略的服务器组,并传递调度程序提示,使用组作为键,使用服务器组 UUID 作为值。
例如,当使用 openstack server create 命令时,请使用 --hint 标志:
openstack server group create --policy affinity group-1
openstack server create --image IMAGE_ID --flavor 1 \
--hint group=SERVER_GROUP_UUID server-1
19、ServerGroupAntiAffinityFilter
将属于服务器组的实例限制为单独的主机。要利用此过滤器,请求者必须创建一个具有反关联策略的服务器组,并传递调度程序提示,使用组作为键,使用服务器组 UUID 作为值。
例如,当使用 openstack server create 命令时,请使用 --hint 标志:
openstack server group create --policy anti-affinity group-1
openstack server create --image IMAGE_ID --flavor 1 \
--hint group=SERVER_GROUP_UUID server-1
20、SimpleCIDRAffinityFilter
Weights(权重)
当资源实例时,过滤器调度程序对可接受主机列表中的每个主机进行过滤和加权。每次调度程序选择一个主机时,它实际上都会消耗该主机上的资源,并且后续的选择也会相应地进行调整。当客户请求相同数量的实例时,此过程非常有用,因为会为每个请求的实例计算权重。
为了确定一个权重器相对于另一个权重器的优先级,所有权重器必须定义一个乘数,该乘数将在计算节点的权重之前应用。所有权重都预先标准化,以便可以轻松应用乘数。
因此该物体的最终权重将是:
weight = w1_multiplier * norm(w1) + w2_multiplier * norm(w2) + ...
主机根据以下配置选项进行加权:
- filter_scheduler.host_subset_size
- filter_scheduler.weight_classes
RAMWeigher
CPUWeigher
DiskWeigher
MetricsWeigher
IoOpsWeigher
PCIWeigher
ServerGroupSoftAffinityWeigher
ServerGroupSoftAntiAffinityWeigher
BuildFailureWeigher
CrossCellWeigher
HypervisorVersionWeigher
NumInstancesWeigher
Utilization-aware scheduling