2. Prometheus Operator 架构:核心组件、CRD 资源与工作流程

在深入 ServiceMonitor 标签治理 之前,必须先理解 Prometheus Operator 的整体架构。Operator 的本质是一个 Kubernetes 控制器,它利用 CRD(Custom Resource Definition)将 Prometheus 的运维知识编码为自动化逻辑,从而让用户以声明式的方式管理监控栈。

2.1 核心组件

Prometheus Operator 由三个核心组件构成,它们协同工作以实现监控的自动化部署与配置。

组件 角色 核心职责
Operator 控制器大脑 监听 CRD 资源变化,协调 Prometheus/Alertmanager 实例的生命周期(创建、更新、扩缩容、销毁)。
Prometheus 监控实例 由 Operator 管理的 StatefulSet,负责拉取指标、存储数据、执行告警规则。
Alertmanager 告警处理器 由 Operator 管理的 StatefulSet,负责对告警进行去重、分组、静默并发送通知。
关键认知: Operator 本身不处理指标数据,它只负责“翻译” CRD 资源(如 ServiceMonitor)为 Prometheus 原生配置文件(如 prometheus.yml 和 scrape_configs),并触发 Prometheus 实例的热加载。

2.2 CRD 资源全景

Operator 定义了一组 CRD,作为用户与监控系统交互的接口。以下是本课程最核心的四个 CRD:

  • Prometheus:定义 Prometheus 实例的规格(副本数、资源限制、存储、版本等)。Operator 根据此 CRD 创建对应的 StatefulSet。
  • ServiceMonitor:定义如何从一组 Kubernetes Service 中抓取指标。它通过标签选择器关联 Service,并指定抓取端口、路径、间隔等。这是本课程的核心治理对象。
  • PodMonitor:与 ServiceMonitor 类似,但直接通过标签选择器关联 Pod,适用于不需要 Service 层抽象的场景(如 DaemonSet 暴露的指标)。
  • PrometheusRule:定义告警规则和记录规则。Operator 会将这些规则加载到 Prometheus 实例中。
治理焦点: ServiceMonitor 和 PodMonitor 中的 relabel_configs 字段是标签治理的主战场。错误的标签配置会导致指标基数爆炸、数据归属混乱或抓取失败。

2.3 工作流程:从 CRD 到抓取配置

理解 Operator 如何将 ServiceMonitor 转化为 Prometheus 的抓取配置,是掌握标签治理的前提。下图展示了完整的自动化链路:

Prometheus Operator 工作流程 Prometheus Operator 工作流程:从 CRD 到抓取配置 用户创建 ServiceMonitor Operator 控制器 生成 scrape_configs Prometheus 实例 热加载配置 根据配置抓取 /metrics 核心链路:用户声明 ServiceMonitor → Operator 监听并转换为 Prometheus 原生配置 → 热加载 → 按新配置抓取。

2.4 配置生成细节

Operator 在生成 scrape_configs 时,会执行以下关键步骤:

  1. Service 发现:根据 ServiceMonitor 的 selector.matchLabels 找到匹配的 Service。
  2. Endpoint 解析:从 Service 中获取所有 Endpoint(Pod IP + 端口)。
  3. 标签注入:自动注入 Kubernetes 元数据标签(如 namespace、pod、service、instance)。
  4. Relabeling 执行:依次执行 ServiceMonitor 中定义的 relabel_configs 和 metric_relabel_configs,这是标签治理的核心环节。
  5. 配置合并:将生成的 job 追加到 Prometheus 的 scrape_configs 中。
常见陷阱: 默认情况下,Operator 会注入大量 Kubernetes 标签(如 __meta_kubernetes_*)。如果不通过 relabel_configs 进行清理或保留,这些标签会全部进入时间序列,导致标签基数(Cardinality)失控,最终拖垮 Prometheus 的存储和查询性能。

2.5 ServiceMonitor 与 PodMonitor 对比

维度 ServiceMonitor PodMonitor
发现对象 Kubernetes Service 直接发现 Pod
适用场景 有 Service 层负载均衡,或需要利用 Service 的标签选择能力 无头服务、DaemonSet、Sidecar 模式,或不需要 Service 抽象
标签来源 Service 标签 + Endpoint 标签 Pod 标签 + 所属 Node 标签
治理复杂度 中等(需处理 Service 与 Pod 两层标签) 较低(直接面对 Pod 标签)

2.6 标签治理的切入点

从工作流程可以看出,标签治理主要发生在以下两个阶段:

  • 抓取阶段(scrape_time):通过 ServiceMonitor/PodMonitor 的 relabel_configs 控制哪些标签进入时间序列。
  • 存储阶段(storage_time):通过 Prometheus 的 storage.tsdb.retention.time 和 storage.tsdb.retention.size 控制数据生命周期,但无法改变已存储的标签。
课程核心主张: 标签治理的最佳实践是在 抓取阶段 完成。一旦指标进入 TSDB,标签就固定了。后续的查询时标签操作(如 label_replace)只能用于展示,无法减少存储开销。因此,ServiceMonitor 的 relabel_configs 是治理的第一道也是最重要的防线。