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 串联,形成完整的配置下发链路:
2.3 分片(Sharding)在 CRD 中的位置
分片能力由 Prometheus CRD 的 .spec.shards 字段控制,与 ServiceMonitor / PodMonitor 的 .spec.selector 配合实现水平拆分。分片逻辑并不在 Monitor 资源中定义,而是由 Operator 在生成配置时自动将目标列表按哈希分配到不同分片实例。
分片核心公式:
每个 Prometheus 分片实例只采集属于自己
target_hash % shards_count = shard_index每个 Prometheus 分片实例只采集属于自己
shard_index 的目标,从而实现采集压力的水平扩展。
2.4 典型工作流(步骤列表)
- 定义 ServiceMonitor:通过
spec.selector.matchLabels匹配目标 Service,指定spec.endpoints中的端口与路径。 - 定义 Prometheus CRD:设置
spec.shards: 3,Operator 自动创建 3 个分片 StatefulSet。 - Operator 监听:控制器 watch ServiceMonitor 和 Prometheus CRD 的变化。
- 配置编译:Operator 将 ServiceMonitor 转换为
scrape_configs,并为每个分片实例注入不同的__shard__标签。 - 目标分配:每个 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 没有遗漏或过度匹配目标。否则后续的校准计算将基于错误的采集基数。