4. 作业与实例管理
在 Prometheus 采集作业平台中,作业(Job) 定义了抓取目标(Target)的逻辑分组与采集参数,而 实例(Instance) 则是每个具体的抓取端点。本章深入剖析作业定义、实例分组机制,以及三种核心的服务发现方式:静态配置(static_configs)、文件发现(file_sd_configs)、Consul 发现(consul_sd_configs)和 Kubernetes 发现(kubernetes_sd_configs)。
4.1 作业与实例的核心概念
每个 scrape_config 定义一个作业。Prometheus 通过 job_name 唯一标识一个采集任务,并将抓取到的所有指标自动附加 job 和 instance 标签。
| 概念 | 说明 | 示例值 |
|---|---|---|
| Job | 一组具有相同采集策略的目标集合 | node_exporter |
| Instance | 单个抓取端点,通常为 <host>:<port> |
10.0.0.1:9100 |
| Target | 经过服务发现后生成的最终抓取对象 | http://10.0.0.1:9100/metrics |
| 标签 | 附加在时间序列上的元数据,用于分组与过滤 | job="node", env="prod" |
__scheme__、__metrics_path__ 和 scrape_interval。若需要不同的采集参数,应定义独立的作业。
4.2 静态配置与实例分组
静态配置是最直接的服务发现方式,适用于基础设施稳定、目标数量少且不频繁变动的场景。通过 static_configs 直接列出目标地址,并利用 labels 实现实例分组。
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets:
- '10.0.0.1:9100'
- '10.0.0.2:9100'
labels:
group: 'web'
region: 'us-east-1'
- targets:
- '10.0.1.1:9100'
- '10.0.1.2:9100'
labels:
group: 'db'
region: 'us-east-1'
上述配置将 4 个实例分为两个逻辑组:web 和 db。Prometheus 在抓取时会自动将 group 和 region 标签附加到所有时间序列上,便于后续的查询聚合与告警路由。
4.3 文件服务发现(file_sd_configs)
file_sd_configs 允许 Prometheus 从本地或共享文件系统中读取目标列表。文件格式支持 JSON 和 YAML,Prometheus 会定期(默认 5 分钟)重新读取文件,无需重启进程。
scrape_configs:
- job_name: 'custom_targets'
file_sd_configs:
- files:
- '/etc/prometheus/targets/*.json'
refresh_interval: 30s
目标文件示例(/etc/prometheus/targets/web.json):
[
{
"targets": ["10.0.0.1:9100", "10.0.0.2:9100"],
"labels": {
"service": "web-frontend",
"env": "production"
}
},
{
"targets": ["10.0.1.1:9100"],
"labels": {
"service": "web-backend",
"env": "production"
}
}
]
| 参数 | 说明 | 默认值 |
|---|---|---|
files |
支持 glob 模式的文件路径列表 | 必填 |
refresh_interval |
文件重新读取周期 | 5m |
DOWN,直到文件被更新或作业重新加载。
4.4 Consul 服务发现(consul_sd_configs)
Consul 是 HashiCorp 推出的服务注册与发现工具。consul_sd_configs 允许 Prometheus 直接从 Consul 集群获取健康服务列表,并利用 Consul 的标签和元数据实现动态分组。
scrape_configs:
- job_name: 'consul_services'
consul_sd_configs:
- server: 'localhost:8500'
datacenter: 'dc1'
services:
- 'web'
- 'api'
relabel_configs:
- source_labels: ['__meta_consul_service']
target_label: 'service'
- source_labels: ['__meta_consul_dc']
target_label: 'datacenter'
Consul 发现的核心元数据标签:
| 标签名 | 说明 |
|---|---|
__meta_consul_address |
服务实例的 IP 地址 |
__meta_consul_service |
Consul 中的服务名称 |
__meta_consul_dc |
数据中心 |
__meta_consul_tags |
服务标签列表,以逗号分隔 |
__meta_consul_service_metadata_* |
服务元数据中的自定义键值对 |
tags 或 service_metadata 实现多维度分组。例如,为所有 version=v2 的实例添加 canary: true 标签,实现灰度采集与监控。
4.5 Kubernetes 服务发现(kubernetes_sd_configs)
Kubernetes 服务发现是云原生场景下的首选方案。Prometheus 通过 Kubernetes API 动态发现 Pod、Service、Endpoint、Node 和 Ingress 等资源,并自动关联丰富的元数据标签。
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_container_port_number]
target_label: port
Kubernetes 发现支持 5 种角色(role),每种角色提供不同的元数据:
| 角色 | 发现对象 | 典型用途 |
|---|---|---|
pod |
所有 Pod | 采集 Pod 内 exporter 指标 |
service |
所有 Service | 通过 Service 的 ClusterIP 采集 |
endpoints |
Endpoints 对象 | 采集 Endpoint 背后的 Pod 列表 |
node |
集群节点 | 采集节点级指标(如 kubelet) |
ingress |
Ingress 资源 | 采集 Ingress 控制器指标 |
relabel_configs 精确过滤目标。避免使用单个作业发现所有资源,防止目标数量过大导致抓取延迟。
4.6 实例分组机制与 relabel_configs
无论使用哪种服务发现方式,实例分组 的核心机制都是通过 relabel_configs 对元数据标签进行转换、过滤和聚合。分组后的标签将作为时间序列的永久标签,直接影响查询、告警和可视化。
relabel_configs:
# 将 Consul 的服务名称映射为 job 标签
- source_labels: ['__meta_consul_service']
target_label: 'job'
# 保留 Pod 的 app 标签,并添加环境标签
- source_labels: ['__meta_kubernetes_pod_label_app']
target_label: 'app'
- target_label: 'environment'
replacement: 'production'
# 丢弃不包含 metrics 端口的 Pod
- source_labels: ['__meta_kubernetes_pod_annotation_prometheus_io_scrape']
regex: 'true'
action: keep
分组后的标签结构示例:
# 原始实例
10.0.0.1:9100
# 经过 relabel 后附加的标签
job="node_exporter"
instance="10.0.0.1:9100"
group="web"
region="us-east-1"
app="nginx"
namespace="production"
relabel_configs 中覆盖 __address__ 或 __metrics_path__ 等内部标签时使用错误的正则表达式。建议先在测试环境使用 action: keep 或 action: drop 验证过滤逻辑,再应用到生产。
4.7 四种服务发现方式对比
| 特性 | static_configs | file_sd_configs | consul_sd_configs | kubernetes_sd_configs |
|---|---|---|---|---|
| 配置复杂度 | 低 | 中 | 中高 | 高 |
| 动态更新 | 需重启 | 自动重载 | 实时 | 实时 |
| 适用规模 | 小(<50) | 中(50-500) | 大(500-5000) | 超大(5000+) |
| 元数据丰富度 | 手动定义 | 手动定义 | Consul 标签+元数据 | K8s 资源标签+注解 |
| 依赖组件 | 无 | 文件系统 | Consul 集群 | K8s API |
| 典型场景 | 测试/边缘节点 | CMDB 导出 | 微服务注册中心 | 云原生容器平台 |
4.8 服务发现架构总览
下图展示了 Prometheus 采集作业平台中,四种服务发现方式如何将原始目标转化为带标签的抓取实例,并最终写入时间序列数据库。
4.9 本章小结
- 作业与实例 是 Prometheus 采集的基本单元,通过
job_name和instance标签唯一标识。 - 静态配置 适合小规模固定环境,文件发现 提供轻量级动态更新,Consul 发现 适用于微服务注册中心,Kubernetes 发现 是云原生场景的标准方案。
- 实例分组 的核心是
relabel_configs,通过元数据标签的转换与过滤实现灵活的目标分类。 - 选择服务发现方式时,需综合考虑 规模、动态性、元数据需求 和 运维成本。