1. HPA 基础概念
1.1 HPA 定义
Horizontal Pod Autoscaler(HPA)是 Kubernetes 内置的弹性伸缩控制器,用于根据工作负载的实时资源使用率或自定义指标,自动调整工作负载(如 Deployment、StatefulSet)的 Pod 副本数量。HPA 属于水平扩缩容,即通过增加或减少 Pod 实例数来应对流量变化,而非调整单个 Pod 的资源规格(垂直扩缩容)。
核心目标:在保证服务质量(SLA)的前提下,实现资源利用率与成本的最优平衡。
1.2 工作原理
HPA 以控制循环(Control Loop)方式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)执行一次调谐流程:
- 采集指标:通过 Metrics Server 或自定义指标 API 获取目标工作负载的当前指标值(如 CPU 使用率、QPS)。
- 计算期望副本数:根据当前指标值与目标值的比率,使用公式
期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值))计算。 - 决策与执行:若期望副本数与当前副本数差异超过容忍阈值(默认 0.1,即 10%),则更新工作负载的
replicas字段,触发 Deployment 等控制器执行滚动更新或扩缩容。 - 冷却与回退:HPA 内置冷却机制,防止指标抖动导致频繁扩缩容(即“抖动”现象)。
1.3 核心组件
| 组件 | 角色 | 关键说明 |
|---|---|---|
| Metrics Server | 资源指标采集器 | 从 Kubelet 的 cAdvisor 接口聚合 CPU、内存等资源指标,通过 metrics.k8s.io API 暴露。默认每 15 秒采集一次,仅保留最近 1 分钟数据。 |
| Controller Manager | HPA 控制器宿主 | 运行在 kube-controller-manager 进程中,负责 HPA 对象的调谐循环。通过 --horizontal-pod-autoscaler-* 系列参数控制行为。 |
| 自定义指标适配器 | 扩展指标桥接 | 如 Prometheus Adapter、KEDA,将外部指标(QPS、连接数、队列深度)转换为 HPA 可消费的 custom.metrics.k8s.io 或 external.metrics.k8s.io API。 |
生产建议:Metrics Server 是 HPA 工作的前提条件,务必在集群中提前部署并验证
kubectl top node 和 kubectl top pod 命令可用。
1.4 HPA 与手动扩缩容对比
| 对比维度 | 手动扩缩容 | HPA 自动扩缩容 |
|---|---|---|
| 操作方式 | kubectl scale deployment/foo --replicas=5 |
声明式 YAML 定义,控制器自动执行 |
| 响应速度 | 即时生效(秒级) | 依赖指标采集 + 调谐周期(通常 30s~3min) |
| 运维成本 | 高,需 7×24 值班盯屏 | 低,策略配置后自动运行 |
| 适用场景 | 计划性扩容(大促前)、紧急故障恢复 | 日常流量波动、周期性负载、不可预测突发 |
| 风险控制 | 依赖人工经验,易过度/不足 | 支持最大/最小副本数限制、冷却窗口、容忍阈值 |
| 多指标协同 | 不支持 | 支持 CPU + 内存 + 自定义指标联合决策 |
常见误区:HPA 并非“实时”伸缩。从指标采集到 Pod 就绪,完整链路可能耗时 2~5 分钟。对于秒级突增流量,建议配合 Cluster Autoscaler(节点级弹性)和 PDB(Pod 中断预算)使用。
1.5 最小 HPA 配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Pods
value: 4
periodSeconds: 60
上述配置定义了:
- 目标 Deployment
web-app,副本数范围 2~10。 - CPU 平均利用率目标 70%,内存平均利用率目标 80%。
- 缩容冷却窗口 300 秒(5 分钟),每次最多缩容 10%。
- 扩容无冷却窗口,每次最多增加 4 个 Pod,防止扩容滞后。