2. Kubernetes HPA 基础回顾:HPA工作原理、Metrics Server与自定义指标、HPA v1/v2/v2beta2版本差异

2.1 HPA 核心工作原理

Horizontal Pod Autoscaler(HPA)是 Kubernetes 内置的弹性伸缩控制器,负责根据工作负载的实时资源使用率或自定义指标,自动调整 Deployment、StatefulSet 等 workload 的副本数。其核心是一个控制闭环,周期性地执行以下步骤:

  1. 采集指标:通过 Metrics Server 或自定义指标 API 获取目标 Pod 的当前指标值。
  2. 计算期望副本数:使用公式 desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]。
  3. 更新 workload 副本数:调用 Kubernetes API 修改 workload 的 spec.replicas。
  4. 冷却与回退:通过 --horizontal-pod-autoscaler-downscale-stabilization 等参数防止抖动。
关键公式解读:
当 currentMetricValue / desiredMetricValue 接近 1.0 时,副本数趋于稳定;比值大于 1.0 则扩容,小于 1.0 则缩容。HPA 默认每 15 秒评估一次指标(可通过 --horizontal-pod-autoscaler-sync-period 调整)。
HPA 控制闭环流程图 HPA 控制闭环流程图 HPA Controller ① 采集指标 (Metrics API) ② 计算期望副本数 ③ 更新 workload replicas 循环周期 (默认 15s)

2.2 Metrics Server:资源指标的基石

Metrics Server 是 Kubernetes 集群中资源指标(CPU、内存)的聚合器,通过 kubelet 的 Summary API 收集每个节点和 Pod 的实时资源使用数据,并暴露标准的 metrics.k8s.io API。HPA 默认依赖该 API 获取基础指标。

特性 说明
数据来源 kubelet cAdvisor 接口,采集 CPU 使用率(核)、内存使用量(字节)
存储方式 仅保留最近 1-2 分钟的数据,不提供历史查询
部署方式 作为集群插件(addon)运行,推荐使用 kubectl apply -f components.yaml 安装
资源消耗 极低,通常每个节点消耗 < 0.1 核 CPU 和 50 MB 内存
API 版本 metrics.k8s.io/v1beta1(稳定版)
验证 Metrics Server 是否正常工作:
kubectl top nodes
kubectl top pods -n <namespace>
如果返回正常数据,说明 Metrics Server 已就绪,HPA 可以基于 CPU/内存进行自动伸缩。

2.3 自定义指标与外部指标

当业务场景需要基于 QPS、请求延迟、队列长度等非资源指标进行伸缩时,需要引入自定义指标 API(custom.metrics.k8s.io)或外部指标 API(external.metrics.k8s.io)。常见的实现方式包括:

  • Prometheus Adapter:将 Prometheus 中的指标转换为 Kubernetes 标准指标 API。
  • KEDA(Kubernetes Event-driven Autoscaling):支持从 Kafka、RabbitMQ、AWS SQS 等 50+ 事件源拉取指标。
  • Datadog Cluster Agent:将 Datadog 指标暴露给 HPA。
注意: 使用自定义指标时,必须确保集群中已部署对应的 Adapter,并且 HPA 的 spec.metrics 字段正确引用了指标名称和类型。否则 HPA 会处于 Unknown 状态,无法进行伸缩决策。
Kubernetes 指标分层架构 Kubernetes 指标分层架构 HPA Controller metrics.k8s.io (资源指标) custom.metrics.k8s.io (自定义指标) Metrics Server / kubelet Prometheus / KEDA / Adapter

2.4 HPA v1 / v2 / v2beta2 版本差异

Kubernetes 在演进过程中对 HPA API 进行了多次迭代,从最初的 autoscaling/v1 到功能更丰富的 autoscaling/v2(GA 于 v1.23)。下表总结了三个主要版本的核心差异:

特性 autoscaling/v1 autoscaling/v2beta2 autoscaling/v2 (GA)
稳定状态 GA(稳定) Beta(已弃用) GA(v1.23+)
支持的指标类型 仅 CPU 和内存(资源指标) 资源指标 + 自定义指标 + 外部指标 资源指标 + 自定义指标 + 外部指标
多指标支持 不支持(只能指定一个指标) 支持多个指标,取最大值作为伸缩依据 支持多个指标,取最大值作为伸缩依据
行为配置 (Behavior) 不支持 支持(v1.18+ 引入) 支持(稳定)
指标选择器 不支持 支持(通过 metricSelector 过滤) 支持
推荐使用场景 仅需 CPU/内存自动伸缩的简单场景 已迁移至 v2,不建议新部署 所有生产环境,特别是需要自定义指标和行为策略的场景
版本迁移建议:
如果当前集群版本 ≥ v1.23,应直接使用 autoscaling/v2。对于仍在使用 v1 的旧集群,建议通过 kubectl convert 命令将 HPA 资源转换为 v2 格式,以利用多指标和行为配置等高级特性。

2.5 实战:编写一个 v2 HPA 示例

以下是一个基于 CPU 利用率和自定义 QPS 指标的 HPA 配置,展示了 v2 API 的多指标与行为配置能力:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Pods
      pods:
        metric:
          name: http_requests_per_second
        target:
          type: AverageValue
          averageValue: 1000
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
        - type: Percent
          value: 10
          periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
        - type: Pods
          value: 4
          periodSeconds: 60
        - type: Percent
          value: 100
          periodSeconds: 60
      selectPolicy: Max
关键配置解读:
  • metrics 数组:同时定义了 CPU 利用率和 Pod 级别的 QPS 指标,HPA 会计算两个指标各自所需的副本数,取较大值执行。
  • behavior.scaleDown:设置 300 秒的缩容稳定窗口,每分钟最多缩容 10% 的 Pod,防止频繁缩容。
  • behavior.scaleUp:扩容无稳定窗口,支持每分钟最多增加 4 个 Pod 或 100% 的当前副本数(取两者中较大值),实现快速响应流量突增。