集群自动缩放器会调整 OpenShift Container Platform 集群的大小以满足其当前的部署需求。它使用声明式、Kubernetes 风格的参数来提供不依赖于特定云提供商对象的架构管理。集群自动缩放器具有集群范围,并且不与特定的命名空间关联。
当由于资源不足而导致 Pod 无法调度到任何当前工作节点上,或者需要另一个节点来满足部署需求时,集群自动缩放器会增加集群的大小。集群自动缩放器不会将集群资源增加到您指定的限制之外。
集群自动缩放器计算集群中所有节点的总内存、CPU 和 GPU,即使它不管理控制平面节点也是如此。这些值不是单机导向的。它们是整个集群中所有资源的聚合。例如,如果您设置了最大内存资源限制,则集群自动缩放器在计算当前内存使用率时会包含集群中的所有节点。然后使用该计算来确定集群自动缩放器是否有能力添加更多工作资源。
|
确保您创建的 `ClusterAutoscaler` 资源定义中的 `maxNodesTotal` 值足够大,以考虑集群中所有可能的机器总数。此值必须包含控制平面机器的数量以及您可能扩展到的计算机器的数量。
|
自动删除节点
每 10 秒,集群自动缩放器都会检查集群中哪些节点是不必要的并将其删除。如果满足以下条件,集群自动缩放器会考虑删除节点
如果节点上存在以下类型的 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 :广泛的协议级调试信息。
|
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, Priority] 格式指定多个扩展器。集群自动扩展器会按照指定的顺序应用每个扩展器。
在[LeastWaste, Priority] 示例中,集群自动扩展器首先根据LeastWaste 标准进行评估。如果多个机器集同样满足LeastWaste 标准,则集群自动扩展器会根据优先级 标准进行评估。如果多个机器集同样满足所有指定的扩展器,则集群自动扩展器会随机选择一个使用。
|
|
执行扩展操作时,集群自动扩展器会保持在ClusterAutoscaler 资源定义中设置的范围内,例如要部署的内核的最小和最大数量或集群中的内存量。但是,集群自动扩展器不会校正集群中的当前值以使其处于这些范围内。
最小和最大CPU、内存和GPU值是通过计算集群中所有节点上的这些资源来确定的,即使集群自动扩展器不管理这些节点也是如此。例如,即使集群自动扩展器不管理控制平面节点,控制平面节点也会被考虑在集群的总内存中。
|
为集群自动扩展器配置优先级扩展器
当集群自动扩展器使用优先级扩展器时,它会使用用户分配的优先级最高的机器集进行向上扩展。要使用此扩展器,必须创建一个定义机器集优先级的配置映射。
对于每个指定的优先级级别,必须创建正则表达式来识别在为机器集选择时要使用的机器集。正则表达式必须与集群自动扩展器要考虑选择的任何计算机器集的名称匹配。
步骤
-
通过运行以下命令列出集群上的计算机器集
$ 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
-
使用正则表达式,构造一个或多个模式,这些模式与要设置优先级级别的任何计算机器集的名称匹配。
例如,使用正则表达式模式*fast*
来匹配名称中包含字符串fast
的任何计算机器集。
-
创建一个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 值必须是正整数。集群自动扩展器会先使用高优先级,然后再使用低优先级。
对于每个优先级级别,请指定与要使用的机器集相对应的正则表达式。
|
-
通过运行以下命令创建配置映射
$ 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
为集群自动扩展器标记 GPU 机器集
可以使用机器集标签来指示集群自动扩展器可以使用哪些机器来部署启用 GPU 的节点。
部署集群自动扩展器
要部署集群自动扩展器,需要创建一个ClusterAutoscaler
资源实例。
步骤
-
为包含自定义资源定义的ClusterAutoscaler
资源创建一个 YAML 文件。
-
通过运行以下命令在集群中创建自定义资源
$ oc create -f <filename>.yaml (1)