4. 采集链路组件:Target发现、Scrape配置、Relabeling机制、ServiceMonitor与PodMonitor

在Prometheus Operator生态中,采集链路的核心由四个组件构成:Target发现决定“采集谁”,Scrape配置决定“怎么采”,Relabeling机制决定“标签怎么改”,ServiceMonitor与PodMonitor则是声明式的CRD资源,将前三者串联为可运维的配置。本节逐一拆解每个组件的职责、交互关系及故障排查要点。

4.1 组件职责与交互关系

下表总结了四个组件在采集链路中的角色与关键属性:

组件 职责 关键字段 故障排查切入点
Target发现 通过Kubernetes API动态获取Service、Pod、Endpoint等资源列表 role: service / pod / endpoints 检查RBAC权限、API Server连通性、资源标签选择器
Scrape配置 定义采集频率、超时、路径、端口、协议等采集参数 scrape_interval, scrape_timeout, metrics_path 确认Prometheus配置是否被正确reload,参数是否覆盖默认值
Relabeling机制 在采集前对目标标签进行增、删、改、过滤,控制最终采集目标集 relabel_configs, metric_relabel_configs 验证标签匹配规则、action类型(replace/keep/drop/hashmod)
ServiceMonitor / PodMonitor CRD资源,将Service/Pod的标签选择器、端口、路径声明为Prometheus可理解的采集配置 spec.selector, spec.endpoints, spec.podMetricsEndpoints 检查CRD是否被正确创建、命名空间标签是否匹配、endpoints是否可达
核心原则:ServiceMonitor与PodMonitor是“声明式配置层”,最终由Prometheus Operator控制器将其转换为Prometheus原生scrape_config。故障排查时,应优先检查CRD状态,再查看生成的Prometheus配置。

4.2 Target发现机制

Prometheus Operator通过Kubernetes服务发现(SD)自动发现采集目标。支持以下角色:

  • role: service — 发现Service对象,通常与ServiceMonitor配合使用。
  • role: pod — 发现Pod对象,通常与PodMonitor配合使用。
  • role: endpoints — 发现Endpoints对象,是ServiceMonitor的底层实现。
  • role: node — 发现集群节点,用于采集节点指标。

Target发现依赖Kubernetes RBAC权限。如果Prometheus无法列出Service或Pod,采集目标列表将为空。常见故障现象:

  • Prometheus Target页面显示 0 up 或 no targets。
  • 日志中出现 Unauthorized 或 Forbidden 错误。
排查命令:
kubectl -n monitoring logs prometheus-k8s-0 prometheus | grep -i "discovery"
查看服务发现日志,确认是否成功获取到目标列表。

4.3 Scrape配置详解

Scrape配置定义了Prometheus如何从目标拉取指标。关键参数包括:

参数 默认值 说明 故障影响
scrape_interval 30s 采集间隔 间隔过长导致数据延迟,过短增加负载
scrape_timeout 10s 单次采集超时 超时导致该次采集失败,目标标记为 DOWN
metrics_path /metrics 指标暴露路径 路径错误返回404,采集失败
scheme http 协议(http/https) 协议不匹配导致TLS握手失败
honor_labels false 是否保留目标自身标签 设为false时,目标标签可能被覆盖

在ServiceMonitor中,这些参数通过 spec.endpoints 字段声明:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: example
  endpoints:
  - port: metrics
    interval: 15s
    scrapeTimeout: 10s
    path: /metrics
    scheme: http

4.4 Relabeling机制

Relabeling是Prometheus最强大的标签处理工具,在采集链路中分为两个阶段:

  • relabel_configs — 在采集前对目标标签进行修改,决定哪些目标被采集、哪些被丢弃。
  • metric_relabel_configs — 在采集后对指标标签进行修改,决定哪些指标被保留、哪些被丢弃。

常用action类型:

