×

将自动缩放应用于 OpenShift Container Platform 集群涉及部署集群自动缩放器,然后为集群中的每种机器类型部署机器自动缩放器。

只有在 Machine API Operator 运行的集群中才能配置集群自动缩放器。

关于集群自动缩放器

集群自动缩放器会调整 OpenShift Container Platform 集群的大小以满足其当前的部署需求。它使用声明式、Kubernetes 风格的参数来提供不依赖于特定云提供商对象的架构管理。集群自动缩放器具有集群范围,并且不与特定的命名空间关联。

当由于资源不足而导致 Pod 无法调度到任何当前工作节点上,或者需要另一个节点来满足部署需求时,集群自动缩放器会增加集群的大小。集群自动缩放器不会将集群资源增加到您指定的限制之外。

集群自动缩放器计算集群中所有节点的总内存、CPU 和 GPU,即使它不管理控制平面节点也是如此。这些值不是单机导向的。它们是整个集群中所有资源的聚合。例如,如果您设置了最大内存资源限制,则集群自动缩放器在计算当前内存使用率时会包含集群中的所有节点。然后使用该计算来确定集群自动缩放器是否有能力添加更多工作资源。

确保您创建的 `ClusterAutoscaler` 资源定义中的 `maxNodesTotal` 值足够大,以考虑集群中所有可能的机器总数。此值必须包含控制平面机器的数量以及您可能扩展到的计算机器的数量。

自动删除节点

每 10 秒,集群自动缩放器都会检查集群中哪些节点是不必要的并将其删除。如果满足以下条件,集群自动缩放器会考虑删除节点

  • 节点利用率低于集群的 *节点利用率级别* 阈值。节点利用率级别是节点请求资源之和除以节点分配资源的结果。如果您未在 `ClusterAutoscaler` 自定义资源中指定值,则集群自动缩放器将使用默认值 `0.5`,这对应于 50% 的利用率。

  • 集群自动缩放器可以将运行在节点上的所有 Pod 移动到其他节点。Kubernetes 调度程序负责将 Pod 调度到节点上。

  • 集群自动缩放器未禁用缩减功能注释。

如果节点上存在以下类型的 Pod,则集群自动缩放器将不会删除该节点

  • 具有限制性 Pod 中断预算 (PDB) 的 Pod。

  • 默认情况下不运行在节点上的 Kube-system Pod。

  • 没有 PDB 或 PDB 过于严格的 Kube-system Pod。

  • 不受控制器对象(例如部署、副本集或有状态集)支持的 Pod。

  • 具有本地存储的 Pod。

  • 由于缺乏资源、不兼容的节点选择器或亲和性、匹配的反亲和性等原因而无法移动到其他位置的 Pod。

  • 除非同时也具有 `“cluster-autoscaler.kubernetes.io/safe-to-evict”: “true”` 注解,否则具有 `“cluster-autoscaler.kubernetes.io/safe-to-evict”: “false”` 注解的 Pod 将不会被删除。

例如,您将最大 CPU 限制设置为 64 核,并将集群自动伸缩器配置为仅创建每个具有 8 核的机器。如果您的集群以 30 核启动,则集群自动伸缩器最多可以添加 4 个具有 32 核的节点,总计 62 核。

限制

如果您配置了集群自动伸缩器,则会应用其他使用限制

  • 不要直接修改处于自动伸缩节点组中的节点。同一节点组中的所有节点都具有相同的容量和标签,并运行相同的系统 Pod。

  • 为您的 Pod 指定请求。

  • 如果您需要防止 Pod 过快被删除,请配置合适的 PDB(Pod Disruption Budgets)。

  • 确认您的云提供商配额足够大,可以支持您配置的最大节点池。

  • 不要运行额外的节点组自动伸缩器,尤其是云提供商提供的那些。

只有在这样做会导致可调度的 Pod 时,集群自动伸缩器才会在自动伸缩节点组中添加节点。如果可用的节点类型无法满足 Pod 请求的要求,或者能够满足这些要求的节点组已达到最大规模,则集群自动伸缩器无法进行向上扩展。

与其他调度功能的交互

水平 Pod 自动伸缩器 (HPA) 和集群自动伸缩器以不同的方式修改集群资源。HPA 根据当前 CPU 负载更改部署或副本集的副本数量。如果负载增加,HPA 将创建新的副本,而不管集群可用的资源量是多少。如果没有足够的资源,集群自动伸缩器将添加资源,以便 HPA 创建的 Pod 可以运行。如果负载减少,HPA 将停止一些副本。如果此操作导致某些节点利用率不足或完全空闲,则集群自动伸缩器将删除不必要的节点。

