3. HPA 配置详解
HorizontalPodAutoscaler(HPA)是 Kubernetes 实现工作负载弹性伸缩的核心控制器。本章深入拆解 HPA YAML 的完整结构,逐一解析 minReplicas、maxReplicas、targetAverageUtilization、targetAverageValue 以及 behavior 字段的语义、配置要点与实战陷阱。
3.1 HPA YAML 完整结构
一个标准的 HPA 资源定义包含 API 版本、种类、元数据、伸缩目标、副本范围、指标规则和行为策略。以下是一个生产级 HPA 示例:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 800Mi
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Pods
value: 4
periodSeconds: 15
- type: Percent
value: 100
periodSeconds: 15
selectPolicy: Max
autoscaling/v2 API 版本,它支持多指标、自定义指标和 behavior 字段。v1 版本仅支持单 CPU 指标且无行为控制,已不推荐使用。
3.2 minReplicas 与 maxReplicas
这两个字段定义了副本数的上下边界,是 HPA 伸缩的安全护栏。
| 字段 | 默认值 | 语义 | 生产建议 |
|---|---|---|---|
minReplicas |
1(未设置时) | HPA 允许缩容的最小副本数,保证基础容量 | 至少 2~3,保障高可用 |
maxReplicas |
无(必须显式设置) | HPA 允许扩容的最大副本数,防止资源耗尽 | 根据集群容量和业务峰值设定,通常为 min 的 5~10 倍 |
minReplicas不能为 0(除非配合cluster-autoscaler且使用特殊配置)。maxReplicas必须大于minReplicas,否则 HPA 会报错。- 当 Pod 因 PDB(PodDisruptionBudget)或节点资源不足无法调度时,HPA 可能无法达到
maxReplicas,需结合集群自动伸缩策略。
3.3 targetAverageUtilization 与 targetAverageValue
这两个字段是 HPA 指标目标值的两种表达方式,分别对应“百分比利用率”和“值”。
3.3.1 targetAverageUtilization(百分比利用率)
仅适用于 CPU 和内存等资源指标。HPA 计算所有 Pod 的平均使用率(当前使用量 / Request 值),并与目标利用率比较。
- 计算公式: 期望副本数 = 当前副本数 × (当前平均利用率 / 目标利用率)
- 典型配置: CPU 目标利用率 70%~80%,内存目标利用率 60%~70%。
- 注意事项: 必须为容器设置
requests,否则 HPA 无法计算利用率。
3.3.2 targetAverageValue(值)
适用于资源指标和自定义指标。HPA 计算所有 Pod 的平均值,直接与目标值比较。
- 计算公式: 期望副本数 = 当前副本数 × (当前平均值 / 目标值)
- 典型配置: 内存平均使用量 800Mi,自定义 QPS 指标 1000。
- 优势: 不依赖
requests设置,适合内存等非 CPU 指标。
| 对比维度 | targetAverageUtilization | targetAverageValue |
|---|---|---|
| 适用指标类型 | CPU、内存等资源指标 | 资源指标 + 自定义指标 + 外部指标 |
| 依赖 Request | 是,必须设置 | 否 |
| 语义直观性 | 高(百分比更易理解) | 中(需了解业务基准值) |
| 适合场景 | CPU 密集型服务 | 内存、QPS、延迟等值指标 |
averageUtilization;对于内存指标推荐使用 averageValue,因为内存利用率受 JVM、缓存等影响,百分比往往不准确。
3.4 behavior 字段:精细化伸缩控制
behavior 字段是 autoscaling/v2 引入的弹性策略控制机制,允许分别定义扩容和缩容的行为,包括稳定窗口、策略类型、选择策略等。
3.4.1 核心子字段
| 子字段 | 说明 | 默认值 |
|---|---|---|
stabilizationWindowSeconds |
稳定窗口,HPA 在窗口期内取最大/最小推荐值,防止抖动 | 扩容:0;缩容:300 |
policies |
策略列表,每个策略包含 type(Pods/Percent)、value、periodSeconds |
扩容:Pods 4 + Percent 100;缩容:Percent 100 |
selectPolicy |
多策略时选择方式:Max(取最大变化量)、Min(取最小)、Disabled(禁用该方向) |
扩容:Max;缩容:Max |
3.4.2 稳定窗口(Stabilization Window)
稳定窗口是 HPA 防止频繁伸缩的关键机制。HPA 在窗口期内记录所有历史推荐值,缩容时取窗口内的最大值,扩容时取最小值,从而过滤瞬时波动。
- 缩容稳定窗口(默认 300 秒): 避免因短暂负载下降而过度缩容,适合有流量毛刺的业务。
- 扩容稳定窗口(默认 0 秒): 通常不设窗口,保证快速响应负载增长。
3.4.3 策略类型与选择
每个策略定义了在 periodSeconds 时间内允许变化的 Pod 数量或百分比。
- Pods 策略: 数量限制,适合小规模集群或精确控制。
- Percent 策略: 相对比例限制,适合大规模集群或快速伸缩。
- selectPolicy: Max: 取所有策略中变化量最大的值,扩容时常用。
- selectPolicy: Min: 取变化量最小的值,缩容时常用。
- 扩容:
Pods: 4+Percent: 100%,每 15 秒评估一次,取最大变化量,快速响应。 - 缩容:
Percent: 10%,每 60 秒评估一次,稳定窗口 300 秒,缓慢释放资源。
3.5 HPA 伸缩决策流程
以下 SVG 图展示了 HPA 从指标采集到副本调整的完整决策链路:
3.6 多指标协同与策略优先级
当 HPA 配置多个指标时,每个指标独立计算期望副本数,HPA 取所有计算结果中的 最大值 作为最终期望副本数。这意味着任何一个指标触发扩容都会导致副本增加,而缩容需要所有指标都满足缩容条件。
- CPU 和内存同时配置时,以两者中较高的期望副本数为准。
- 自定义指标(如 QPS)与资源指标混合使用时,建议将自定义指标的目标值设为业务容忍上限。
- 避免配置相互矛盾的指标(如同时使用 CPU 利用率和内存值,且目标值不协调)。
3.7 常见配置错误与排查
| 错误场景 | 现象 | 根因 | 解决方案 |
|---|---|---|---|
| HPA 无法获取指标 | HPA 状态显示 Unknown |
Metrics Server 未部署或 Pod 未设置 requests |
部署 Metrics Server,检查 Pod 资源请求 |
| 副本数频繁抖动 | Pod 数量在短时间内反复增减 | 稳定窗口过小或指标波动剧烈 | 增大缩容稳定窗口(如 300s→600s),调整策略周期 |
| 扩容速度过慢 | 负载突增时副本数跟不上 | 扩容策略过于保守或 periodSeconds 过大 |
使用 Pods: 4 + Percent: 100%,缩短周期到 15s |
| 缩容后立即扩容 | 缩容完成后马上又扩容 | 稳定窗口未生效或指标有延迟 | 检查 stabilizationWindowSeconds 配置,确认指标采集间隔 |
kubectl describe hpa <name> 查看 Events 和 Conditions 字段,可以快速定位配置问题。重点关注 Metrics 和 Conditions 部分的状态信息。
3.8 生产级 HPA 配置模板
以下是一个面向生产环境的 HPA 配置模板,融合了多指标、合理稳定窗口和精细化策略:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: production-service-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: production-service
minReplicas: 3
maxReplicas: 30
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 75
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 1Gi
behavior:
scaleDown:
stabilizationWindowSeconds: 600
policies:
- type: Percent
value: 5
periodSeconds: 120
selectPolicy: Min
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Pods
value: 6
periodSeconds: 15
- type: Percent
value: 100
periodSeconds: 15
selectPolicy: Max
- CPU 利用率目标 75%,留有余量应对突发。
- 内存目标 1Gi 值,避免 JVM 堆外内存导致的利用率偏差。
- 缩容稳定窗口 600 秒(10 分钟),策略取 Min,每次最多缩容 5%,防止过快释放资源。
- 扩容无稳定窗口,策略取 Max,支持快速扩容应对流量高峰。