第 7 章 将自动扩展应用到 OpenShift Container Platform 集群
将自动扩展应用到 OpenShift Container Platform 集群,以自动调整集群的大小,以满足部署需求。您可以部署集群自动扩展,然后为集群中的每种机器类型部署机器自动扩展。配置集群自动扩展后,必须至少配置一台机器自动扩展。
您只能在 Machine API Operator 操作的集群中配置集群自动扩展。
7.1. 关于集群自动扩展 复制链接链接已复制到粘贴板!
集群自动扩展会调整 OpenShift Container Platform 集群的大小,以满足其当前的部署需求。它使用 Kubernetes 样式的声明性参数来提供基础架构管理,而且这种管理不依赖于特定云提供商的对象。集群自动控制会在集群范围内有效,不与特定的命名空间相关联。
当由于资源不足而无法在任何当前 worker 节点上调度 pod 时,或者在需要另一个节点来满足部署需求时,集群自动扩展会增加集群的大小。集群自动扩展不会将集群资源增加到超过您指定的限制。
集群自动扩展会计算集群中所有节点上的内存、CPU 和 GPU,即使它不管理 control plane 节点。这些值不是单计算机导向型。它们是整个集群中所有资源的聚合。例如,如果您设置最大内存资源限制,集群自动扩展在计算当前内存用量时包括集群中的所有节点。然后,该计算用于确定集群自动扩展是否具有添加更多 worker 资源的容量。
确保您所创建的 ClusterAutoscaler 资源定义中的 maxNodesTotal 值足够大,足以满足计算集群中可能的机器总数。此值必须包含 control plane 机器的数量以及可扩展至的机器数量。
7.1.1. 自动节点删除 复制链接链接已复制到粘贴板!
每隔 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 个。
7.1.2. 限制 复制链接链接已复制到粘贴板!
如果配置集群自动扩展,则需要额外的使用限制:
- 不要直接修改位于自动扩展节点组中的节点。同一节点组中的所有节点具有相同的容量和标签,并且运行相同的系统 Pod。
- 指定适合您的 Pod 的请求。
- 如果需要防止 Pod 被过快删除,请配置适当的 PDB。
- 确认您的云提供商配额足够大,能够支持您配置的最大节点池。
- 不要运行其他节点组自动扩展器,特别是云提供商提供的自动扩展器。
如果这样做,集群自动扩展只会在自动扩展节点组中添加节点,这会导致可调度 pod。如果可用节点类型无法满足 pod 请求的要求,或者如果可以满足这些要求的节点组已是最大大小,集群自动扩展将无法扩展。
7.1.3. 与其他调度功能交互 复制链接链接已复制到粘贴板!
pod 横向自动扩展(HPA)和集群自动扩展以不同的方式修改集群资源。HPA 根据当前的 CPU 负载更改部署或副本集的副本数。如果负载增加,HPA 会创建新的副本,不论集群可用的资源量如何。如果没有足够的资源,集群自动扩展会添加资源,以便 HPA 创建的 pod 可以运行。如果负载减少,HPA 会停止一些副本。如果此操作导致某些节点利用率低下或完全为空,集群自动扩展会删除不必要的节点。
集群自动扩展会考虑 pod 优先级。如果集群没有足够的资源,则“Pod 优先级和抢占”功能可根据优先级调度 Pod,但集群自动扩展会确保集群具有运行所有 Pod 需要的资源。为满足这两个功能,集群自动扩展包含一个优先级截止函数。您可以使用此截止函数来调度“尽力而为”的 Pod,它们不会使集群自动扩展增加资源,而是仅在有可用备用资源时运行。
优先级低于截止值的 Pod 不会导致集群扩展或阻止集群缩减。系统不会添加新节点来运行 Pod,并且可能会删除运行这些 Pod 的节点来释放资源。
7.1.4. 集群自动扩展资源定义 复制链接链接已复制到粘贴板!
此 ClusterAutoscaler 资源定义显示了集群自动扩展的参数和示例值。
当您更改现有集群自动扩展的配置时,它会重启。
| 参数 | 描述 |
|---|---|
|
|
指定 Pod 必须超过哪一优先级才能让机器自动扩展部署更多节点。输入一个 32 位整数值。 |
|
|
指定要部署的最大节点数。这个值是集群中部署的机器总数,而不仅仅是自动扩展器控制的机器。确保这个值足够大,足以满足所有 control plane 和计算机器以及您在 |
|
| 指定在集群中部署的最小内核数。 |
|
| 指定集群中要部署的最大内核数。 |
|
| 指定集群中最小内存量(以 GiB 为单位)。 |
|
| 指定集群中的最大内存量(以 GiB 为单位)。 |
|
|
可选: 要将集群自动扩展配置为部署启用了 GPU 的节点,请指定 |
|
| 指定要在集群中部署的指定类型的最小 GPU 数。 |
|
| 指定集群中要部署的指定类型的最大 GPU 数。 |
|
|
指定
如果没有指定值,则使用默认值 |
|
|
在此部分中,您可以指定每个操作要等待的时长,可以使用任何有效的 ParseDuration 间隔,包括 |
|
| 指定集群自动扩展是否可以删除不必要的节点。 |
|
|
可选:指定在最近添加节点之后要等待多久才能删除节点。如果不指定值,则使用默认值 |
|
|
可选:指定在最近删除节点之后要等待多久才能删除节点。如果没有指定值,则使用默认值 |
|
|
可选:指定在发生缩减失败之后要等待多久才能删除节点。如果不指定值,则使用默认值 |
|
|
可选:指定不必要的节点有资格删除前的时间。如果不指定值,则使用默认值 |
|
| 可选:指定 节点使用率级别。此使用率级别下的节点可以被删除。
节点使用率是请求的资源的总和(由节点分配的资源划分),且值必须大于 |
|
| 可选:指定您希望集群自动扩展使用的任何扩展器。以下值有效:
如果没有指定值,则使用默认值
您可以使用
在 |
执行扩展操作时,集群自动扩展会保持在 ClusterAutoscaler 资源定义中设置的范围,如要部署的最小和最大内核数,或集群中的内存量。但是,集群自动扩展无法将集群中的当前值修正为在这些范围内。
最小和最大 CPU、内存和 GPU 值是通过计算集群中所有节点上的这些资源来确定,即使集群自动扩展无法管理该节点。例如,control plane 节点在集群的总内存中考虑,即使集群自动扩展不管理 control plane 节点。
7.1.5. 为集群自动扩展配置优先级扩展器 复制链接链接已复制到粘贴板!
配置优先级扩展器,以便在集群自动扩展增加集群大小时控制哪些机器集扩展。您可以通过列出定义机器集的优先级值和正则表达式来创建优先级扩展器配置映射。
先决条件
- 您已部署了使用 Machine API 的 OpenShift Container Platform 集群。
-
您可以使用具有
cluster-admin权限的账户访问集群。 -
已安装 OpenShift CLI(
oc)。
流程
运行以下命令列出集群中的计算机器集:
oc get machinesets.machine.openshift.io
$ oc get machinesets.machine.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用正则表达式,构建一个匹配模式,它被用来匹配您要设置优先级的计算机器集的名称。
例如,使用正则表达式模式
*fast*匹配任何在其名称中包含字符串fast的计算机器集。创建一个
cluster-autoscaler-priority-expander.ymlYAML 文件,该文件定义了类似如下的配置映射:优先级扩展器配置映射示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 定义机器集的优先级。
priorities值必须是正整数。集群自动扩展会首先使用值更高的优先级。对于每个优先级级别,指定与您要使用的机器集对应的正则表达式。运行以下命令来创建配置映射:
oc create configmap cluster-autoscaler-priority-expander \ --from-file=<location_of_config_map_file>/cluster-autoscaler-priority-expander.yml
$ oc create configmap cluster-autoscaler-priority-expander \ --from-file=<location_of_config_map_file>/cluster-autoscaler-priority-expander.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令来查看配置映射:
oc get configmaps cluster-autoscaler-priority-expander -o yaml
$ oc get configmaps cluster-autoscaler-priority-expander -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
-
要使用优先级扩展器,确保
ClusterAutoscaler资源定义被配置为使用expanders: ["Priority"]参数。
7.1.6. 为集群自动扩展标记 GPU 机器集 复制链接链接已复制到粘贴板!
您可以使用机器集标签来指示集群自动扩展可以用来部署启用了 GPU 的节点的机器。
先决条件
- 集群使用集群自动扩展。
流程
在您要为集群自动扩展创建机器的机器集中,用来部署启用了 GPU 的节点,添加
cluster-api/accelerator标签:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <accelerator_name>
指定您选择的标签,它由字母数字字符、
-、_或.组成,并以字母数字字符开头和结尾。例如,您可以使用nvidia-t4代表 Nvidia T4 GPU,或使用nvidia-a10g代表 A10G GPU。注意您必须为
ClusterAutoscalerCR 中的spec.resourceLimits.gpus.type参数指定此标签的值。如需更多信息,请参阅"集群自动扩展资源定义"。
7.1.7. 部署集群自动扩展 复制链接链接已复制到粘贴板!
要部署集群自动扩展,请创建一个 ClusterAutoscaler 资源实例。
流程
-
为包含自定义资源定义的
ClusterAutoscaler资源创建一个 YAML 文件。 运行以下命令在集群中创建自定义资源:
oc create -f <filename>.yaml
$ oc create -f <filename>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <filename>
- 指定您创建的 YAML 文件的名称。