3. HPA API版本演进:autoscaling/v1、v2beta2、v2的区别与选择建议

HorizontalPodAutoscaler(HPA)的API版本经历了从v1到v2beta2再到稳定版v2的演进过程。每个版本在表达能力、支持的度量指标类型以及资源抽象层级上都有显著差异。理解这些版本的区别,是正确配置自定义metric触发器的前提。

3.1 版本演进路线图

Kubernetes社区在HPA的API设计上遵循了“先简单、后丰富”的策略。v1仅支持CPU使用率,v2beta2引入了自定义metric和外部metric,v2则在此基础上将beta2的字段结构正式稳定下来。

HPA API版本演进时间线 autoscaling/v1 Kubernetes 1.0+ 仅CPU / 单指标 演进 autoscaling/v2beta2 Kubernetes 1.12+ 自定义metric / 多指标 稳定 autoscaling/v2 Kubernetes 1.23+ GA稳定版 / 结构对齐 关键演进点 v1 → v2beta2:从单指标到多指标,从仅CPU到支持Pod metric / Object metric / External metric v2beta2 → v2:字段结构正式稳定,移除beta标记,行为语义不变

3.2 核心区别对比

三个版本在API组、度量指标类型、数据结构、资源字段等方面存在本质差异。下表从实际配置角度进行横向对比:

对比维度 autoscaling/v1 autoscaling/v2beta2 autoscaling/v2
API组 autoscaling/v1 autoscaling/v2beta2 autoscaling/v2
K8s版本 1.0+ 1.12 – 1.22 1.23+
度量指标类型 仅 resource(CPU) resource / pods / object / external 同v2beta2,全部支持
自定义metric 不支持 支持(通过 pods 和 object) 支持(同v2beta2)
多指标支持 单指标 多指标(取最大值) 多指标(取最大值)
行为配置 无 behavior 字段(beta) behavior 字段(GA)
数据结构 spec.scaleTargetRef + spec.targetCPUUtilizationPercentage spec.metrics[] 数组,每个元素包含 type 和对应字段 同v2beta2,字段名完全一致
向后兼容 作为基础版本 可被v2读取 自动转换v1/v2beta2

3.3 数据结构差异详解

三个版本在YAML/JSON结构上的差异,直接决定了如何编写自定义metric触发器。

3.3.1 autoscaling/v1 结构(仅CPU)

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

v1的局限性非常明显:只能设置一个CPU目标值,无法表达自定义metric、内存、QPS等指标。对于基于自定义metric的弹性伸缩场景,v1完全不适用。

3.3.2 autoscaling/v2beta2 结构(多指标 + 自定义metric)

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Pods
    pods:
      metric:
        name: requests_per_second
      target:
        type: AverageValue
        averageValue: 1000
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300

v2beta2引入了 metrics[] 数组,每个元素通过 type 字段区分指标来源:

  • Resource:内置资源指标(CPU、内存)
  • Pods:Pod级别的自定义metric(每个Pod的指标值,取平均)
  • Object:集群对象级别的自定义metric(如Ingress的QPS)
  • External:集群外部的metric(如云服务商指标)

3.3.3 autoscaling/v2 结构(GA稳定版)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: requests_per_second
      target:
        type: AverageValue
        averageValue: 1000
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300

v2与v2beta2的YAML结构完全一致,唯一的区别是API版本号从 v2beta2 改为 v2。这意味着:

  • 所有v2beta2的YAML文件只需修改 apiVersion 即可迁移到v2
  • v2beta2的字段语义、行为逻辑在v2中保持不变
  • v2是GA版本,不会再有破坏性变更

3.4 选择建议

最佳实践: 对于新部署的集群(Kubernetes 1.23+),始终使用 autoscaling/v2。它提供了最完整的自定义metric支持,且是GA稳定版本,无需担心API废弃风险。

根据不同的集群版本和需求场景,选择策略如下:

集群版本 推荐API版本 理由
1.23+ autoscaling/v2 GA稳定版,支持所有自定义metric类型,行为配置完整
1.12 – 1.22 autoscaling/v2beta2 v2beta2是此区间最完整的版本,支持自定义metric
1.0 – 1.11 autoscaling/v1 仅支持CPU,无法使用自定义metric;建议升级集群
仅需CPU伸缩 autoscaling/v1 简单场景可用,但推荐统一使用v2以保持一致性
需要自定义metric autoscaling/v2 v2是唯一支持Pods/Object/External指标且为GA的版本

3.5 版本迁移注意事项

从v1迁移到v2时,需要注意以下关键变化:

  • 字段结构变化:v1的 targetCPUUtilizationPercentage 在v2中变为 metrics[].resource.target.averageUtilization
  • 多指标策略:v2支持多个metric,HPA会计算每个metric的期望副本数,最终取最大值作为伸缩结果
  • behavior字段:v2的 behavior 字段提供了扩缩容的精细化控制(稳定窗口、速率限制等),v1没有此功能
  • API版本转换:Kubernetes API Server会自动在v1和v2之间进行转换,但v1写入的HPA在读取为v2时,会丢失behavior等高级配置
注意: 不要在生产环境中混合使用不同API版本的HPA管理同一个Deployment。如果使用 kubectl apply 时指定了v1版本,而集群中已存在v2版本的HPA,可能会导致字段被覆盖或丢失。

3.6 版本选择决策流程图

HPA API版本选择决策流程 开始选择HPA版本 集群版本 ≥ 1.23? 是 autoscaling/v2 否 1.12 ≤ 版本 < 1.23? 是 autoscaling/v2beta2 否(版本 < 1.12) autoscaling/v1 建议:新项目统一使用 autoscaling/v2,即使仅需CPU伸缩也推荐v2以保持一致性

3.7 小结

对于本课程的核心主题——基于自定义metric的弹性伸缩触发器开发,autoscaling/v2 是唯一正确的选择。它提供了:

  • 完整的自定义metric类型支持(Pods、Object、External)
  • GA级别的稳定性保证
  • behavior字段用于精细控制扩缩容行为
  • 与v2beta2完全兼容的字段结构,迁移成本为零