4. HPA YAML 配置结构详解
HorizontalPodAutoscaler(HPA)是 Kubernetes 实现 Pod 水平自动伸缩的核心 API 资源。其 YAML 清单遵循标准的 Kubernetes 资源结构,由 apiVersion、kind、metadata 和 spec 四个顶层字段组成。其中 spec 字段包含了弹性伸缩的全部运营参数,是运维人员配置的焦点。
核心认知:HPA 本身不直接管理 Pod,而是通过
scaleTargetRef 指向目标工作负载(如 Deployment、StatefulSet),并基于 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
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 编辑添加多指标和自定义行为。始终遵循“先验证、后上线”原则,在预发环境验证伸缩效果后再推送到生产集群。