2. HPA 指标类型:资源指标、自定义指标与外部指标
HPA(Horizontal Pod Autoscaler)的扩缩容决策完全依赖于指标数据。理解指标的类型、来源与聚合方式是校准 SLO 和配置 HPA 策略的基础。Kubernetes 将 HPA 支持的指标划分为三大类:资源指标、自定义指标和外部指标。
2.1 资源指标(Resource Metrics)
资源指标是最基础、最常用的指标类型,由 Metrics Server 从 kubelet 的 cAdvisor 收集,并通过 metrics.k8s.io API 暴露。HPA 直接使用 Pod 的 requests 值作为分母计算利用率。
| 指标名称 | 来源 | 聚合方式 | 典型用途 |
|---|---|---|---|
cpu |
Metrics Server / cAdvisor | 利用率(当前使用量 / requests) | CPU 密集型服务扩缩容 |
memory |
Metrics Server / cAdvisor | 利用率(当前使用量 / requests) | 内存敏感型服务保护 |
口径校准要点: 资源指标默认使用 利用率(Utilization) 而非原始使用量。利用率 = Pod 当前使用量 ÷ Pod 的 requests 值。如果 requests 设置过高或过低,会导致 HPA 行为异常。SLO 校准时应优先检查 Pod 的 requests 配置是否合理。
2.2 自定义指标(Custom Metrics)
自定义指标允许用户基于应用层数据(如 QPS、请求延迟 P99、队列深度)进行扩缩容。这些指标通过 Custom Metrics API(custom.metrics.k8s.io)暴露,通常由 Prometheus Adapter、Kubernetes Metrics Adapter 或 Datadog Cluster Agent 等适配器提供。
- 指标来源: Prometheus、StatsD、Datadog、自定义 exporter
- 聚合粒度: 支持 Pod 级别聚合(平均值、总和)和 Object 级别聚合(单个对象的指标值)
- 典型场景: 基于 HTTP 请求速率、gRPC 延迟、消息队列积压、数据库连接数
# HPA 使用自定义指标示例(基于 QPS)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: webapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
minReplicas: 2
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
常见陷阱: 自定义指标适配器配置复杂,容易因指标名称不匹配、标签缺失或聚合周期不一致导致 HPA 无法获取数据。建议在部署前使用
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 验证指标是否正常暴露。
2.3 外部指标(External Metrics)
外部指标用于引用 集群外部 的指标数据,例如云服务商提供的负载均衡器连接数、消息队列(如 AWS SQS、Kafka)的积压消息数、数据库连接池使用率等。这些指标通过 External Metrics API(external.metrics.k8s.io)暴露。
| 特性 | 资源指标 | 自定义指标 | 外部指标 |
|---|---|---|---|
| 数据范围 | 集群内 Pod | 集群内 Pod / Object | 集群外系统 |
| API 组 | metrics.k8s.io |
custom.metrics.k8s.io |
external.metrics.k8s.io |
| 聚合方式 | 利用率 / 平均值 | 平均值 / 目标值 | 目标值 |
| 典型适配器 | Metrics Server | Prometheus Adapter | AWS / GCP / Azure 云适配器 |
# HPA 使用外部指标示例(基于 AWS SQS 队列深度)
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_approximate_number_of_messages_visible
selector:
matchLabels:
queue: my-queue
target:
type: AverageValue
averageValue: 100
2.4 指标来源与聚合架构
下图展示了 HPA 指标采集、聚合与决策的完整链路:
2.5 指标聚合与目标值类型
HPA v2 支持三种目标值类型,不同指标类型适用的聚合方式不同:
| 目标值类型 | 适用指标类型 | 计算方式 | 示例 |
|---|---|---|---|
Utilization |
资源指标(CPU/Memory) | 所有 Pod 当前使用量之和 ÷ 所有 Pod requests 之和 | CPU 利用率目标 80% |
AverageValue |
自定义指标(Pods 类型)、外部指标 | 所有 Pod 指标值之和 ÷ Pod 副本数 | 平均 QPS 目标 1000 |
Value |
自定义指标(Object 类型)、外部指标 | 直接使用指标原始值,不除以副本数 | Ingress 连接数目标 5000 |
SLO 校准建议:
- 资源指标: 将 HPA 目标利用率设置为 SLO 响应时间阈值的 60%-70%,预留缓冲空间。
- 自定义指标: 优先使用
AverageValue类型,确保指标口径与业务 SLO 对齐(如 P99 延迟 ≤ 200ms)。 - 外部指标: 注意指标采集延迟(通常 1-5 分钟),避免因数据滞后导致扩缩容震荡。
2.6 多指标组合策略
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: http_requests_per_second
target:
type: AverageValue
averageValue: 500
- type: External
external:
metric:
name: queue_depth
target:
type: AverageValue
averageValue: 50
多指标冲突处理: 当不同指标给出的建议副本数差异较大时(如 CPU 建议 5 副本,队列深度建议 20 副本),HPA 会采用最大值。这可能导致资源浪费,建议将指标目标值校准到相近的扩缩容阈值区间。