4. 自定义指标架构总览:Prometheus + Adapter + HPA 的端到端数据流

在基于连接池水位进行弹性伸缩的场景中,数据从业务 Pod 的指标暴露到 HPA 做出扩缩容决策,需要经过一条完整的采集、转换、适配链路。理解这条链路的每个环节,是正确配置自定义指标的前提。

下图展示了 Prometheus → Adapter → HPA 三个核心组件之间的数据流转关系:

Prometheus + Adapter + HPA 端到端数据流 业务 Pod /metrics 端点 暴露连接池水位指标 Prometheus Server 定期拉取 /metrics 存储时间序列数据 Metrics Adapter 查询 Prometheus 转换为自定义指标 API scrape query Kubernetes API Server custom.metrics.k8s.io 提供指标查询接口 注册/响应 HPA Controller 周期性查询指标 计算期望副本数 GET /apis/custom-metrics 关键说明 Adapter 是 Prometheus 与 Kubernetes 指标 API 之间的 桥梁,负责数据格式转换

4.1 数据流各环节职责

整个链路可以拆解为五个关键环节,每个环节承担特定的数据转换职责:

环节 组件 核心职责 数据形态
① 指标暴露 业务 Pod 在 /metrics 端点输出连接池使用量、最大连接数、等待队列长度等指标 Prometheus 文本格式(Gauge/Histogram)
② 指标采集 Prometheus Server 按配置的 scrape_interval 定期拉取 Pod 指标,存储为时间序列 时间序列数据(TSDB)
③ 指标适配 Metrics Adapter 通过 PromQL 查询 Prometheus,将结果转换为 Kubernetes 自定义指标格式 custom.metrics.k8s.io API 资源
④ 指标查询 Kubernetes API Server 提供标准的 custom-metrics API 端点,供 HPA 查询 MetricValueList JSON 响应
⑤ 弹性决策 HPA Controller 周期性获取当前指标值,与目标值比较,计算期望副本数并更新 Deployment/StatefulSet Replica 数字(整数)
关键理解:Adapter 是整个架构的"翻译官"。Prometheus 存储的是原始时间序列数据,而 HPA 需要的是符合 custom.metrics.k8s.io 接口规范的指标值。Adapter 通过配置的 PromQL 查询语句,完成从"指标名+标签"到"当前值"的转换。

4.2 连接池水位指标在数据流中的形态变化

以连接池水位为例,观察同一个指标在不同环节的表示形式:

环节 指标表示 示例值
Pod /metrics db_connections_in_use{pool="primary",pod="app-7d8f9c"} 42
Prometheus TSDB db_connections_in_use{instance="10.0.0.5:8080",pool="primary"} 42 @ timestamp
Adapter PromQL 结果 avg(db_connections_in_use) by (pod) 42.0
custom-metrics API /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/db_connections_in_use {"value": "42"}
HPA 决策 当前值 / 目标值 → 期望副本数 42 / 30 = 2 → 期望 2 个副本

4.3 关键配置点

要使这条数据流正常工作,需要在三个组件上完成对应的配置:

  1. Pod 端:应用必须暴露 Prometheus 格式的指标,且指标命名清晰(如 pool_connections_active、pool_connections_idle)。
  2. Prometheus 端:配置 ServiceMonitor 或 PodMonitor 确保能发现并抓取目标 Pod 的 /metrics 端点。
  3. Adapter 端:编写 adapter 配置文件,定义 PromQL 查询、指标名称映射、返回的标签(通常保留 pod 标签用于 HPA 按 Pod 查询)。
常见误区:很多初学者只配置了 Prometheus 采集,却忽略了 Adapter 端的 PromQL 查询必须返回 {pod="xxx"} 标签。HPA 按 Pod 查询指标时,如果 Adapter 返回的指标缺少 pod 标签,会导致 HPA 无法正确获取每个 Pod 的当前水位值,从而触发"指标不可用"错误。

4.4 数据流时序与延迟

理解数据流中的延迟累积,有助于设置合理的 HPA 指标窗口和扩缩容阈值:

数据流各环节延迟示意 时间轴 Pod 暴露指标 Prometheus 拉取 Adapter 查询 API Server 响应 典型延迟累积 scrape_interval (15s) + Adapter 查询间隔 (30s) + HPA 同步周期 (15s) = 最长 60s 延迟 建议:HPA 的 --horizontal-pod-autoscaler-sync-period 保持默认 15s,Adapter 缓存时间设为 30s
延迟风险提示:如果连接池水位在短时间内剧烈波动(如秒级突发流量),上述 60 秒的端到端延迟可能导致 HPA 响应滞后。对于这种场景,建议配合 KEDA 或使用 Direct Pod Scrape 方式缩短延迟,或者通过调整 HPA 的 behavior.scaleUp.stabilizationWindowSeconds 来平衡响应速度和稳定性。

4.5 架构优势与适用场景

这种 Prometheus + Adapter + HPA 的架构之所以成为 Kubernetes 自定义指标弹性伸缩的事实标准,主要得益于以下特性:

  • 解耦性:指标采集、存储、转换、决策各司其职,任一组件可独立升级或替换。
  • 扩展性:Adapter 支持任意 PromQL 表达式,可以实现复杂的指标聚合(如连接池使用率 = 活跃连接数 / 最大连接数)。
  • 标准化:最终暴露的 custom-metrics API 是 Kubernetes 原生接口,HPA 无需关心底层指标来源。
  • 生态兼容:Prometheus 生态中的 Exporter、ServiceMonitor、Recording Rules 等工具均可复用。