集群自动伸缩器会考虑 Pod 优先级。Pod 优先级和抢占功能允许在集群资源不足的情况下基于优先级调度 Pod,但集群自动伸缩器确保集群拥有运行所有 Pod 的资源。为了遵循这两个功能的意图,集群自动伸缩器包含一个优先级截止功能。您可以使用此截止值来调度“尽力而为”的 Pod,这些 Pod 不会导致集群自动伸缩器增加资源,而只会在有空闲资源时运行。

优先级低于截止值的 Pod 不会导致集群向上扩展,也不会阻止集群向下扩展。不会添加新节点来运行这些 Pod,并且运行这些 Pod 的节点可能会被删除以释放资源。

配置集群自动伸缩器

首先,部署集群自动伸缩器以管理 OpenShift Container Platform 集群中的自动资源伸缩。

由于集群自动伸缩器的范围是整个集群,因此您只能为集群创建一个集群自动伸缩器。

集群自动伸缩器资源定义

此 `ClusterAutoscaler` 资源定义显示了集群自动伸缩器的参数和示例值。

当您更改现有集群自动伸缩器的配置时,它会重新启动。

apiVersion: "autoscaling.openshift.io/v1"
kind: "ClusterAutoscaler"
metadata:
  name: "default"
spec:
  podPriorityThreshold: -10 (1)
  resourceLimits:
    maxNodesTotal: 24 (2)
    cores:
      min: 8 (3)
      max: 128 (4)
    memory:
      min: 4 (5)
      max: 256 (6)
    gpus:
    - type: <gpu_type> (7)
      min: 0 (8)
      max: 16 (9)
  logVerbosity: 4 (10)
  scaleDown: (11)
    enabled: true (12)
    delayAfterAdd: 10m (13)
    delayAfterDelete: 5m (14)
    delayAfterFailure: 30s (15)
    unneededTime: 5m (16)
    utilizationThreshold: "0.4" (17)
  expanders: ["Random"] (18)
1 指定 Pod 必须超过的优先级才能使集群自动伸缩器部署其他节点。输入一个 32 位整数。`podPriorityThreshold` 值将与您分配给每个 Pod 的 `PriorityClass` 的值进行比较。
2 指定要部署的最大节点数。此值是部署在集群中的机器总数,而不仅仅是自动伸缩器控制的那些机器。确保此值足够大,以考虑所有控制平面和计算机器以及您在 `MachineAutoscaler` 资源中指定的副本总数。
3 指定要在集群中部署的最小核心数。
4 指定要在集群中部署的最大核心数。
5 指定集群中的最小内存量(以 GiB 为单位)。
6 指定集群中的最大内存量(以 GiB 为单位)。
7 可选:要将集群自动伸缩器配置为部署支持 GPU 的节点,请指定 `type` 值。此值必须与管理该类型支持 GPU 节点的机器集中 `spec.template.spec.metadata.labels[cluster-api/accelerator]` 标签的值匹配。例如,此值可能是 `nvidia-t4` 表示 Nvidia T4 GPU,或 `nvidia-a10g` 表示 A10G GPU。有关更多信息,请参阅“为集群自动伸缩器标记 GPU 机器集”。
8 指定要在集群中部署的指定类型的最小 GPU 数量。
9 指定要在集群中部署的指定类型的最大 GPU 数量。
10 指定 `0` 到 `10` 之间的日志记录详细程度级别。以下日志级别阈值仅供参考
  • 1:(默认)有关更改的基本信息。

  • 4:用于排查典型问题的调试级别详细程度。

  • 9:广泛的协议级调试信息。

如果您未指定值,则使用默认值 1

11 在本节中,您可以使用任何有效的 ParseDuration 间隔(包括 `ns`、`us`、`ms`、`s`、`m` 和 `h`)来指定每个操作的等待时间。
12 指定集群自动伸缩器是否可以删除不必要的节点。
13 可选:在最近添加节点后,指定等待删除节点的时间段。如果您未指定值,则使用默认值 `10m`。
14 可选:在最近删除节点后,指定等待删除节点的时间段。如果您未指定值,则使用默认值 `0s`。
15 可选:在缩减规模失败后,指定等待删除节点的时间段。如果您未指定值,则使用默认值 `3m`。
16 可选:指定不必要节点有资格删除之前的时间段。如果您未指定值,则使用默认值 `10m`。
17 可选:指定 *节点利用率级别*。低于此利用率级别的节点有资格被删除。

