HPA基于CPU使用率自动扩缩容需三步:一部署并验证Metrics Server;二为Pod设置cpu requests;三创建HPA指定averageUtilization阈值。缺一不可,否则扩容失败。

在 Kubernetes 中,Horizontal Pod Autoscaler(HPA)可以根据 CPU 使用率等指标自动调整 Deployment 或 StatefulSet 的副本数。要基于 CPU 指标实现横向自动扩容,核心是正确配置 HPA 对象,并确保集群具备指标采集能力(即 Metrics Server 已部署且正常工作)。
确认 Metrics Server 已就绪
HPA 依赖 Metrics Server 提供实时的 Pod CPU 和内存指标。它不是默认安装的组件,需手动部署:
- 检查是否运行:执行
kubectl get apiservice | grep metrics,应看到v1beta1.metrics.k8s.io状态为True - 若未安装,可使用官方清单快速部署:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml(注意版本适配你的 K8s 版本) - 部署后等待 1–2 分钟,运行
kubectl top pods验证能否获取 CPU/内存数据
为目标工作负载启用 CPU 请求(requests)
HPA 计算 CPU 使用率时,是以 usage / requests 为基准(例如:Pod 实际 CPU 使用 200m,requests 设为 100m,则使用率为 200%)。若未设置 resources.requests.cpu,HPA 将无法计算相对使用率,扩容会失败或行为异常。
- 在 Deployment 的容器 spec 中明确指定:
resources: { requests: { cpu: "100m" } } - 无需设置 limits(除非有业务约束),但 requests 是 HPA 的必要前提
- 修改后触发滚动更新,确保新 Pod 带有 requests 配置
创建基于 CPU 的 HPA 资源
使用 kubectl autoscale 命令或 YAML 文件创建 HPA。推荐用 YAML 便于复现和管理:
- 示例 YAML(保存为 hpa-cpu.yaml):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60-
averageUtilization: 60表示当所有 Pod 的平均 CPU 使用率持续超过 60% 时,HPA 触发扩容;低于该值则缩容 - HPA 默认每 15–30 秒拉取一次指标,扩容决策有约 2–5 分钟延迟(受冷却期影响)
- 应用命令:
kubectl apply -f hpa-cpu.yaml
验证与调优
创建后观察 HPA 行为是否符合预期:
- 查看状态:
kubectl get hpa,关注CURRENT CPU列和REPLICAS是否变化 - 模拟压测:用
kubectl run -it --rm loadgen --image=busybox --restart=Never -- sh -c "while true; do wget -O- http://your-service/ > /dev/null; done"持续请求服务 - 若长时间不扩容,检查:
• Pod 是否处于 Running 状态且 Ready
• Metrics Server 是否能采集到该 Pod 的指标(kubectl top pods -l app=xxx)
• HPA event:kubectl describe hpa nginx-hpa查看是否有 Warning(如 “failed to get cpu utilization”) - 如需更灵敏响应,可适当缩短
horizontal-pod-autoscaler-sync-period(需修改 kube-controller-manager 参数,生产环境慎调)

















