4. HPA YAML 配置结构详解

HorizontalPodAutoscaler(HPA)是 Kubernetes 实现 Pod 水平自动伸缩的核心 API 资源。其 YAML 清单遵循标准的 Kubernetes 资源结构,由 apiVersion、kind、metadata 和 spec 四个顶层字段组成。其中 spec 字段包含了弹性伸缩的全部运营参数,是运维人员配置的焦点。

核心认知:HPA 本身不直接管理 Pod,而是通过 scaleTargetRef 指向目标工作负载(如 Deployment、StatefulSet),并基于 metrics 中定义的指标动态调整该工作负载的副本数。
HPA YAML 四层结构总览 HPA YAML 四层结构总览 apiVersion autoscaling/v2 kind HorizontalPodAutoscaler metadata name / namespace spec(核心配置域) scaleTargetRef apiVersion / kind / name minReplicas 最小副本数 maxReplicas 最大副本数 metrics 指标数组 运营编排要点 scaleTargetRef 决定伸缩对象 | min/maxReplicas 定义伸缩边界 | metrics 驱动伸缩决策

4.1 apiVersion 与 kind

这两个字段定义了 HPA 资源的 API 组和资源类型,是 Kubernetes 资源清单的固定入口。

字段 值 说明
apiVersion autoscaling/v2 稳定的 HPA API 版本,支持多种指标类型(资源、Pod、Object、External)。
生产环境推荐使用 autoscaling/v2,autoscaling/v1 仅支持 CPU 指标。
kind HorizontalPodAutoscaler 资源类型标识,Kubernetes API Server 据此路由到对应的控制器处理。
版本迁移提示:从 autoscaling/v1 迁移到 autoscaling/v2 时,需将 spec.metrics 从单指标结构改为数组结构,并增加 type 字段标识指标来源。

4.2 metadata

metadata 用于标识 HPA 资源实例,包含名称、命名空间、标签和注解等元数据。

  • name(必填):HPA 资源名称,在命名空间内唯一。建议命名规范为 <工作负载名>-hpa,例如 nginx-deployment-hpa。
  • namespace(可选):HPA 所在命名空间,默认值为 default。HPA 必须与目标工作负载位于同一命名空间。
  • labels(可选):用于资源分组和选择,建议添加 app、tier 等标签。
  • annotations(可选):用于存储非标识性元数据,如 autoscaling.alpha.kubernetes.io/behavior 可配置伸缩行为。
metadata:
  name: web-frontend-hpa
  namespace: production
  labels:
    app: web-frontend
    tier: frontend
  annotations:
    autoscaling.alpha.kubernetes.io/behavior: '{"scaleDown":{"stabilizationWindowSeconds":300}}'

4.3 spec 核心配置域

spec 是 HPA 的运营配置核心,包含 scaleTargetRef、minReplicas、maxReplicas 和 metrics 四个关键字段。以下逐一详解。

4.3.1 scaleTargetRef:伸缩目标引用

scaleTargetRef 指定 HPA 要控制哪个工作负载的副本数。它是一个对象引用,包含三个子字段:

子字段 值示例 说明
apiVersion apps/v1 目标工作负载的 API 版本。Deployment 和 StatefulSet 通常为 apps/v1。
kind Deployment 目标资源类型。支持 Deployment、StatefulSet、ReplicaSet、ReplicationController 等可伸缩资源。
name web-frontend 目标资源的名称,必须与 metadata.name 一致。
常见错误:HPA 的 scaleTargetRef.name 拼写错误或目标工作负载不存在,会导致 HPA 无法获取当前副本数,伸缩失效。建议创建 HPA 前先确认目标工作负载已就绪。

4.3.2 minReplicas 与 maxReplicas:伸缩边界

这两个字段定义了副本数的上下限,是弹性伸缩的安全护栏。

  • minReplicas(默认值:1):HPA 允许缩容到的最小副本数。生产环境建议设置为 2 或更高,以保证基础高可用。
  • maxReplicas(必填):HPA 允许扩容到的最大副本数。需根据集群资源容量和业务峰值合理设置,防止无限扩容耗尽集群资源。
运营建议:设置 minReplicas 时需考虑 Pod 启动时间、优雅关闭时间以及突发流量容忍度。设置 maxReplicas 时需结合集群节点资源上限和 Pod 资源请求量进行计算。

4.3.3 metrics:伸缩指标数组

metrics 是一个数组,每个元素定义一个指标及其目标值。HPA 控制器会定期采集这些指标,计算期望副本数,并触发伸缩操作。Kubernetes autoscaling/v2 支持四种指标类型:

指标类型 type 值 说明 典型场景
资源指标 Resource 基于 Pod 的 CPU 或内存利用率(相对于 requests)。
由 metrics-server 提供数据。
通用计算型工作负载
Pod 指标 Pods 基于每个 Pod 的自定义指标平均值,如 QPS、连接数。
由 Prometheus Adapter 等提供。
Web 服务、API 网关
对象指标 Object 基于集群中某个对象(如 Ingress、Service)的指标值。
由 Prometheus Adapter 等提供。
基于 Ingress 流量的伸缩
外部指标 External 基于集群外部系统的指标,如消息队列长度、数据库连接数。
由 Prometheus Adapter 或自定义适配器提供。
事件驱动、消息队列消费

以下是一个包含资源指标和 Pod 指标的完整 HPA YAML 示例:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-frontend-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-frontend
  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
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: 1000
metrics 四种类型对比与决策流程 metrics 四种类型对比与决策流程 Resource CPU / Memory metrics-server Pods QPS / 连接数 Prometheus Adapter Object Ingress / Service Prometheus Adapter External 队列长度 / DB 自定义适配器 HPA 控制器计算期望副本数 取所有指标计算结果的最大值 更新 Deployment 副本数 在 minReplicas ~ maxReplicas 范围内 多指标场景下,HPA 取各指标计算结果的期望副本数最大值,确保业务容量满足所有指标要求

4.4 完整 YAML 配置清单与字段速查

以下表格汇总了 HPA YAML 所有关键字段及其配置要求,便于运维人员快速查阅和编排:

层级 字段路径 类型 必填 说明
顶层 apiVersion string 是 固定为 autoscaling/v2
顶层 kind string 是 固定为 HorizontalPodAutoscaler
顶层 metadata.name string 是 HPA 资源名称,命名空间内唯一
顶层 metadata.namespace string 否 默认 default,需与目标工作负载一致
spec spec.scaleTargetRef object 是 引用目标工作负载(apiVersion/kind/name)
spec spec.minReplicas integer 否 默认 1,建议生产环境 ≥ 2
spec spec.maxReplicas integer 是 必须大于 minReplicas,受集群资源限制
spec spec.metrics[] array 是 至少定义一个指标,支持 Resource/Pods/Object/External
metrics[] metrics[].type string 是 指标类型:Resource / Pods / Object / External
metrics[] metrics[].resource.name string 条件必填 type=Resource 时必填,如 cpu、memory
metrics[] metrics[].resource.target.type string 条件必填 Utilization 或 AverageValue
metrics[] metrics[].resource.target.averageUtilization integer 条件必填 type=Utilization 时设置,百分比值
运营编排最佳实践:在配置 HPA 时,建议先使用 kubectl autoscale 命令快速创建基准 HPA,再通过 YAML 编辑添加多指标和自定义行为。始终遵循“先验证、后上线”原则,在预发环境验证伸缩效果后再推送到生产集群。