第 7 章 配置实例调度和放置

计算调度程序服务决定在哪个 Compute 节点或主机聚合上放置实例。当计算(nova)服务收到启动或移动实例的请求时,它会使用请求中提供的规格、类别和镜像来查找合适的主机。例如,类别可以指定实例需要具有主机的特征,如存储磁盘类型或 Intel CPU 指令集扩展。

计算调度程序服务使用以下组件的配置,按以下顺序决定在哪个 Compute 节点上启动或移动实例:

  1. Placement service prefilters :计算调度程序服务使用放置服务根据特定属性过滤候选 Compute 节点集合。例如,Placement 服务会自动排除禁用的 Compute 节点。
  2. 过滤器 :计算调度程序服务用来决定在其上启动实例的初始 Compute 节点集合。
  3. Weights:计算调度程序服务通过权重系统来优先选择过滤的 Compute 节点。最高权重具有最高优先级。

在下图中,主机 1 和 3 在过滤后有资格使用。主机 1 具有最高权重,因此调度具有最高优先级。

Scheduling Hosts

7.1. 使用放置服务过滤

Compute 服务(nova)在创建和管理实例时与放置服务交互。放置服务跟踪资源提供程序的清单和使用,如 Compute 节点、共享存储池或 IP 分配池,以及其可用数量资源,如可用的 vCPU。任何需要管理资源的选择和消耗的服务都可以使用放置服务。

放置服务还跟踪可用限定资源到资源提供程序的映射,如资源供应商具有的存储磁盘特征。

放置服务会根据放置服务资源供应商清单和特征,将 prefilters 应用到 candidate Compute 节点集合。您可以基于以下条件创建 prefilters:

  • 支持的镜像类型
  • 特征
  • 项目或租户
  • 可用区

7.1.1. 根据请求的镜像类型支持进行过滤

您可以排除不支持启动实例镜像的磁盘格式的 Compute 节点。当您的环境使用 Red Hat Ceph Storage 作为临时后端时,这非常有用,它不支持 QCOW2 镜像。启用此功能可确保调度程序不会将使用 QCOW2 镜像启动实例的请求发送到由 Red Hat Ceph Storage 支持的 Compute 节点。

流程

  1. 打开您的计算环境文件。
  2. 要排除不支持启动实例的镜像的磁盘格式的 Compute 节点,请在 Compute 环境文件中将 NovaSchedulerQueryImageType 参数设置为 True
  3. 保存对 Compute 环境文件的更新。
  4. 使用其他环境文件将计算环境文件添加到堆栈中,并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
     -e [your environment files] \
     -e /home/stack/templates/<compute_environment_file>.yaml

7.1.2. 根据资源供应商特征进行过滤

每个资源供应商都有一组特征。特征是资源提供程序的限定方面,如存储类型或 Intel CPU 指令集扩展名。

Compute 节点将放置服务的功能报告为特征。一个实例可以指定需要哪些特征,或者资源供应商不能有哪些特征。计算调度程序可使用这些特征来识别适合的 Compute 节点或主机聚合来托管实例。

要让您的云用户在具有特定特征的主机上创建实例,您可以定义需要或禁止特定特征的类别,您可以创建需要或禁止特定特征的镜像。

有关可用特征的列表,请参阅 os-traits。您还可以根据需要创建自定义特征。

7.1.2.1. 创建需要或禁止资源供应商特征的镜像

您可以创建云用户可用于在特定特征的主机上启动实例的镜像。

