3. 服务发现机制:基于文件、Kubernetes 与 Consul

在 Prometheus 监控体系中,服务发现(Service Discovery, SD) 是控制平面通信的起点。Prometheus Server 通过服务发现动态获取目标(Target)的端点列表,替代了静态配置中逐个写入 targets 的方式。本章深入剖析三种主流服务发现机制:基于文件、基于 Kubernetes 和 基于 Consul,涵盖原理、配置、适用场景及故障排查要点。

核心原则:服务发现的目标是让 Prometheus 自动感知监控目标的增、删、变,无需重启服务或手动修改配置文件。选择哪种 SD 机制取决于基础设施的编排方式与运维成熟度。

3.1 基于文件的服务发现(File SD)

基于文件的服务发现是最简单、最通用的方式。Prometheus 定期扫描指定路径下的 YAML 或 JSON 文件,从中读取目标列表。文件可由外部系统(如 CMDB、脚本、配置管理工具)生成。

工作原理

  • Prometheus 根据 file_sd_config 中定义的 files 路径模式(支持 glob)监控文件变更。
  • 默认每 5 分钟 重新读取一次文件(可通过 refresh_interval 调整)。
  • 文件内容必须包含 targets 列表和可选的 labels 映射。

配置示例

# prometheus.yml
scrape_configs:
  - job_name: 'node-exporter'
    file_sd_configs:
      - files:
          - '/etc/prometheus/targets/*.json'
        refresh_interval: 30s

目标文件示例(/etc/prometheus/targets/nodes.json):

[
  {
    "targets": ["192.168.1.10:9100", "192.168.1.11:9100"],
    "labels": {
      "env": "production",
      "region": "us-east-1"
    }
  },
  {
    "targets": ["192.168.1.20:9100"],
    "labels": {
      "env": "staging",
      "region": "us-west-2"
    }
  }
]

适用场景与限制

维度 说明
优势 实现简单,不依赖外部注册中心;适合传统 VM 环境或临时目标;文件可由任意脚本生成。
劣势 实时性较差(依赖刷新间隔);大规模场景下文件管理复杂;无自动去重与健康检查。
典型场景 混合云环境、非容器化基础设施、与 Ansible/Terraform 集成。
故障排查要点:如果目标未出现,首先检查文件路径是否正确、Prometheus 是否有读权限;其次确认 JSON/YAML 格式无误(可使用 python3 -m json.tool 验证);最后查看 Prometheus 日志中是否有 file_sd 相关的错误信息。

3.2 基于 Kubernetes 的服务发现(K8s SD)

Kubernetes 服务发现是 Prometheus 在容器化环境中的核心能力。Prometheus 通过 Kubernetes API 实时监听 Pod、Service、Endpoint、Node 等资源的变更,自动生成抓取目标。

发现模式与角色

Prometheus 支持多种 Kubernetes 角色(role),每种角色对应不同的资源类型和标签注入方式:

角色(role) 发现目标 常用标签
pod 所有 Pod 的 IP + 端口(需注解或端口名) __meta_kubernetes_pod_*
service Service 的 Cluster IP + 端口 __meta_kubernetes_service_*
endpoints Endpoint 的 Pod IP + 端口(最常用) __meta_kubernetes_endpoint_*
node 集群节点的 IP + kubelet 端口 __meta_kubernetes_node_*
ingress Ingress 的域名与 TLS 配置 __meta_kubernetes_ingress_*

配置示例(基于 Endpoints 发现)

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: endpoints
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__
关键机制:Prometheus 通过 relabel_configs 过滤和重写标签。上例中,只抓取带有 prometheus.io/scrape: "true" 注解的 Pod,并动态设置抓取端口和路径。这是生产环境中最标准的 Pod 监控模式。

Kubernetes SD 通信流程(SVG)

Kubernetes 服务发现通信流程 Prometheus Server K8s API Server Watch / List Pod / Endpoint Service / Node 目标 Pod:9100 目标 Pod:9101 Prometheus 直接抓取 /metrics 说明:Prometheus 通过 K8s API 获取目标列表,然后直接与 Pod IP 通信抓取指标

3.3 基于 Consul 的服务发现(Consul SD)

Consul 是 HashiCorp 推出的服务网格与注册中心。Prometheus 通过 Consul HTTP API 查询健康服务实例,自动生成抓取目标。Consul SD 特别适合微服务架构中服务注册与监控的联动。

工作原理

  • Prometheus 向 Consul Agent 的 /v1/catalog/services 和 /v1/health/service/<service_name> 发起查询。
  • 默认只返回 通过健康检查 的服务实例(可通过 allow_stale 和 tag_separator 调整)。
  • 每个服务实例的标签(如 dc、version)会自动注入为 Prometheus 标签。

配置示例

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: job
      - source_labels: [__meta_consul_node]
        target_label: instance
      - source_labels: [__meta_consul_tags]
        target_label: tags

Consul SD 与 K8s SD 对比

对比维度 Consul SD Kubernetes SD
注册方式 服务主动注册到 Consul Agent K8s API 自动管理 Pod/Service 状态
健康检查 Consul 内置 TTL/HTTP/脚本检查 依赖 K8s 就绪探针与存活探针
网络模型 支持多数据中心、跨网络 原生支持集群内,跨集群需额外配置
标签丰富度 服务元数据、节点信息、标签 Pod 标签、注解、命名空间、节点信息
适用环境 混合云、非 K8s 微服务、传统架构 Kubernetes 原生环境

Consul SD 架构图(SVG)

Consul 服务发现架构 Prometheus Consul Agent /v1/health/service/ 服务目录 / 健康状态 Web 实例 :8080 API 实例 :9090 Prometheus 直接抓取 /metrics 说明:服务实例向 Consul Agent 注册,Prometheus 查询健康服务列表后直接抓取 Consul 负责服务注册与健康检查,Prometheus 负责指标采集,职责分离

3.4 三种服务发现机制对比总结

特性 File SD Kubernetes SD Consul SD
实时性 低(依赖刷新间隔) 高(Watch 机制) 中(轮询间隔可调)
配置复杂度 低 高(需 RBAC、relabel) 中
外部依赖 无 K8s API Server Consul 集群
健康检查集成 无 K8s 探针 Consul 健康检查
大规模扩展性 差 优秀 良好
推荐场景 传统 VM、临时目标 Kubernetes 原生 微服务、多数据中心
选型建议:如果基础设施已运行在 Kubernetes 上,优先使用 K8s SD;如果使用 Consul 作为服务注册中心,Consul SD 是最自然的集成方式;File SD 适合作为兜底方案或非容器化环境的快速接入。