第 7 章 将自动扩展应用到 OpenShift Container Platform 集群


将自动扩展应用到 OpenShift Container Platform 集群涉及部署集群自动扩展,然后为集群中的每种 Machine 类型部署机器自动扩展。

重要

您只能在 Machine API Operator 操作的集群中配置集群自动扩展。

7.1. 关于集群自动扩展

集群自动扩展会调整 OpenShift Container Platform 集群的大小,以满足其当前的部署需求。它使用 Kubernetes 样式的声明性参数来提供基础架构管理,而且这种管理不依赖于特定云提供商的对象。集群自动控制会在集群范围内有效,不与特定的命名空间相关联。

当由于资源不足而无法在任何当前 worker 节点上调度 pod 时,或者在需要另一个节点来满足部署需求时,集群自动扩展会增加集群的大小。集群自动扩展不会将集群资源增加到超过您指定的限制。

集群自动扩展会计算集群中所有节点上的内存、CPU 和 GPU,即使它不管理 control plane 节点。这些值不是单计算机导向型。它们是整个集群中所有资源的聚合。例如,如果您设置最大内存资源限制,集群自动扩展在计算当前内存用量时包括集群中的所有节点。然后,该计算用于确定集群自动扩展是否具有添加更多 worker 资源的容量。

重要

确保您所创建的 ClusterAutoscaler 资源定义中的 maxNodesTotal 值足够大,足以满足计算集群中可能的机器总数。此值必须包含 control plane 机器的数量以及可扩展至的机器数量。

每隔 10 秒,集群自动扩展会检查集群中不需要哪些节点,并移除它们。如果满足以下条件,集群自动扩展会考虑要删除的节点:

  • 节点使用率低于集群的节点 利用率级别 阈值。节点使用率级别是请求的资源的总和,由分配给节点的资源划分。如果您没有在 ClusterAutoscaler 自定义资源中指定值,集群自动扩展会使用默认值 0.5,它对应于 50% 的利用率。
  • 集群自动扩展可以将节点上运行的所有 pod 移到其他节点。Kubernetes 调度程序负责在节点上调度 pod。
  • 集群自动扩展没有缩减禁用注解。

如果节点上存在以下类型的 pod,集群自动扩展不会删除该节点:

  • 具有限制性 pod 中断预算(PDB)的 Pod。
  • 默认不在节点上运行的 Kube 系统 Pod。
  • 没有 PDB 或 PDB 限制性太强的 Kube 系统 pod。
  • 不受控制器对象支持的 Pod,如部署、副本集或有状态集。
  • 具有本地存储的 Pod。
  • 因为缺乏资源、节点选择器或关联性不兼容或有匹配的反关联性等原因而无法移至其他位置的 Pod。
  • 具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "false" 注解的 Pod,除非同时也具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "true” 注解。

例如,您可以将最大 CPU 限值设置为 64 个内核,并将集群自动扩展配置为每个创建具有 8 个内核的机器。如果您的集群从 30 个内核开始,集群自动扩展可最多添加具有 32 个内核的 4 个节点,共 62 个。

如果配置集群自动扩展,则需要额外的使用限制:

  • 不要直接修改位于自动扩展节点组中的节点。同一节点组中的所有节点具有相同的容量和标签,并且运行相同的系统 Pod。
  • 指定适合您的 Pod 的请求。
  • 如果需要防止 Pod 被过快删除,请配置适当的 PDB。
  • 确认您的云提供商配额足够大,能够支持您配置的最大节点池。
  • 不要运行其他节点组自动扩展器,特别是云提供商提供的自动扩展器。

pod 横向自动扩展(HPA)和集群自动扩展以不同的方式修改集群资源。HPA 根据当前的 CPU 负载更改部署或副本集的副本数。如果负载增加,HPA 会创建新的副本,不论集群可用的资源量如何。如果没有足够的资源,集群自动扩展会添加资源,以便 HPA 创建的 pod 可以运行。如果负载减少,HPA 会停止一些副本。如果此操作导致某些节点利用率低下或完全为空,集群自动扩展会删除不必要的节点。

集群自动扩展会考虑 pod 优先级。如果集群没有足够的资源,则“Pod 优先级和抢占”功能可根据优先级调度 Pod,但集群自动扩展会确保集群具有运行所有 Pod 需要的资源。为满足这两个功能,集群自动扩展包含一个优先级截止函数。您可以使用此截止函数来调度“尽力而为”的 Pod,它们不会使集群自动扩展增加资源,而是仅在有可用备用资源时运行。