节点利用率级别是节点的请求资源总和除以分配资源的结果,必须大于 `"0"` 但小于 `"1"`。如果您未指定值,则集群自动伸缩器将使用默认值 `"0.5"`,对应于 50% 的利用率。您必须将此值表示为字符串。

18 可选:指定您希望集群自动伸缩器使用的任何扩展器。以下值有效
  • LeastWaste:选择在扩展后使空闲 CPU 最小的机器集。如果多个机器集产生的空闲 CPU 量相同,则选择会使未使用的内存最小化。

  • 优先级:选择用户分配的优先级最高的机器集。要使用此扩展器,必须创建一个定义机器集优先级的配置映射。更多信息,请参见“为集群自动扩展器配置优先级扩展器”。

  • 随机:(默认)随机选择机器集。

如果未指定值,则使用随机的默认值。

可以使用[LeastWaste, Priority]格式指定多个扩展器。集群自动扩展器会按照指定的顺序应用每个扩展器。

[LeastWaste, Priority]示例中,集群自动扩展器首先根据LeastWaste标准进行评估。如果多个机器集同样满足LeastWaste标准,则集群自动扩展器会根据优先级标准进行评估。如果多个机器集同样满足所有指定的扩展器,则集群自动扩展器会随机选择一个使用。

执行扩展操作时,集群自动扩展器会保持在ClusterAutoscaler资源定义中设置的范围内,例如要部署的内核的最小和最大数量或集群中的内存量。但是,集群自动扩展器不会校正集群中的当前值以使其处于这些范围内。

最小和最大CPU、内存和GPU值是通过计算集群中所有节点上的这些资源来确定的,即使集群自动扩展器不管理这些节点也是如此。例如,即使集群自动扩展器不管理控制平面节点,控制平面节点也会被考虑在集群的总内存中。

为集群自动扩展器配置优先级扩展器

当集群自动扩展器使用优先级扩展器时,它会使用用户分配的优先级最高的机器集进行向上扩展。要使用此扩展器,必须创建一个定义机器集优先级的配置映射。

对于每个指定的优先级级别,必须创建正则表达式来识别在为机器集选择时要使用的机器集。正则表达式必须与集群自动扩展器要考虑选择的任何计算机器集的名称匹配。

先决条件
  • 您已部署使用机器 API 的 OpenShift Container Platform 集群。

  • 您可以使用具有cluster-admin权限的帐户访问集群。

  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 通过运行以下命令列出集群上的计算机器集

    $ oc get machinesets.machine.openshift.io
    示例输出
    NAME                                        DESIRED   CURRENT   READY   AVAILABLE   AGE
    archive-agl030519-vplxk-worker-us-east-1c   1         1         1       1           25m
    fast-01-agl030519-vplxk-worker-us-east-1a   1         1         1       1           55m
    fast-02-agl030519-vplxk-worker-us-east-1a   1         1         1       1           55m
    fast-03-agl030519-vplxk-worker-us-east-1b   1         1         1       1           55m
    fast-04-agl030519-vplxk-worker-us-east-1b   1         1         1       1           55m
    prod-01-agl030519-vplxk-worker-us-east-1a   1         1         1       1           33m
    prod-02-agl030519-vplxk-worker-us-east-1c   1         1         1       1           33m
  2. 使用正则表达式,构造一个或多个模式,这些模式与要设置优先级级别的任何计算机器集的名称匹配。

    例如,使用正则表达式模式*fast*来匹配名称中包含字符串fast的任何计算机器集。

  3. 创建一个cluster-autoscaler-priority-expander.yml YAML 文件,该文件定义一个类似于以下内容的配置映射

    示例优先级扩展器配置映射
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cluster-autoscaler-priority-expander (1)
      namespace: openshift-machine-api (2)
    data:
      priorities: |- (3)
        10:
          - .*fast.*
          - .*archive.*
        40:
          - .*prod.*
    1 必须将配置映射命名为cluster-autoscaler-priority-expander
    2 必须在与集群自动扩展器 pod 相同的命名空间中创建配置映射,该命名空间是openshift-machine-api命名空间。
    3 定义机器集的优先级。

    priorities值必须是正整数。集群自动扩展器会先使用高优先级,然后再使用低优先级。

    对于每个优先级级别,请指定与要使用的机器集相对应的正则表达式。

  4. 通过运行以下命令创建配置映射

    $ oc create configmap cluster-autoscaler-priority-expander \
      --from-file=<location_of_config_map_file>/cluster-autoscaler-priority-expander.yml
