Kubernetes 如何使用 HorizontalPodAutoscaler 自动扩缩容

作者:袖梨 2026-08-15

HPA可基于CPU/内存等指标自动扩缩Pod副本数,核心前提是部署Metrics Server并为Pod配置resource requests;通过kubectl autoscale或YAML定义目标值、副本上下限及多指标策略,结合stabilizationWindowSeconds等行为控制实现生产级弹性伸缩。

直接用 HPA 就能根据实际负载自动增减 Pod 数量,核心是配好指标、目标值和副本上下限,再确保 Metrics Server 正常运行。

先装好 Metrics Server

HPA 依赖它采集 CPU、内存等数据。没它,HPA 会报错“no metrics known”。

  1. 推荐用官方版部署:kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml
  2. 部署后等 1–2 分钟,执行 kubectl top pods 看是否能正常显示资源使用率
  3. 如果集群启用了 TLS 或节点地址解析异常,需在 Metrics Server 的 Deployment 中添加启动参数:--kubelet-insecure-tls--kubelet-preferred-address-types=InternalIP

用 kubectl autoscale 快速启用(适合测试)

一行命令就能为 Deployment 创建基础 HPA,基于 CPU 利用率:

  1. kubectl autoscale deployment nginx-deployment --cpu-percent=60 --min=2 --max=10
  2. 这表示:当所有 Pod 平均 CPU 使用率持续超过 60%,就扩容;低于 60% 且稳定 5 分钟后缩容;副本数卡在 2–10 之间
  3. 执行后可用 kubectl get hpa 查看状态,kubectl describe hpa 查错误详情

写 YAML 配置多指标与精细控制(生产推荐)

单靠 CPU 容易误判,建议同时监控 CPU 和内存,并设置缩容冷静期:

  1. CPU 按利用率(%),内存按绝对值(如 500Mi),两者都达标才触发扩缩容逻辑
  2. behavior 块控制扩缩节奏:比如缩容时设 stabilizationWindowSeconds: 300(5 分钟冷却),避免流量小幅回落就删 Pod
  3. 每项指标的 target 必须对应 Pod 的 resources.requests —— 如果没设 request,CPU/memory 指标将无效

注意几个关键细节

很多 HPA 不生效,问题往往出在这些地方:

  1. Pod 必须有 resource requests:HPA 计算 CPU 利用率 = cpuUsage / cpuRequest,没 request 就算不出百分比
  2. 指标不是实时响应:Metrics Server 默认每 15 秒采一次,HPA 控制器默认每 30 秒评估一次,扩容基本无延迟,缩容默认要等满 5 分钟“稳定窗口”
  3. 容忍度防抖动:K8s 默认允许 ±10% 偏差(tolerance=0.1),比如目标 50%,实际 47%~53% 都不触发动作
  4. 突发流量慎用纯 CPU 扩容:CPU 上升慢,可能等指标拉起来时请求已超时;高并发场景建议加自定义指标(如 QPS 或队列长度)

相关文章

精彩推荐