Kubernetes 自动扩缩容

HPA、VPA、Cluster Autoscaler、指标来源、扩缩容策略和异常排查。

Kubernetes 自动扩缩容

Kubernetes 自动扩缩容分为 Pod 副本数扩缩容、Pod 资源建议或调整、节点数量扩缩容。常见组件是 HPA、VPA 和 Cluster Autoscaler。

Kubernetes 自动扩缩容流程

类型选择

类型作用适合场景
HPA调整副本数Web API、Worker、消费型服务
VPA调整或建议 requests / limits难以估算资源的应用
Cluster Autoscaler调整节点数量云上节点池或弹性节点组

指标来源

HPA 需要指标 API:

指标类型API常见来源
Resource Metricsmetrics.k8s.ioMetrics Server
Custom Metricscustom.metrics.k8s.ioPrometheus Adapter
External Metricsexternal.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
InitialPod 创建时设置推荐值
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
  • 扩容阈值不要太接近常态负载。
  • 缩容设置稳定窗口,避免震荡。
  • 使用业务指标时,要确认指标延迟和采样窗口。
  • 节点自动扩容要配合资源配额和成本告警。