验证
  • 通过运行以下命令查看配置映射

    $ oc get configmaps cluster-autoscaler-priority-expander -o yaml
后续步骤
  • 要使用优先级扩展器,请确保ClusterAutoscaler资源定义配置为使用expanders: ["Priority"]参数。

为集群自动扩展器标记 GPU 机器集

可以使用机器集标签来指示集群自动扩展器可以使用哪些机器来部署启用 GPU 的节点。

先决条件
  • 您的集群使用集群自动扩展器。

步骤
  • 在要为其创建机器的机器集上,集群自动扩展器将使用这些机器来部署启用 GPU 的节点,添加cluster-api/accelerator标签

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    metadata:
      name: machine-set-name
    spec:
      template:
        spec:
          metadata:
            labels:
              cluster-api/accelerator: nvidia-t4 (1)
    1 指定您选择的标签,该标签由字母数字字符、-_.组成,并以字母数字字符开头和结尾。例如,您可以使用nvidia-t4来表示 Nvidia T4 GPU,或使用nvidia-a10g来表示 A10G GPU。

    必须为ClusterAutoscaler CR 中的spec.resourceLimits.gpus.type参数指定此标签的值。更多信息,请参见“集群自动扩展器资源定义”。

部署集群自动扩展器

要部署集群自动扩展器,需要创建一个ClusterAutoscaler资源实例。

步骤
  1. 为包含自定义资源定义的ClusterAutoscaler资源创建一个 YAML 文件。

  2. 通过运行以下命令在集群中创建自定义资源

    $ oc create -f <filename>.yaml (1)
    1 <filename>是自定义资源文件的名称。
后续步骤

关于机器自动扩展器

机器自动扩展器会调整在 OpenShift Container Platform 集群中部署的计算机器集中的机器数量。您可以同时扩展默认的worker计算机器集以及您创建的任何其他计算机器集。当集群资源不足以支持更多部署时,机器自动扩展器会创建更多机器。对MachineAutoscaler资源中值的任何更改(例如实例的最小或最大数量)都会立即应用于它们所针对的计算机器集。

必须部署机器自动扩展器才能使集群自动扩展器扩展您的机器。集群自动扩展器使用机器自动扩展器设置的计算机器集上的注释来确定它可以扩展的资源。如果定义了集群自动扩展器但未定义机器自动扩展器,则集群自动扩展器将永远不会扩展您的集群。

配置机器自动扩展器

部署集群自动扩展器后,部署引用用于扩展集群的计算机器集的MachineAutoscaler资源。

部署ClusterAutoscaler资源后,必须部署至少一个MachineAutoscaler资源。

必须为每个计算机器集配置单独的资源。请记住,计算机器集在每个区域中都是不同的,因此请考虑是否要在多个区域中启用机器扩展。您要扩展的计算机器集必须至少包含一台机器。

机器自动扩展器资源定义

MachineAutoscaler资源定义显示了机器自动扩展器的参数和示例值。

apiVersion: "autoscaling.openshift.io/v1beta1"
kind: "MachineAutoscaler"
metadata:
  name: "worker-us-east-1a" (1)
  namespace: "openshift-machine-api"
spec:
  minReplicas: 1 (2)
  maxReplicas: 12 (3)
  scaleTargetRef: (4)
    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet (5)
    name: worker-us-east-1a (6)
1 指定机器自动扩展器名称。为了更容易识别此机器自动扩展器扩展哪个计算机器集,请指定或包含要扩展的计算机器集的名称。计算机器集名称采用以下形式:<clusterid>-<machineset>-<region>
2 指定在集群自动扩展器启动集群扩展后必须保留在指定区域中的指定类型的机器的最小数量。如果在 AWS、GCP、Azure、RHOSP 或 vSphere 中运行,则此值可以设置为0。对于其他提供商,请勿将此值设置为0

对于运行昂贵或使用受限的专用工作负载硬件,或使用超大型机器扩展计算机器集等用例,您可以将此值设置为0以节省成本。如果机器未使用,集群自动缩放器会将计算机器集缩减到零。

对于在安装程序预配的基础架构中安装 OpenShift Container Platform 过程中创建的三个计算机器集,请勿将spec.minReplicas值设置为0