Action 作用 典型场景
replace 替换或创建标签 将 __meta_kubernetes_* 标签映射为业务标签
keep 保留匹配的目标 只采集包含特定标签的Pod
drop 丢弃匹配的目标 排除系统命名空间中的Pod
hashmod 基于哈希取模分片 多Prometheus实例水平分片采集
labelmap 复制匹配的标签 将 __meta_* 标签批量映射为业务标签
常见陷阱:Relabeling规则顺序敏感。如果先执行 drop 再执行 keep,可能导致预期外的目标丢失。建议在ServiceMonitor/PodMonitor中只使用 keep 和 replace,将复杂过滤留给全局relabel_configs。

4.5 ServiceMonitor与PodMonitor

ServiceMonitor和PodMonitor是Prometheus Operator定义的CRD,用于声明式管理采集配置。两者的核心区别:

特性 ServiceMonitor PodMonitor
发现对象 Service Pod
端口选择 通过Service端口名称或端口号 通过Pod容器端口名称或端口号
适用场景 有稳定Service的微服务 无头服务、DaemonSet、Sidecar模式
标签继承 继承Service的标签 继承Pod的标签
网络路径 通过ClusterIP访问 直接访问Pod IP

以下SVG图展示了从CRD声明到最终采集目标的完整链路:

采集链路组件交互流程 ServiceMonitor 声明Service采集规则 PodMonitor 声明Pod采集规则 Prometheus Operator CRD → scrape_config 转换 Prometheus scrape_config 包含Target发现 + Scrape参数 + Relabeling Target发现(Kubernetes SD) 通过API Server获取Service/Pod/Endpoints列表,应用Relabeling规则 最终采集目标列表 CRD声明层 用户只需关注此层 配置转换层 Operator自动完成

4.6 故障排查要点

当采集链路出现问题时,按以下顺序排查:

  1. 检查CRD状态 — kubectl get servicemonitor -n <namespace> 确认ServiceMonitor/PodMonitor已创建。
  2. 检查标签选择器 — ServiceMonitor的 spec.selector 必须匹配目标Service的标签。
  3. 检查命名空间标签 — 如果Prometheus配置了 spec.serviceMonitorNamespaceSelector,需要确保目标命名空间有匹配标签。
  4. 检查生成的Prometheus配置 — 进入Prometheus Pod,查看 /etc/prometheus/config_out/prometheus.env.yaml,确认scrape_config是否正确生成。
  5. 检查Target页面 — Prometheus UI → Status → Targets,查看目标状态和错误信息。
  6. 检查Relabeling结果 — 在Target页面点击目标,查看 Labels 和 Before Relabeling 对比,确认标签转换是否符合预期。
调试Relabeling:使用 promtool debug relabel 命令离线测试relabel规则,避免在生产环境反复调试。
示例:promtool debug relabel --config.file=relabel.yaml --input=target.json

4.7 常见故障模式与解决方案

故障现象 可能原因 解决方案
Target列表为空 ServiceMonitor标签选择器不匹配 检查Service标签与ServiceMonitor selector是否一致
Target显示 DOWN Scrape超时或端口不通 检查 scrape_timeout 是否过短,确认Pod端口是否暴露
指标标签丢失 Relabeling规则覆盖了原始标签 检查 honor_labels 设置,调整relabel顺序
配置未生效 Prometheus未reload配置 触发 POST /-/reload 或重启Prometheus Pod
CRD创建失败 CRD版本不兼容或RBAC权限不足 检查Prometheus Operator版本,确认RBAC ClusterRole包含CRD资源权限

以下SVG图展示了Relabeling在采集链路中的具体位置与数据流向:

Relabeling在采集链路中的位置 原始目标列表 包含 __meta_* 标签 relabel_configs 目标过滤 + 标签映射 最终采集目标 携带业务标签 采集原始指标 包含所有标签 metric_relabel_configs 指标标签过滤 + 修改 采集前处理 决定哪些目标被采集 采集后处理 决定哪些指标被存储
关键结论:ServiceMonitor/PodMonitor是用户与采集链路的交互界面,Target发现是数据源,Scrape配置是采集参数,Relabeling是标签治理工具。四者协同工作,任何一环出问题都会导致误差预算台账数据缺失或异常。故障排查时应从CRD声明层向下逐层验证,直到确认采集目标正常。