配置 HPA
HPA(Horizontal Pod Autoscaler)会根据预设策略和指标自动增加或减少 pod 数量,使应用能够应对业务负载的突然激增,同时在低流量时段优化资源利用率。
目录
理解 Horizontal Pod AutoscalerHPA 如何工作?支持的指标前提条件创建 Horizontal Pod Autoscaler使用 CLI使用 Web Console将自定义指标用于 HPA要求传统(核心指标)HPA自定义指标 HPA触发条件定义自定义指标 HPA 兼容性autoscaling/v2 中的更新计算规则理解 Horizontal Pod Autoscaler
您可以创建一个 horizontal pod autoscaler,以指定希望运行的最小和最大 pod 数量,以及 pod 应达到的 CPU 利用率或内存利用率。
在创建 horizontal pod autoscaler 后,平台会开始查询 pod 上的 CPU 和/或内存资源指标。当这些指标可用时,horizontal pod autoscaler 会计算当前指标利用率与目标指标利用率之间的比率,并据此进行扩容或缩容。查询和伸缩会按固定间隔执行,但指标可能需要一到两分钟才会变得可用。
对于 replication controller,这种伸缩会直接对应 replication controller 的 replicas。对于 deployment configuration,这种伸缩会直接对应 deployment configuration 的 replica count。请注意,自动伸缩仅适用于 Complete 阶段中的最新 deployment。
平台会自动考虑资源情况,并防止在资源突增期间进行不必要的自动伸缩,例如启动期间。处于未就绪状态的 Pod 在扩容时 CPU 使用率按 0 处理,而在缩容时 autoscaler 会忽略这些 Pod。没有已知指标的 Pod 在扩容时 CPU 使用率按 0% 处理,在缩容时按 100% CPU 处理。这有助于提高 HPA 决策的稳定性。要使用此功能,您必须配置 readiness 检查,以确定新的 Pod 是否已准备好可供使用。
HPA 如何工作?
horizontal pod autoscaler(HPA)扩展了 pod 自动伸缩的概念。HPA 允许您创建和管理一组负载均衡节点。当给定的 CPU 或内存阈值被跨越时,HPA 会自动增加或减少 pod 数量。
HPA 以控制循环方式工作,默认同步周期为 15 秒。在此期间,controller manager 会根据 HPA 配置中定义的内容,查询 CPU、内存利用率或二者。controller manager 会从 resource metrics API 获取每个由 HPA 选中的 Pod 的逐 Pod 资源指标(如 CPU 或内存)的利用率指标。
如果设置了利用率值目标,controller 会将利用率值计算为每个 Pod 中容器对应资源请求的百分比。然后,controller 会对所有目标 Pod 的利用率取平均值,并生成一个比率,用于调整所需的 replicas 数量。
支持的指标
horizontal pod autoscaler 支持以下指标:
重要:对于基于内存的自动伸缩,内存使用量必须与 replicas 数量成比例增减。平均而言:
- replicas 数量增加必须导致每个 Pod 的内存(working set)使用量整体下降。
- replicas 数量减少必须导致每个 Pod 的内存使用量整体上升。
- 请使用平台检查应用的内存行为,并确保应用满足这些要求后,再使用基于内存的自动伸缩。
前提条件
请确保监控组件已部署到当前集群中,并且运行正常。您可以通过单击平台右上角的 > 平台健康状态。 来查看监控组件的部署和健康状态。
创建 Horizontal Pod Autoscaler
使用 CLI
您可以通过命令行界面创建 horizontal pod autoscaler:先定义一个 YAML 文件,然后使用 kubectl create 命令。以下示例展示了对 Deployment 对象进行自动伸缩。初始 deployment 需要 3 个 pod。HPA 对象将最小值提高到 5。如果 pod 上的 CPU 使用率达到 75%,pod 数量将增加到 7:
-
创建名为
hpa.yaml的 YAML 文件,内容如下:- 使用 autoscaling/v2 API。
- HPA 资源的名称。
- 需要扩缩容的 deployment 名称。
- 允许扩容到的最大 replicas 数量。
- 需要维持的最小 replicas 数量。
- 指定要扩缩容对象的 API 版本。
- 指定对象类型。该对象必须是 Deployment、ReplicaSet 或 StatefulSet。
- HPA 适用的目标资源。
- 触发扩缩容的目标 CPU 利用率百分比。
-
应用 YAML 文件以创建 HPA:
示例输出:
-
创建 HPA 后,您可以通过运行以下命令查看 deployment 的新状态:
示例输出:
-
您还可以检查 HPA 的状态:
示例输出:
使用 Web Console
-
进入 Container Platform。
-
在左侧导航栏中,单击 工作负载 > Deployments。
-
单击 Deployment Name。
-
向下滚动到 弹性伸缩 区域,然后单击右侧的 更新。
-
选择 水平伸缩 并完成策略配置。
-
单击 更新。
将自定义指标用于 HPA
自定义指标 HPA 在原有 HorizontalPodAutoscaler 的基础上进行了扩展,支持除 CPU 和内存利用率之外的其他指标。
要求
- kube-controller-manager: horizontal-pod-autoscaler-use-rest-clients=true
- 预安装 metrics-server
- Prometheus
- custom-metrics-api
传统(核心指标)HPA
传统 HPA 支持 CPU 利用率和内存指标,可动态调整 Pod 实例数量,如下例所示:
在此 YAML 中,scaleTargetRef 指定用于扩缩容的工作负载对象,targetCPUUtilizationPercentage 指定 CPU 利用率触发指标。
自定义指标 HPA
要使用自定义指标,您需要安装 prometheus-operator 和 custom-metrics-api。安装完成后,custom-metrics-api 会提供大量自定义指标资源:
这些资源都是 MetricValueList 下的子资源。您可以通过 Prometheus 创建规则来创建或维护这些子资源。自定义指标的 HPA YAML 格式与传统 HPA 不同:
在此示例中,scaleTargetRef 指定工作负载。
触发条件定义
metrics是数组类型,支持多个指标metric type可以是:Object(描述 k8s 资源)、Pods(描述每个 Pod 的指标)、Resources(内置 k8s 指标:CPU、内存)或 External(通常表示集群外部的指标)- 如果自定义指标不是由 Prometheus 提供,则需要通过在 Prometheus 中创建规则等一系列操作来创建新指标
指标的主要结构如下:
这些指标数据由 Prometheus 收集并更新。
自定义指标 HPA 兼容性
自定义指标 HPA YAML 实际上与原始核心指标(CPU)兼容。写法如下:
targetAverageValue是为每个 Pod 获取的平均值targetAverageUtilization是根据直接值计算出的利用率
算法参考如下:
autoscaling/v2 中的更新
autoscaling/v2 支持内存利用率:
变更:targetAverageUtilization 和 targetAverageValue 已更改为 target,并转换为 xxxValue 和 type 的组合:
xxxValue:AverageValue(平均值)、AverageUtilization(平均利用率)、Value(直接值)type:Utilization(利用率)、AverageValue(平均值)
注意:
-
对于 CPU Utilization 和 Memory Utilization 指标,只有当实际值波动超出目标阈值 ±10% 的范围时,才会触发自动伸缩。
-
缩容可能会影响正在进行的业务操作;请谨慎执行。
计算规则
当业务指标发生变化时,平台会根据以下规则自动计算与业务量匹配的目标 pod 数量,并进行相应调整。如果业务指标持续波动,该值将调整为设置的 最小 Pod 数量 或 最大 Pod 数量。
-
单策略目标 Pod 数量:ceil[(sum(actual metric values)/metric threshold)]。这意味着将所有 pod 的实际指标值之和除以指标阈值,再向上取整到大于或等于结果的最小整数。例如:当前有 3 个 pod,其 CPU 利用率分别为 80%、80% 和 90%,设置的 CPU 利用率阈值为 60%。根据公式,pod 数量将自动调整为:ceil[(80%+80%+90%)/60%] = ceil 4.1 = 5 个 pod。
注意:
-
如果计算出的目标 pod 数量超过设置的 最大 Pod 数量(例如 4),平台只会扩容到 4 个 pod。如果在调整最大 pod 数量后指标仍持续偏高,您可能需要使用其他伸缩方式,例如提高命名空间的 pod 配额或增加硬件资源。
-
如果计算出的目标 pod 数量(在前面的示例中为 5)小于按照 扩容步长 调整后的 pod 数量(例如 10),平台只会扩容到 5 个 pod。
-
-
多策略目标 Pod 数量:取各项策略计算结果中的最大值。