4. HPA 配置实战:创建 HPA 资源对象

Horizontal Pod Autoscaler(HPA)是 Kubernetes 实现工作负载弹性伸缩的核心机制。本节将围绕 HPA 的完整配置流程展开,涵盖资源对象定义、关键参数设置、指标目标配置以及命令行快速创建方法。

4.1 HPA 资源对象结构

HPA 通过 autoscaling/v2 API 版本定义,支持多指标、自定义指标和外部指标。以下是一个完整的 HPA YAML 示例,针对名为 web-server 的 Deployment 进行自动扩缩容:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-server-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-server
  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: Percent
        value: 100
        periodSeconds: 60

4.2 核心参数详解

参数 说明 推荐值 / 约束
minReplicas 最小副本数,保证基础容量 ≥ 1,建议 2 以上保障高可用
maxReplicas 最大副本数,防止资源耗尽 ≤ 集群节点可调度 Pod 上限
averageUtilization 目标平均利用率百分比 CPU 通常 50-80%,内存 60-85%
stabilizationWindowSeconds 缩容稳定窗口,防止抖动 缩容 300s,扩容 0s(快速响应)
policies 扩缩容速率策略 扩容 100%/60s,缩容 10%/60s
关键原则:minReplicas 应满足业务低谷期的流量需求;maxReplicas 应结合集群剩余容量和 Pod 资源请求量计算,避免扩容后节点资源不足导致 Pod 调度失败。

4.3 配置 CPU / 内存利用率目标

HPA 支持同时配置 CPU 和内存指标,两者采用“取最大值”策略决定目标副本数。当任一指标超过目标值时,HPA 会触发扩容。

  • CPU 目标:基于 Pod 的 requests.cpu 计算利用率。例如 Pod 请求 500m CPU,目标利用率 70%,则目标使用量为 350m。
  • 内存目标:基于 Pod 的 requests.memory 计算利用率。内存指标存在滞后性,建议配合 behavior.scaleDown.stabilizationWindowSeconds 防止频繁缩容。
  • 多指标协同:HPA 会分别计算每个指标所需的副本数,最终取最大值作为目标副本数。
计算公式:
desiredReplicas = ceil[currentReplicas × (currentMetricValue / targetMetricValue)]
当多个指标存在时:desiredReplicas = max(desiredReplicas_CPU, desiredReplicas_Memory)

4.4 使用 kubectl autoscale 命令快速创建

对于快速验证场景,kubectl autoscale 命令可以一行创建 HPA,无需编写 YAML 文件:

# 创建 HPA,CPU 目标利用率 70%,副本范围 2-10
kubectl autoscale deployment web-server \
  --cpu-percent=70 \
  --min=2 \
  --max=10 \
  --namespace=production

# 查看 HPA 状态
kubectl get hpa web-server-hpa -n production

# 查看 HPA 详细事件
kubectl describe hpa web-server-hpa -n production
注意:kubectl autoscale 仅支持 CPU 指标,无法直接配置内存指标或自定义指标。生产环境建议使用 YAML 文件管理 HPA 配置,便于版本控制和 CI/CD 集成。

4.5 HPA 扩缩容决策流程

下图展示了 HPA 从指标采集到最终执行扩缩容的完整决策链路:

HPA 扩缩容决策流程 Metrics Server HPA Controller 计算目标副本数(多指标取最大值) 行为策略(稳定窗口 + 速率限制) 执行扩缩容 关键说明 • 指标采集周期:15s • 评估周期:默认 15s • 缩容稳定窗口:300s

4.6 多指标 HPA 配置示例

以下示例展示了同时配置 CPU 和内存指标,并设置差异化扩缩容行为策略的完整配置:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: multi-metric-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-gateway
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 65
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 75
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 1
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Pods
        value: 4
        periodSeconds: 60
      - type: Percent
        value: 100
        periodSeconds: 60
        selectPolicy: Max
最佳实践:扩容策略使用 selectPolicy: Max 同时启用 Pods 和 Percent 策略,取两者中较大的值,确保流量突增时快速扩容;缩容策略使用 selectPolicy: Min(默认),保守缩容避免抖动。

4.7 验证 HPA 配置

创建 HPA 后,建议通过以下步骤验证配置是否生效:

  1. 检查 HPA 状态:kubectl get hpa -w 观察 TARGETS 列是否显示当前指标值。
  2. 模拟负载:使用 kubectl run load-generator --image=busybox -- /bin/sh -c "while true; do wget -q -O- http://web-server-service; done" 产生 CPU 压力。
  3. 观察扩缩容:kubectl describe hpa 查看 Events 字段,确认扩容/缩容事件是否按预期触发。
  4. 验证边界:测试 minReplicas 和 maxReplicas 边界,确保 HPA 不会超出设定范围。
常见问题:如果 HPA 一直显示 <unknown> 或无法获取指标,请检查 Metrics Server 是否正常运行:kubectl get pods -n kube-system | grep metrics-server。确保 Pod 的 requests 字段已正确设置,否则 HPA 无法计算利用率。