Kubernetes 中的 Horizontal Pod Autoscaler(HPA)是什么?

在 Kubernetes 中,Horizontal Pod Autoscaler(HPA)是一种资源,用于根据 CPU 利用率或自定义的指标自动扩缩 Pod 的副本数。

它的主要特征是:

  • 根据 CPU 利用率扩缩 Pod:当 Pod 的 CPU 利用率超过或低于指定值时,自动增加或减少副本数。
  • 支持自定义指标:可以根据集群内的任意指标进行扩缩,只需要该指标可以由 Metrics API 收集。
  • 支持多个指标:可以同时根据多个指标进行扩缩。
  • 稳定期:在连续多次检查都需要调整后才会真正执行调整,避免过于频繁的调整导致不稳定。

HPA 的定义包含以下主要字段:

  • spec.scaleTargetRef:缩放目标,表示要扩缩的部署或副本集。
  • spec.minReplicas:最小副本数。
  • spec.maxReplicas:最大副本数。
  • spec.metrics:度量指标列表,每种指标又包含:
  • type:指标类型,支持 ResourceMetrics(CPU/内存)、PodsObjectMetrics(自定义)。
  • resource:具体资源,如 cpu、memory 等。
  • targetAverageValue:目标平均值,当实际使用率超过或低于该值时触发扩缩。
  • status.currentReplicas:当前副本数。
  • status.desiredReplicas:期望副本数。

HPA 的工作流程是:

  1. HPA 控制器定期从 Metrics API 检索 Pod 的利用率指标。
  2. 比较实际指标与 spec.metrics.targetAverageValue 目标值的差异。
  3. 如果差异超过稳定期(默认为1分钟),开始执行扩缩操作。
    如果实际值高于目标值,增加副本数;低于目标值减少副本数。
  4. 最终副本数在 spec.minReplicas 与 spec.maxReplicas 范围内。
  5. HPA 会更新 status.desiredReplicas 与目标值相符的期望副本数。
  6. 扩缩操作由 HPA 控制器通过调用 API 更新 Deployment 或 ReplicaSet 实现。

例如,这个 HPA 根据 CPU 利用率对部署扩缩:

yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef: 
    apiVersion: apps/v1
    kind: Deployment
    name: nginx # 缩放目标
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu  # 指标类型为 CPU 利用率
      targetAverageUtilization: 50 # 目标平均值50%

这个 HPA 会保证 nginx Deployment 的 Pod CPU 利用率维持在约50%:

  • 当利用率超过50%时,增加副本数,最高10个。
  • 当利用率低于50%时,减少副本数,最低2个。
  • 扩缩操作由 HPA 调用 API 更新 Deployment 实现。

所以总结来说,HPA 主要用于自动扩缩 Pod 的副本数,其主要特征是:

  1. 根据 CPU 利用率或自定义指标扩缩。
  2. 支持多指标。
  3. 有稳定期避免过于频繁扩缩。
  4. 定义最小、最大副本数。

它的定义包含:

  1. 缩放目标:要扩缩的 Deployment/ReplicaSet 等。
  2. 最小、最大副本数。
  3. 指标列表:类型、资源和目标值。
  4. 状态:当前与期望副本数。