2. Prometheus 架构回顾:Pull 模型、Pushgateway、Service Discovery、数据存储与查询

在深入控制面弹性伸缩的故障排查之前,必须重新校准对 Prometheus 核心架构的理解。生产环境中 90% 的采集异常都源于对 Pull 模型、Pushgateway 边界、服务发现机制以及存储查询原理的认知偏差。本节将逐一拆解这四个关键组件,并建立故障排查的架构视角。

2.1 Pull 模型:核心采集范式

Prometheus 采用 主动拉取(Pull) 模式,由 Server 端根据配置或服务发现结果,定期向目标暴露的 HTTP 端点(通常是 /metrics)发起 HTTP GET 请求。这与传统的推模式(如 StatsD、InfluxDB)有本质区别。

特性 Pull 模型 Push 模型
控制权 监控系统主动控制采集频率与目标 被监控端决定何时发送数据
健康探测 Pull 失败可直接判定目标不可达或进程异常 数据未收到无法区分是进程挂掉还是网络延迟
配置复杂度 需要服务发现或静态配置目标列表 被监控端只需配置接收端地址
适用场景 Kubernetes、传统 VM、长期运行的批处理任务 短生命周期任务、网络隔离环境
故障排查要点: 当出现采集数据缺失时,首先检查 Prometheus Server 是否能够 直接访问 目标 IP:Port。Pull 模型要求网络层面可达,任何防火墙、Service Mesh 侧车拦截、DNS 解析失败都会导致采集失败。

2.2 Pushgateway:短生命周期任务的桥梁

Pushgateway 是 Pull 模型的补充组件,允许批处理或短生命周期任务在退出前将指标推送到 Pushgateway,再由 Prometheus 从 Pushgateway 拉取。但 Pushgateway 并非万能网关,使用不当会引入严重故障。

  • 正确用法: 定时任务(CronJob)、CI/CD 流水线、一次性数据迁移作业。
  • 错误用法: 替代 Node Exporter 采集系统指标、作为长期运行的指标代理、用于高基数指标。
  • 核心风险: Pushgateway 不会自动清理过期指标,若任务未正确调用 pushadd 或 delete API,会导致指标残留,造成数据混乱和存储膨胀。
生产警告: 在控制面弹性伸缩场景中,严禁 将 kube-state-metrics 或 kubelet 的指标通过 Pushgateway 转发。这会破坏 Prometheus 的拉取健康检查机制,导致无法准确判断控制面组件是否存活。

2.3 Service Discovery:动态目标的自动发现

在 Kubernetes 环境中,Pod 和 Service 的 IP 会频繁变化。服务发现(SD)机制让 Prometheus 能够动态感知目标变化,无需手动修改配置文件。Kubernetes SD 是最常用的发现方式。

发现角色 作用 典型标签
node 发现集群所有 Node 节点 __meta_kubernetes_node_name
service 发现所有 Service 对象 __meta_kubernetes_service_name
pod 发现所有 Pod(最常用) __meta_kubernetes_pod_name, __meta_kubernetes_pod_container_name
endpoints 发现 Service 背后的 Endpoint 列表 __meta_kubernetes_endpoint_port_name
ingress 发现 Ingress 资源 __meta_kubernetes_ingress_name
排查技巧: 当发现某些 Pod 未被采集时,使用 promtool debug 或 Prometheus UI 的 Service Discovery 页面查看目标发现状态。常见问题包括:标签选择器不匹配、命名空间权限不足、RBAC 规则缺失。

2.4 数据存储与查询:TSDB 与 PromQL

Prometheus 内置了高性能的时序数据库(TSDB),所有采集到的样本数据按时间戳和标签索引存储。查询语言 PromQL 是故障排查的核心工具。

2.4.1 TSDB 存储结构

  • Block 存储: 数据按 2 小时时间窗口切分为 Block,每个 Block 包含独立的索引、元数据、样本数据。
  • WAL(Write-Ahead Log): 在数据写入 Block 前先写入 WAL,保证崩溃恢复时数据不丢失。
  • 压缩与保留: 后台定期压缩 Block,删除超过保留期的旧数据。

2.4.2 PromQL 查询基础

故障排查中最常用的 PromQL 模式:

# 查询当前时刻的指标值
up{job="kube-apiserver"}

# 查询过去 5 分钟的平均值
avg_over_time(up{job="kube-apiserver"}[5m])

# 计算速率(适用于 Counter 类型)
rate(http_requests_total{job="kube-apiserver"}[1m])

# 标签聚合
sum by (instance) (rate(http_requests_total{job="kube-apiserver"}[1m]))
存储故障排查要点: 当查询返回空数据时,检查:1) 目标是否在 up == 1 状态;2) 指标名称是否拼写正确;3) 标签匹配是否精确;4) 数据保留期是否已过导致数据被删除。
Prometheus 核心架构:Pull 模型与组件交互 Prometheus 核心架构:Pull 模型与组件交互 Prometheus Server TSDB + 查询引擎 Service Discovery Kubernetes 控制面 kube-apiserver kube-controller-manager kube-scheduler Node 节点 kubelet / cAdvisor Node Exporter kube-proxy Pushgateway CronJob 指标 批处理任务 CI/CD 流水线 Pull /metrics Pull /metrics Pull /metrics 批处理任务 Push 指标 说明: 1. Prometheus Server 通过 Service Discovery 动态发现目标,主动发起 HTTP Pull 请求。 2. Pushgateway 仅作为短生命周期任务的指标缓存,不应替代常规 Exporter。

2.5 架构总结与故障排查映射

将上述组件串联起来,形成完整的采集链路。故障排查时,可以按以下层次逐级定位:

  1. 服务发现层: 目标是否被正确发现?标签是否匹配?
  2. 网络层: Prometheus 能否访问目标 IP:Port?是否存在网络策略或 mTLS 阻断?
  3. 采集层: 目标是否返回有效的 /metrics 端点?HTTP 状态码是否为 200?
  4. 存储层: 数据是否成功写入 TSDB?是否存在 WAL 损坏或磁盘空间不足?
  5. 查询层: PromQL 语法是否正确?标签选择器是否精确?
架构视角: 在控制面弹性伸缩场景中,重点关注 kube-apiserver 和 kube-controller-manager 的采集链路。这两个组件的指标直接反映控制面的健康状态和伸缩决策质量。任何采集中断都会导致弹性伸缩策略“失明”。