Prometheus 服务发现核心是动态感知目标变化而非静态配置,常用方式包括:文件发现(file_sd_configs)、Consul 发现(consul_sd_configs)、Kubernetes 发现(kubernetes_sd_configs),以及 DNS、云平台等其他方式。

Prometheus 配置服务发现自动发现新节点,核心在于放弃静态写死 target,改用动态机制实时感知目标变化。不需要每次加机器就改配置、重载服务,关键是要让 Prometheus 主动从外部源“读取”当前可用的监控目标列表。
下面分几种常用且实用的方式说明:
基于文件的服务发现(file_sd_configs)
适合中小规模、无统一注册中心但希望脱离静态配置的场景,部署简单、不依赖额外组件。
- 在
prometheus.yml的scrape_configs中定义 job 时,用file_sd_configs替代static_configs - 指定一个或多个 YAML/JSON 文件路径,例如:
- job_name: "node-exporter" file_sd_configs: - files: - "/etc/prometheus/targets/nodes.yaml" refresh_interval: 30s - 文件内容示例(YAML):
- targets: ["192.168.1.10:9100", "192.168.1.11:9100"] labels: env: "prod" role: "backend" - Prometheus 每隔
refresh_interval自动读取文件,发现增删改后立即生效,无需 reload
注意:文件需由运维脚本、Ansible 或 CI/CD 流程自动更新,比如新增服务器后自动追加 IP 到
nodes.yaml
基于 Consul 的服务发现(consul_sd_configs)
适合微服务、容器化环境,服务启动即注册,下线即剔除,天然支持健康检查。
- 确保 Consul 集群已运行,并有服务注册(如 node-exporter 以 service 形式注册)
- 在 Prometheus 配置中添加:
- job_name: "consul-services" consul_sd_configs: - server: "192.168.1.20:8500" token: "" # 如启用了 ACL,填对应 token scheme: "http" datacenter: "dc1" relabel_configs: - source_labels: [__meta_consul_service] target_label: job - source_labels: [__meta_consul_node] target_label: instance - source_labels: [__meta_consul_service_address, __meta_consul_service_port] separator: ":" target_label: __address__ - Prometheus 定期调用 Consul Catalog API 获取服务列表,自动过滤掉不健康实例
提示:注册服务时建议打上
tags或meta,后续可通过relabel_configs过滤或分类,比如只抓tag=monitoring的服务
基于 Kubernetes 的服务发现(kubernetes_sd_configs)
K8s 场景下最自然的选择,直接监听 API Server,自动发现 Pod、Service、Endpoints、Node 等资源。
- 示例:自动发现所有带
prometheus.io/scrape=true注解的 Pod- job_name: "kubernetes-pods" kubernetes_sd_configs: - role: pod 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: [__meta_kubernetes_pod_annotation_prometheus_io_port] action: replace target_label: __address__ regex: (.+) replacement: ${1}:${2} separator: ":" - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] action: replace regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 target_label: __address__ - 不需要手动注册,只要 Pod 启动并带正确注解,几秒内就会出现在 Targets 页面
补充:
role可选node/service/endpoints/pod/ingress,配合relabel_configs能精准控制采集范围
其他可选方式
- DNS 服务发现(dns_sd_configs):适用于固定域名指向动态 IP 的场景(如负载均衡器、云厂商 SLB),通过 DNS SRV 或 A 记录发现 target
- EC2/Azure/GCP 等云平台 SD:直接对接云厂商元数据服务,自动发现虚拟机实例,适合传统 IaaS 架构
自动发现不是“开箱即用”,它依赖你把目标信息按约定格式“发布”出去——要么写进文件,要么注册到 Consul,要么跑在 K8s 里带标签。Prometheus 只负责“看”,不负责“管”。所以真正让新节点被发现的,是你的注册动作是否及时、规范、自动化。


