优先级低于截止值的 Pod 不会导致集群扩展或阻止集群缩减。系统不会添加新节点来运行 Pod,并且可能会删除运行这些 Pod 的节点来释放资源。

集群自动扩展支持在其上有机器 API 的平台。

7.1.1. 配置集群自动扩展

首先,部署集群自动扩展来管理 OpenShift Container Platform 集群中的资源自动扩展。

注意

由于集群自动扩展的范围仅限于整个集群,因此只能为集群创建一个集群自动扩展。

7.1.1.1. 集群自动扩展资源定义

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: nvidia.com/gpu 7
        min: 0 8
        max: 16 9
      - type: amd.com/gpu
        min: 0
        max: 4
  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
指定要部署的最大节点数。这个值是集群中部署的机器总数,而不仅仅是自动扩展器控制的机器。确保这个值足够大,足以满足所有 control plane 和计算机器以及您在 MachineAutoscaler 资源中指定的副本总数。
3
指定在集群中部署的最小内核数。
4
指定集群中要部署的最大内核数。
5
指定集群中最小内存量(以 GiB 为单位)。
6
指定集群中的最大内存量(以 GiB 为单位)。
7
可选:指定要部署的 GPU 节点的类型。只有 nvidia.com/gpuamd.com/gpu 是有效的类型。
8
指定在集群中部署的最小 GPU 数。
9
指定集群中要部署的最大 GPU 数量。
10
指定 010 之间的日志记录详细程度。为指导提供了以下日志级别阈值:
  • 1:(默认)有关更改的基本信息。
  • 4 :用于对典型问题进行故障排除的详细程度。
  • 9 :广泛的、协议级的故障排除信息。

如果没有指定值,则使用默认值 1

11
在此部分中,您可以指定每个操作要等待的时长,可以使用任何有效的 ParseDuration 间隔,包括 nsusmssmh
12
指定集群自动扩展是否可以删除不必要的节点。
13
可选:指定在最近添加节点之后要等待多久才能删除节点。如果不指定值,则使用默认值 10m
14
可选:指定在最近删除节点之后要等待多久才能删除节点。如果没有指定值,则使用默认值 0s
15
可选:指定在发生缩减失败之后要等待多久才能删除节点。如果不指定值,则使用默认值 3m
16
可选:指定不必要的节点有资格删除前的时间。如果不指定值,则使用默认值 10m
17
可选:指定 节点使用率级别。此使用率级别下的节点可以被删除。

节点使用率是请求的资源的总和(由节点分配的资源划分),且值必须大于 "0",但小于 "1"。如果没有指定值,集群自动扩展会使用默认值 "0.5",它对应于 50% 的使用率。您必须以字符串形式表示这个值。

18
可选:指定您希望集群自动扩展使用的任何扩展器。以下值有效:
  • LeastWaste: 选择机器集,可以在扩展后闲置的 CPU 最少。如果多个机器集都会产生相同的空闲 CPU,则选择会有最少未使用内存的机器集
  • Priority :选择具有最高用户分配的优先级的机器集。要使用此扩展器,您需要创建一个用于定义机器集的优先级的配置映射。如需更多信息,请参阅"为集群自动扩展配置优先级扩展程序"。
  • Random: (默认)随机选择机器集。

如果没有指定值,则使用默认值 Random

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

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

注意

执行扩展操作时,集群自动扩展会保持在 ClusterAutoscaler 资源定义中设置的范围,如要部署的最小和最大内核数,或集群中的内存量。但是,集群自动扩展无法将集群中的当前值修正为在这些范围内。

最小和最大 CPU、内存和 GPU 值是通过计算集群中所有节点上的这些资源来确定,即使集群自动扩展无法管理该节点。例如,control plane 节点在集群的总内存中考虑,即使集群自动扩展不管理 control plane 节点。

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

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

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

先决条件

  • 您已部署了使用 Machine 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"] 参数。

7.1.2. 部署集群自动扩展

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

流程

  1. 为包含自定义资源定义的 ClusterAutoscaler 资源创建一个 YAML 文件。
  2. 运行以下命令在集群中创建自定义资源:

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

后续步骤

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.