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 标签附加到所有时间序列上,便于后续的查询聚合与告警路由。

最佳实践: 静态配置适用于测试环境、边缘节点或无法运行服务发现代理的遗留系统。对于超过 50 个目标的环境,建议迁移至动态发现。

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
注意: 文件发现不会自动清理已删除的目标。若目标从文件中移除,Prometheus 会在下一个抓取周期将其标记为 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_* 服务元数据中的自定义键值对
分组技巧: 利用 Consul 的 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 控制器指标
生产建议: 在大型 Kubernetes 集群中,建议为每个角色创建独立的作业,并配合 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 采集作业平台中,四种服务发现方式如何将原始目标转化为带标签的抓取实例,并最终写入时间序列数据库。

Prometheus 服务发现架构图 Prometheus 服务发现与实例分组架构 static_configs file_sd_configs consul_sd_configs kubernetes_sd_configs relabel_configs 标签转换与过滤 • 保留/丢弃目标 • 映射元数据标签 • 设置静态标签 • 修改抓取地址 • 正则替换 • 哈希分片 抓取实例池 带标签的目标列表 instance="10.0.0.1:9100" job="node_exporter" group="web" env="production" region="us-east-1" app="nginx" 时间序列数据库(TSDB)

4.9 本章小结

  • 作业与实例 是 Prometheus 采集的基本单元,通过 job_name 和 instance 标签唯一标识。
  • 静态配置 适合小规模固定环境,文件发现 提供轻量级动态更新,Consul 发现 适用于微服务注册中心,Kubernetes 发现 是云原生场景的标准方案。
  • 实例分组 的核心是 relabel_configs,通过元数据标签的转换与过滤实现灵活的目标分类。
  • 选择服务发现方式时,需综合考虑 规模、动态性、元数据需求 和 运维成本。