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声明到最终采集目标的完整链路:
4.6 故障排查要点
当采集链路出现问题时,按以下顺序排查:
- 检查CRD状态 —
kubectl get servicemonitor -n <namespace>确认ServiceMonitor/PodMonitor已创建。 - 检查标签选择器 — ServiceMonitor的
spec.selector必须匹配目标Service的标签。 - 检查命名空间标签 — 如果Prometheus配置了
spec.serviceMonitorNamespaceSelector,需要确保目标命名空间有匹配标签。 - 检查生成的Prometheus配置 — 进入Prometheus Pod,查看
/etc/prometheus/config_out/prometheus.env.yaml,确认scrape_config是否正确生成。 - 检查Target页面 — Prometheus UI → Status → Targets,查看目标状态和错误信息。
- 检查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在采集链路中的具体位置与数据流向:
关键结论:ServiceMonitor/PodMonitor是用户与采集链路的交互界面,Target发现是数据源,Scrape配置是采集参数,Relabeling是标签治理工具。四者协同工作,任何一环出问题都会导致误差预算台账数据缺失或异常。故障排查时应从CRD声明层向下逐层验证,直到确认采集目标正常。