3 指定集群自动缩放器在启动集群缩放后可在指定区域中部署的指定类型机器的最大数量。确保ClusterAutoscaler资源定义中的maxNodesTotal值足够大,以允许机器自动缩放器部署此数量的机器。
4 在本节中,请提供描述要缩放的现有计算机器集的值。
5 kind参数值始终为MachineSet
6 name值必须与现有计算机器集的名称匹配,如metadata.name参数值所示。

部署机器自动缩放器

要部署机器自动缩放器,您需要创建一个MachineAutoscaler资源实例。

步骤
  1. 为包含自定义资源定义的MachineAutoscaler资源创建一个 YAML 文件。

  2. 通过运行以下命令在集群中创建自定义资源

    $ oc create -f <filename>.yaml (1)
    1 <filename>是自定义资源文件的名称。

禁用自动缩放

您可以禁用集群中的单个机器自动缩放器,也可以完全禁用集群上的自动缩放。

禁用机器自动缩放器

要禁用机器自动缩放器,您可以删除相应的MachineAutoscaler自定义资源 (CR)。

禁用机器自动缩放器不会禁用集群自动缩放器。要禁用集群自动缩放器,请按照“禁用集群自动缩放器”中的说明操作。

步骤
  1. 通过运行以下命令列出集群的MachineAutoscaler CR

    $ oc get MachineAutoscaler -n openshift-machine-api
    示例输出
    NAME                 REF KIND     REF NAME             MIN   MAX   AGE
    compute-us-east-1a   MachineSet   compute-us-east-1a   1     12    39m
    compute-us-west-1a   MachineSet   compute-us-west-1a   2     4     37m
  2. 可选:通过运行以下命令创建MachineAutoscaler CR 的 YAML 文件备份

    $ oc get MachineAutoscaler/<machine_autoscaler_name> \(1)
      -n openshift-machine-api \
      -o yaml> <machine_autoscaler_name_backup>.yaml (2)
    1 <machine_autoscaler_name>是要删除的 CR 的名称。
    2 <machine_autoscaler_name_backup>是 CR 备份的名称。
  3. 通过运行以下命令删除MachineAutoscaler CR

    $ oc delete MachineAutoscaler/<machine_autoscaler_name> -n openshift-machine-api
    示例输出
    machineautoscaler.autoscaling.openshift.io "compute-us-east-1a" deleted
验证
  • 要验证机器自动缩放器是否已禁用,请运行以下命令

    $ oc get MachineAutoscaler -n openshift-machine-api

    禁用的机器自动缩放器不会出现在机器自动缩放器列表中。

后续步骤
  • 如果您需要重新启用机器自动缩放器,请使用<machine_autoscaler_name_backup>.yaml备份文件,并按照“部署机器自动缩放器”中的说明操作。

禁用集群自动缩放器

要禁用集群自动缩放器,您可以删除相应的ClusterAutoscaler资源。

禁用集群自动缩放器会禁用集群上的自动缩放,即使集群具有现有的机器自动缩放器也是如此。

步骤
  1. 通过运行以下命令列出集群的ClusterAutoscaler资源

    $ oc get ClusterAutoscaler
    示例输出
    NAME      AGE
    default   42m
  2. 可选:通过运行以下命令创建ClusterAutoscaler CR 的 YAML 文件备份

    $ oc get ClusterAutoscaler/default \(1)
      -o yaml> <cluster_autoscaler_backup_name>.yaml (2)
    1 defaultClusterAutoscaler CR 的名称。
    2 <cluster_autoscaler_backup_name>是 CR 备份的名称。
  3. 通过运行以下命令删除ClusterAutoscaler CR

    $ oc delete ClusterAutoscaler/default
    示例输出
    clusterautoscaler.autoscaling.openshift.io "default" deleted
验证
  • 要验证集群自动缩放器是否已禁用,请运行以下命令

    $ oc get ClusterAutoscaler
    预期输出
    No resources found
后续步骤
  • 通过删除ClusterAutoscaler CR 来禁用集群自动缩放器会阻止集群自动缩放,但不会删除集群上任何现有的机器自动缩放器。要清理不需要的机器自动缩放器,请参见“禁用机器自动缩放器”。

  • 如果您需要重新启用集群自动缩放器,请使用<cluster_autoscaler_name_backup>.yaml备份文件,并按照“部署集群自动缩放器”中的说明操作。