流程

  1. 创建新镜像:

    (overcloud)$ openstack image create ... trait-image
  2. 识别需要主机或主机聚合具有的特征。您可以选择现有的特征,或创建新的特征:

    • 要使用现有的特征,请列出现有特征以检索特征名称:

      (overcloud)$ openstack --os-placement-api-version 1.6 trait list
    • 要创建新特征,请输入以下命令:

      (overcloud)$ openstack --os-placement-api-version 1.6 trait \
       create CUSTOM_TRAIT_NAME

      自定义特征必须以前缀 CUSTOM_ 开头,仅包含字母 A 到 Z、数字 0 到 9,以及下划线 "_" 字符。

  3. 收集每个主机的现有资源供应商特征:

    (overcloud)$ existing_traits=$(openstack --os-placement-api-version 1.6 resource provider trait list -f value <host_uuid> | sed 's/^/--trait /')
  4. 检查现有资源供应商特征是否有您需要主机或主机聚合的特征:

    (overcloud)$ echo $existing_traits
  5. 如果您所需的特征还没有添加到资源供应商中,请将现有的特征和所需的特征添加到每个主机的资源供应商中:

    (overcloud)$ openstack --os-placement-api-version 1.6 \
     resource provider trait set $existing_traits \
     --trait <TRAIT_NAME> \
     <host_uuid>

    将 < TRAIT_NAME > 替换为您要添加到资源供应商的特征的名称。您可以根据需要,使用 --trait 选项一次添加额外的特征。

    注意

    此命令对资源提供程序执行特征的完整替换。因此,您必须检索主机上现有资源提供程序特征的列表,并再次设置它们,以防止它们被删除。

  6. 要将实例调度到具有所需特征的主机或主机聚合上,请将特征添加到镜像额外规格中。例如,要将实例调度到支持 AVX-512 的主机或主机聚合上,请在镜像额外规格中添加以下特征:

    (overcloud)$ openstack image set \
     --property trait:HW_CPU_X86_AVX512BW=required \
     trait-image
  7. 要过滤出具有禁止特征的主机或主机聚合,请将特征添加到镜像额外规格中。例如,为了避免将实例调度到支持多附加卷的主机或主机聚合上,请在镜像额外规格中添加以下特征:

    (overcloud)$ openstack image set \
     --property trait:COMPUTE_VOLUME_MULTI_ATTACH=forbidden \
     trait-image

7.1.2.2. 创建需要或禁止资源供应商特征的类别

您可以创建云用户可用于在特定特征的主机上启动实例的类别。

流程

  1. 创建类别:

    (overcloud)$ openstack flavor create --vcpus 1 --ram 512 \
     --disk 2 trait-flavor
  2. 识别需要主机或主机聚合具有的特征。您可以选择现有的特征,或创建新的特征:

    • 要使用现有的特征,请列出现有特征以检索特征名称:

      (overcloud)$ openstack --os-placement-api-version 1.6 trait list
    • 要创建新特征,请输入以下命令:

      (overcloud)$ openstack --os-placement-api-version 1.6 trait \
       create CUSTOM_TRAIT_NAME

      自定义特征必须以前缀 CUSTOM_ 开头,仅包含字母 A 到 Z、数字 0 到 9,以及下划线 "_" 字符。

  3. 收集每个主机的现有资源供应商特征:

    (overcloud)$ existing_traits=$(openstack --os-placement-api-version 1.6 resource provider trait list -f value <host_uuid> | sed 's/^/--trait /')
  4. 检查现有资源供应商特征是否有您需要主机或主机聚合的特征:

    (overcloud)$ echo $existing_traits
  5. 如果您所需的特征还没有添加到资源供应商中,请将现有的特征和所需的特征添加到每个主机的资源供应商中:

    (overcloud)$ openstack --os-placement-api-version 1.6 \
     resource provider trait set $existing_traits \
     --trait <TRAIT_NAME> \
     <host_uuid>

    将 < TRAIT_NAME > 替换为您要添加到资源供应商的特征的名称。您可以根据需要,使用 --trait 选项一次添加额外的特征。

    注意

    此命令对资源提供程序执行特征的完整替换。因此,您必须检索主机上现有资源提供程序特征的列表,并再次设置它们,以防止它们被删除。

  6. 要将实例调度到具有所需特征的主机或主机聚合上,请将特征添加到类别额外规格中。例如,要将实例调度到支持 AVX-512 的主机或主机聚合上,请在类别额外规格中添加以下特征:

    (overcloud)$ openstack flavor set \
     --property trait:HW_CPU_X86_AVX512BW=required \
     trait-flavor
  7. 要过滤出具有禁止特征的主机或主机聚合,请将特征添加到类别额外规格中。例如,为了避免将实例调度到支持多附加卷的主机或主机聚合上,请将以下特征添加到类别额外规格中:

    (overcloud)$ openstack flavor set \
     --property trait:COMPUTE_VOLUME_MULTI_ATTACH=forbidden \
     trait-flavor

