4. HPA 支持的指标类型:资源指标、自定义指标与外部指标
Kubernetes Horizontal Pod Autoscaler (HPA) 的核心决策依据来自指标数据。根据指标来源与抽象层级,HPA 支持三类指标:资源指标 (Resource Metrics)、自定义指标 (Custom Metrics) 和 外部指标 (External Metrics)。理解三者的区别与适用场景,是配置高效弹性伸缩策略的前提。
4.1 三类指标对比总览
| 维度 | 资源指标 | 自定义指标 | 外部指标 |
|---|---|---|---|
| 数据来源 | cAdvisor / Metrics Server | Prometheus / Datadog / 自定义 API | 云厂商服务 (AWS SQS / Azure SB / GCP PubSub) |
| 指标粒度 | Pod 级别 (CPU/内存) | Pod 级别 / 对象级别 (QPS / 连接数) | 集群外部全局值 (队列深度 / 事件数) |
| API 端点 | metrics.k8s.io |
custom.metrics.k8s.io |
external.metrics.k8s.io |
| 配置复杂度 | 低 (开箱即用) | 中 (需部署 Adapter) | 高 (需云厂商集成 + Adapter) |
| 典型场景 | Web 服务器、批处理任务 | API 网关、消息消费者 | 事件驱动工作负载、队列处理 |
| 伸缩响应速度 | 中等 (15-30s 延迟) | 快 (5-15s,取决于采集间隔) | 快 (可实时感知外部事件) |
4.2 资源指标 (Resource Metrics)
资源指标是 HPA 最基础的指标类型,直接反映 Pod 的物理资源消耗。Kubernetes 通过 Metrics Server 从每个节点上的 cAdvisor 收集 CPU 和内存使用数据,并通过 metrics.k8s.io API 对外暴露。
- CPU 指标:以 millicores (m) 为单位,表示 Pod 当前使用的 CPU 时间相对于其
requests的百分比。例如,targetAverageUtilization: 80表示当 Pod 平均 CPU 使用率达到 80% 时触发扩容。 - 内存指标:以字节为单位,表示 Pod 当前内存使用量相对于
requests的百分比。内存指标通常用于内存密集型应用,如缓存服务或数据处理任务。
- 无状态 Web 服务:CPU 使用率与请求量呈正相关,适合用 CPU 指标驱动伸缩。
- 批处理任务:内存占用随数据量增长,适合用内存指标控制 Pod 数量。
- 快速原型验证:无需额外组件,Metrics Server 安装后即可使用。
4.3 自定义指标 (Custom Metrics)
自定义指标允许用户基于应用内部的业务数据来驱动伸缩。这些指标通常由 Prometheus Adapter、Datadog Cluster Agent 或 Kubernetes Metrics Adapter 等组件从监控系统中获取,并通过 custom.metrics.k8s.io API 暴露给 HPA。
自定义指标可以按两种粒度配置:
- Pod 级别指标:每个 Pod 独立上报指标值,HPA 计算所有 Pod 的平均值。例如,每个 Pod 的 HTTP 请求数 (QPS)。
- 对象级别指标:指标绑定到某个 Kubernetes 对象(如 Service、Ingress),HPA 直接读取该对象的指标值。例如,Ingress 的每秒请求总数。
# 基于 Pod 级别 QPS 的 HPA 配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
4.4 外部指标 (External Metrics)
外部指标用于感知 Kubernetes 集群外部的系统状态,通常来自云厂商的托管服务。这些指标通过 external.metrics.k8s.io API 暴露,需要部署对应的 External Metrics Adapter(如 AWS CloudWatch Adapter、Azure Monitor Adapter)。
外部指标的核心价值在于:在事件到达集群之前触发伸缩,从而消除“先感知、后伸缩”的延迟。
| 云服务 | 典型外部指标 | 适用场景 |
|---|---|---|
| AWS SQS | ApproximateNumberOfMessagesVisible |
消息消费者工作负载,根据队列深度伸缩 |
| Azure Service Bus | ActiveMessages |
事件驱动架构,根据消息积压量伸缩 |
| GCP Pub/Sub | subscription/num_undelivered_messages |
流处理任务,根据未确认消息数伸缩 |
| AWS S3 / CloudFront | BucketSizeBytes / Requests |
数据处理管道,根据存储量或请求率伸缩 |
# 基于 AWS SQS 队列深度的 HPA 配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: sqs-consumer-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: sqs-consumer
minReplicas: 1
maxReplicas: 50
metrics:
- type: External
external:
metric:
name: aws_sqs_queue_depth
selector:
matchLabels:
queue: my-queue
target:
type: AverageValue
averageValue: 100
4.5 三类指标的选择决策流程
4.6 多指标组合策略
HPA 允许在同一个 metrics 数组中配置多种指标类型。当配置多个指标时,HPA 会分别计算每个指标建议的副本数,然后取最大值作为最终的伸缩目标。这种机制可以避免单一指标的盲区。
# 多指标组合 HPA 示例:资源指标 + 自定义指标
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: multi-metric-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 3
maxReplicas: 30
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: requests_per_second
target:
type: AverageValue
averageValue: 500
- 基础 + 业务:CPU 资源指标作为保底伸缩条件,QPS 自定义指标作为业务驱动条件。当 CPU 未达到阈值但 QPS 激增时,HPA 仍会扩容。
- 内部 + 外部:内存资源指标控制 Pod 数量上限,外部队列深度指标触发提前扩容。适用于消息消费者场景。
- 避免冗余:不要同时配置 CPU 和内存两个资源指标,除非应用对两者都有明确的线性关系。通常选择一个即可。
4.7 指标适配器部署要求
自定义指标和外部指标需要额外的适配器组件才能被 HPA 使用。以下是常见适配器的部署要点:
| 适配器 | 支持的指标类型 | 部署方式 | 关键配置 |
|---|---|---|---|
| Prometheus Adapter | 自定义指标 | Helm Chart / 手动部署 | prometheus.url、rules 指标映射规则 |
| Kubernetes Metrics Adapter | 自定义指标 + 外部指标 | Helm Chart | metricSources 配置外部数据源 |
| AWS CloudWatch Adapter | 外部指标 (AWS) | Helm Chart + IAM 角色 | region、metrics 列表 |
| Azure Monitor Adapter | 外部指标 (Azure) | Helm Chart + 托管身份 | azure.resourceGroup、azure.subscriptionId |
4.8 选择建议与避坑指南
- 优先使用资源指标:对于大多数无状态应用,CPU 指标已经足够。不要为了“炫技”而引入自定义指标,增加运维复杂度。
- 自定义指标要选择“领先指标”:选择那些在资源消耗之前就能反映负载变化的指标。例如,QPS 上升 10 秒后 CPU 才会上升,那么 QPS 就是领先指标。
- 外部指标要注意数据新鲜度:云服务指标通常有 1-5 分钟的延迟。如果应用对延迟敏感,考虑使用更实时的指标源或缩短适配器的轮询间隔。
- 避免指标数量过多:HPA 每次评估都会查询所有配置的指标。指标越多,API 调用次数越多,评估延迟越大。建议不超过 3 个指标。
- 测试指标可用性:在配置 HPA 之前,先通过
kubectl get --raw验证指标 API 是否返回数据。例如:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"。