3. HPA 基础原理:HPA 是什么、工作原理、基于 CPU/Memory 的自动扩缩容机制
Horizontal Pod Autoscaler(HPA)是 Kubernetes 内置的弹性伸缩控制器,属于 autoscaling API 组。它根据观测到的资源指标(如 CPU 使用率、内存使用率)或自定义指标,自动调整工作负载(Deployment、StatefulSet 等)的 Pod 副本数,使实际负载与用户设定的目标值对齐。
3.1 HPA 是什么
HPA 是 Kubernetes 实现水平弹性的核心组件。与垂直伸缩(VPA)调整 Pod 资源配额不同,HPA 通过增减 Pod 数量来应对流量变化。其核心价值在于:
- 动态适配:无需人工干预,自动响应业务高峰与低谷。
- 资源效率:在低负载时缩减副本,释放集群资源;在高负载时快速扩容,保障服务质量。
- 声明式驱动:用户只需定义目标指标阈值,HPA 控制器负责计算与执行。
关键概念:HPA 作用于 scaleTargetRef 指向的资源对象(通常是 Deployment 或 StatefulSet),通过修改其
spec.replicas 字段实现扩缩容。HPA 本身不直接管理 Pod,而是通过控制器的协调循环驱动。
3.2 工作原理
HPA 的工作基于控制循环(Control Loop)模型,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)执行一次以下流程:
- 采集指标:通过 Metrics Server 或自定义指标 API 获取当前 Pod 的资源使用数据。
- 计算期望副本数:根据当前指标值与目标值的比率,计算期望的 Pod 副本数。
- 调整副本数:将期望副本数与当前副本数比较,若差异超过容忍范围(默认 0.1),则更新 scaleTargetRef 的 replicas 字段。
- 冷却与回退:扩缩容操作受冷却时间(Cooldown)和回退策略(ScaleDownStabilization)约束,避免频繁抖动。
下图展示了 HPA 控制循环的核心流程与数据流:
3.3 基于 CPU/Memory 的自动扩缩容机制
CPU 和 Memory 是 HPA 最常用的内置指标。其扩缩容计算遵循比例控制算法:
期望副本数计算公式:
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
其中:
currentMetricValue:当前所有 Pod 的指标平均值(如 CPU 使用率)。desiredMetricValue:用户设定的目标值(如 50% CPU)。ceil:向上取整,确保至少增加 1 个副本。
3.4 指标采集与聚合
HPA 通过 Metrics Server 获取 CPU 和 Memory 的原始数据。Metrics Server 从每个 Node 的 kubelet 收集 Pod 资源使用情况,并通过 resource metrics API 暴露给 HPA 控制器。
| 指标类型 | 数据来源 | 聚合方式 | 典型目标值 |
|---|---|---|---|
| CPU | kubelet cAdvisor | 所有 Pod 的 CPU 使用率平均值 | 50% ~ 80% |
| Memory | kubelet cAdvisor | 所有 Pod 的内存使用率平均值 | 60% ~ 90% |
重要注意事项:
- CPU 指标使用 request 作为分母计算使用率(
usage / request × 100%),因此必须为容器设置 CPU request。 - Memory 指标同样基于 request 计算使用率,但内存使用量不会自动回收,扩容后需关注内存泄漏问题。
- 如果 Pod 未设置 resource request,HPA 将无法计算使用率,导致指标采集失败。
3.5 扩缩容行为与策略
HPA 在 v2 版本中引入了更精细的行为控制,通过 behavior 字段定义扩容和缩容的独立策略:
| 策略类型 | 默认行为 | 可配置参数 |
|---|---|---|
| 扩容(scaleUp) | 无冷却时间,立即响应 | stabilizationWindowSeconds、policies(selectPolicy) |
| 缩容(scaleDown) | 5 分钟稳定窗口,防止抖动 | stabilizationWindowSeconds、policies(selectPolicy) |
下图展示了基于 CPU 指标的扩缩容决策过程,包含指标采集、比率计算与行为策略的交互:
3.6 实际配置示例
以下是一个基于 CPU 和 Memory 的 HPA 配置示例,展示如何定义目标指标与行为策略:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: backend-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend-service
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 75
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 60
最佳实践:
- CPU 目标值建议设置在 50%~70% 之间,预留缓冲应对突发流量。
- Memory 目标值建议设置在 70%~85% 之间,避免频繁扩容导致内存碎片。
- 缩容稳定窗口(stabilizationWindowSeconds)建议保持默认 300 秒,防止流量抖动导致频繁缩容。
- 扩容策略建议使用 Percent 类型,快速响应流量增长;缩容策略建议使用 Pods 类型,逐级缩减。