7.1.3. 通过隔离主机聚合进行过滤

您可以将主机聚合上的调度限制为只有类别和镜像特征与主机聚合的元数据匹配的实例。类别和镜像元数据的组合必须要求所有主机聚合特征都有资格调度到该主机聚合中的 Compute 节点上。

流程

  1. 打开您的计算环境文件。
  2. 要将主机聚合隔离到仅其类别和镜像特征与聚合元数据匹配的实例,请在计算环境文件中将 NovaSchedulerEnableIsolatedAggregateFiltering 参数设置为 True
  3. 保存对 Compute 环境文件的更新。
  4. 使用其他环境文件将计算环境文件添加到堆栈中,并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
     -e [your environment files] \
     -e /home/stack/templates/<compute_environment_file>.yaml
  5. 识别您要隔离主机聚合的特征。您可以选择现有的特征,或创建新的特征:

    • 要使用现有的特征,请列出现有特征以检索特征名称:

      (overcloud)$ openstack --os-placement-api-version 1.6 trait list
    • 要创建新特征,请输入以下命令:

      (overcloud)$ openstack --os-placement-api-version 1.6 trait \
       create CUSTOM_TRAIT_NAME

      自定义特征必须以前缀 CUSTOM_ 开头,仅包含字母 A 到 Z、数字 0 到 9,以及下划线 "_" 字符。

  6. 收集每个 Compute 节点的现有资源供应商特征:

    (overcloud)$ existing_traits=$(openstack --os-placement-api-version 1.6 resource provider trait list -f value <host_uuid> | sed 's/^/--trait /')
  7. 检查您要隔离主机聚合的现有资源供应商特征:

    (overcloud)$ echo $existing_traits
  8. 如果您所需的特征还没有添加到资源提供程序中,请在主机聚合中将现有的特征和所需的特征添加到每个 Compute 节点的资源供应商中:

    (overcloud)$ openstack --os-placement-api-version 1.6 \
     resource provider trait set $existing_traits \
     --trait <TRAIT_NAME> \
     <host_uuid>

    将 < TRAIT_NAME > 替换为您要添加到资源供应商的特征的名称。您可以根据需要,使用 --trait 选项一次添加额外的特征。

    注意

    此命令对资源提供程序执行特征的完整替换。因此,您必须检索主机上现有资源提供程序特征的列表,并再次设置它们,以防止它们被删除。

  9. 对主机聚合中的每个 Compute 节点重复步骤 6 - 8。
  10. 将特征的 metadata 属性添加到主机聚合中:

    (overcloud)$ openstack --os-compute-api-version 2.53 aggregate set \
     --property trait:<TRAIT_NAME>=required <aggregate_name>
  11. 将特征添加到类别或镜像中:

    (overcloud)$ openstack flavor set \
     --property trait:<TRAIT_NAME>=required <flavor>
    (overcloud)$ openstack image set \
     --property trait:<TRAIT_NAME>=required <image>

7.1.4. 使用放置服务根据可用区进行过滤

您可以使用放置服务来遵循可用区请求。要使用放置服务根据可用区过滤,放置聚合必须存在与可用区主机聚合的成员资格和 UUID 匹配。

流程

  1. 打开您的计算环境文件。
  2. 要使用放置服务根据可用区过滤,请在计算环境文件中将 NovaSchedulerQueryPlacementForAvailabilityZone 参数设置为 True
  3. NovaSchedulerDefaultFilters 参数中删除 AvailabilityZoneFilter 过滤器。
  4. 保存对 Compute 环境文件的更新。
  5. 使用其他环境文件将计算环境文件添加到堆栈中,并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
     -e [your environment files] \
     -e /home/stack/templates/<compute_environment_file>.yaml

其他资源