Kubernetes 自动扩缩容
HPA、VPA、Cluster Autoscaler、指标来源、扩缩容策略和异常排查。
Kubernetes 自动扩缩容
Kubernetes 自动扩缩容分为 Pod 副本数扩缩容、Pod 资源建议或调整、节点数量扩缩容。常见组件是 HPA、VPA 和 Cluster Autoscaler。
类型选择
| 类型 | 作用 | 适合场景 |
|---|---|---|
| HPA | 调整副本数 | Web API、Worker、消费型服务 |
| VPA | 调整或建议 requests / limits | 难以估算资源的应用 |
| Cluster Autoscaler | 调整节点数量 | 云上节点池或弹性节点组 |
指标来源
HPA 需要指标 API:
| 指标类型 | API | 常见来源 |
|---|---|---|
| Resource Metrics | metrics.k8s.io | Metrics Server |
| Custom Metrics | custom.metrics.k8s.io | Prometheus Adapter |
| External Metrics | external.metrics.k8s.io | 云监控、消息队列、业务指标 |
检查 Metrics Server:
kubectl top nodes
kubectl top pods -A
kubectl get apiservice | grep metrics
HPA
HPA 根据指标调整 Deployment、StatefulSet 等可伸缩工作负载的副本数。
命令创建:
kubectl autoscale deployment order-api \
--min=2 \
--max=10 \
--cpu-percent=70 \
-n default
YAML 示例:
# API 版本。HPA v2 支持多指标和 behavior 策略。
apiVersion: autoscaling/v2
# 资源类型。这里表示创建 HorizontalPodAutoscaler。
kind: HorizontalPodAutoscaler
metadata:
# HPA 名称。
name: order-api
# HPA 所属命名空间。
namespace: default
spec:
# 被扩缩容的目标工作负载。
scaleTargetRef:
# 目标资源 API 版本。
apiVersion: apps/v1
# 目标资源类型。
kind: Deployment
# 目标资源名称。
name: order-api
# 最小副本数。
minReplicas: 2
# 最大副本数。
maxReplicas: 10
# 扩缩容指标列表。
metrics:
# Resource 表示使用 CPU / Memory 等资源指标。
- type: Resource
resource:
# 指标名称,这里使用 CPU。
name: cpu
target:
# Utilization 表示按 requests 的利用率计算。
type: Utilization
# 目标平均利用率 70%。
averageUtilization: 70
字段说明:
| 字段 | 说明 |
|---|---|
scaleTargetRef | 被扩缩容的工作负载 |
minReplicas | 最小副本数 |
maxReplicas | 最大副本数 |
metrics | 扩缩容依据 |
averageUtilization | 平均资源利用率目标 |
CPU 利用率基于容器 requests.cpu 计算。如果没有配置 CPU request,HPA 可能无法基于 CPU 正常计算。
多指标 HPA
# API 版本。HPA v2 支持多指标。
apiVersion: autoscaling/v2
# 资源类型。这里表示创建 HPA。
kind: HorizontalPodAutoscaler
metadata:
# HPA 名称。
name: order-api
spec:
# 被扩缩容的目标工作负载。
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-api
# 最小副本数。
minReplicas: 2
# 最大副本数。
maxReplicas: 20
# 多个指标会分别计算建议副本数,最终取较大值。
metrics:
# CPU 指标。
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
# Memory 指标。
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
多指标场景下,HPA 会计算每个指标建议的副本数,并选择较大的结果。
扩缩容行为
autoscaling/v2 支持配置扩容和缩容行为:
# HPA 扩缩容行为控制。
behavior:
# 扩容策略。
scaleUp:
# 扩容不设置稳定窗口,尽快响应。
stabilizationWindowSeconds: 0
# 扩容速率限制列表。
policies:
# 每 60 秒最多扩容当前副本数的 100%。
- type: Percent
value: 100
periodSeconds: 60
# 缩容策略。
scaleDown:
# 缩容稳定窗口,避免流量波动导致频繁缩容。
stabilizationWindowSeconds: 300
# 缩容速率限制列表。
policies:
# 每 60 秒最多缩容当前副本数的 50%。
- type: Percent
value: 50
periodSeconds: 60
建议:
- 扩容可以快一点,保障容量。
- 缩容要慢一点,避免流量波动导致频繁震荡。
- 关键服务设置合理
minReplicas。
VPA
VPA 根据历史资源使用情况给出 requests / limits 建议,也可以自动更新 Pod 资源配置。
常见模式:
| 模式 | 说明 |
|---|---|
Off | 只生成建议,不修改 Pod |
Initial | Pod 创建时设置推荐值 |
Auto | 自动更新 Pod,可能触发重建 |
生产环境建议先使用 Off 观察建议值,再评估是否自动调整。
Cluster Autoscaler
Cluster Autoscaler 根据 Pending Pod 和节点利用率调整节点数量。
典型触发:
- Pod 因资源不足 Pending,且节点池可以扩容。
- 节点长期低利用率,且其 Pod 可以迁移到其他节点。
注意事项:
- 需要云厂商节点组或自建节点池支持。
- 不会解决镜像拉取失败、污点不匹配、PVC 绑定失败等非容量问题。
- PodDisruptionBudget 可能阻止节点缩容。
- 本地存储、系统组件和不可驱逐 Pod 会影响缩容。
排查命令
HPA:
kubectl get hpa -A
kubectl describe hpa order-api -n default
kubectl top pod -n default
kubectl get deployment order-api -n default
指标 API:
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl top nodes
kubectl top pods -A
Cluster Autoscaler:
kubectl get pods -n kube-system | grep -i autoscaler
kubectl logs -n kube-system deploy/cluster-autoscaler --tail=200
kubectl get events -A --sort-by='.lastTimestamp'
常见问题
| 现象 | 排查方向 |
|---|---|
HPA 显示 <unknown> | Metrics Server、requests、指标 API |
| HPA 不扩容 | 指标未超过阈值、maxReplicas、目标工作负载异常 |
| HPA 频繁抖动 | 阈值过低、缩容窗口过短、指标波动大 |
| 节点不扩容 | 节点组限制、Pod 不是资源不足导致 Pending |
| 节点不缩容 | PDB、本地存储、系统 Pod、不可驱逐 Pod |
策略建议
- 所有使用 HPA 的容器必须设置 requests。
- 核心服务设置
minReplicas >= 2。 - 扩容阈值不要太接近常态负载。
- 缩容设置稳定窗口,避免震荡。
- 使用业务指标时,要确认指标延迟和采样窗口。
- 节点自动扩容要配合资源配额和成本告警。