2. Prometheus Operator 架构回顾:ServiceMonitor、PodMonitor、Prometheus CRD 的关系

在深入分片采集容量校准之前,必须理清 Prometheus Operator 的核心抽象层。Operator 通过三个关键 CRD(Custom Resource Definition)将声明式配置与 Prometheus 实例解耦,使 SRE 能够以 Kubernetes 原生的方式管理监控拓扑。

2.1 三层 CRD 的职责边界

Prometheus Operator 的架构可概括为“资源发现 → 采集配置 → 实例运行”三层模型。下表从职责、作用对象、生成配置三个维度对比三个 CRD:

CRD 名称 职责定位 作用对象 生成的 Prometheus 配置
ServiceMonitor 基于 Service 的自动发现与采集目标定义 Kubernetes Service + Endpoints scrape_configs 中的 kubernetes_sd_configs(role: endpoints)
PodMonitor 基于 Pod 标签的直接采集目标定义 Kubernetes Pod(无需 Service) scrape_configs 中的 kubernetes_sd_configs(role: pod)
Prometheus CRD Prometheus 实例的声明式定义(版本、资源、存储、分片等) StatefulSet / 采集配置生成器 Prometheus 主配置文件 prometheus.yml 及所有子配置
关键认知: ServiceMonitor 和 PodMonitor 只负责“采集目标发现”,不负责实例运行;Prometheus CRD 负责“实例生命周期”,并将 Monitor 资源自动编译为最终的采集配置。

2.2 架构关系与数据流

下图展示了 Operator 如何将 ServiceMonitor / PodMonitor 与 Prometheus CRD 串联,形成完整的配置下发链路:

Prometheus Operator CRD 关系与数据流 Prometheus Operator CRD 关系与数据流 用户声明 ServiceMonitor 用户声明 PodMonitor Prometheus CRD replicas: 2, shards: 3 Operator 控制器 生成 scrape_configs Prometheus StatefulSet (分片) 说明: ServiceMonitor/PodMonitor 只定义“采集什么”,Prometheus CRD 定义“谁来采集、采几分片”。 Operator 控制器负责将 Monitor 资源编译为 Prometheus 可识别的 scrape_configs,并注入 StatefulSet。

2.3 分片(Sharding)在 CRD 中的位置

分片能力由 Prometheus CRD 的 .spec.shards 字段控制,与 ServiceMonitor / PodMonitor 的 .spec.selector 配合实现水平拆分。分片逻辑并不在 Monitor 资源中定义,而是由 Operator 在生成配置时自动将目标列表按哈希分配到不同分片实例。

分片核心公式:
target_hash % shards_count = shard_index
每个 Prometheus 分片实例只采集属于自己 shard_index 的目标,从而实现采集压力的水平扩展。

2.4 典型工作流(步骤列表)

  1. 定义 ServiceMonitor:通过 spec.selector.matchLabels 匹配目标 Service,指定 spec.endpoints 中的端口与路径。
  2. 定义 Prometheus CRD:设置 spec.shards: 3,Operator 自动创建 3 个分片 StatefulSet。
  3. Operator 监听:控制器 watch ServiceMonitor 和 Prometheus CRD 的变化。
  4. 配置编译:Operator 将 ServiceMonitor 转换为 scrape_configs,并为每个分片实例注入不同的 __shard__ 标签。
  5. 目标分配:每个 Prometheus 分片启动时,根据自身 shard_index 只采集哈希匹配的目标。

2.5 避坑指南:常见误解

误解 正确理解
ServiceMonitor 可以控制分片数量 分片数量由 Prometheus CRD 的 shards 字段控制,ServiceMonitor 只负责目标发现
PodMonitor 比 ServiceMonitor 更高效 两者只是发现方式不同(Pod vs Service),采集性能取决于目标数量与分片配置
一个 ServiceMonitor 只能被一个 Prometheus 实例使用 通过 spec.serviceMonitorNamespaceSelector 和 spec.serviceMonitorSelector,一个 ServiceMonitor 可被多个 Prometheus CRD 复用
分片后每个目标只被采集一次 默认每个目标只被一个分片采集,但若存在重复的 ServiceMonitor 匹配,可能导致重复采集
容量校准前置条件: 在开始分片容量规划前,必须确认 Prometheus CRD 的 shards 字段已正确设置,且 ServiceMonitor 的 selector 没有遗漏或过度匹配目标。否则后续的校准计算将基于错误的采集基数。