Prometheus 服务发现机制详解与配置指南

Prometheus 提供了多种服务发现机制,用于动态发现和监控目标,特别适合在云原生和容器化环境中使用。以下是各种服务发现方式的详细配置方法。

一、静态配置(static_configs)

静态配置是最基础的服务发现方式,适用于目标地址固定不变的场景。

基础配置示例

scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
      - targets:
          - '192.168.1.100:9100'
          - '192.168.1.101:9100'
        labels:
          env: 'production'
          group: 'servers'
      - targets:
          - '192.168.1.102:9100'
        labels:
          env: 'staging'
          group: 'servers'

适用场景:物理机、固定虚拟机、少量Kubernetes服务等目标地址固定的环境。

二、基于文件的服务发现(file_sd_configs)

通过定期读取文件来发现监控目标,适合与配置管理工具(如Ansible)集成。

配置方法

scrape_configs:
  - job_name: 'file-sd-nodes'
    file_sd_configs:
      - files:
          - '/etc/prometheus/targets/nodes-*.yaml'
          - '/etc/prometheus/targets/nodes-*.json'
        refresh_interval: 30s  # 默认5分钟

文件格式示例

YAML格式

- targets:
    - '192.168.1.100:9100'
    - '192.168.1.101:9100'
  labels:
    env: 'production'
    group: 'servers'

JSON格式

[
  {
    "targets": ["192.168.1.100:9100", "192.168.1.101:9100"],
    "labels": {
      "env": "production",
      "group": "servers"
    }
  }
]

优势:无需重启Prometheus即可动态更新监控目标,适合中小规模环境。

三、基于Consul的服务发现(consul_sd_configs)

Consul是HashiCorp开发的服务发现和配置管理工具,Prometheus可以通过Consul自动发现服务。

基础配置

scrape_configs:
  - job_name: 'consul-services'
    consul_sd_configs:
      - server: 'consul-server:8500'
        services: ['node-exporter', 'redis']
        tags: ['production']

高级配置示例

scrape_configs:
  - job_name: 'consul-sd'
    consul_sd_configs:
      - server: 'consul-server:8500'
        datacenter: 'dc1'
        token: 'your-consul-token'
    relabel_configs:
      # 只监控健康状态为passing的服务
      - source_labels: [__meta_consul_health]
        regex: 'passing'
        action: keep
      # 提取服务名称作为instance标签
      - source_labels: [__meta_consul_service]
        target_label: instance
      # 添加环境标签
      - source_labels: [__meta_consul_node]
        regex: '(.*)-prod'
        replacement: 'prod'
        target_label: env

多数据中心支持

consul_sd_configs:
  - server: 'dc1-consul:8500'
    datacenter: 'dc1'
  - server: 'dc2-consul:8500'
    datacenter: 'dc2'

适用场景:微服务架构、多数据中心环境。

四、基于Kubernetes的服务发现(kubernetes_sd_configs)

这是Prometheus在Kubernetes环境中最常用的服务发现方式,支持多种角色类型。

基础配置

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
        namespaces:
          names: ['default', 'monitoring']
    relabel_configs:
      # 只监控带有prometheus.io/scrape=true注解的Pod
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      # 使用注解中的端口覆盖默认端口
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
        target_label: __address__
        replacement: '$1:9100'

支持的角色类型

角色 说明
pod 监控Pod容器
service 监控Service
endpoints 监控Service的Endpoint
node 监控Kubernetes节点
ingress 监控Ingress

完整示例

scrape_configs:
  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
      - role: node
    relabel_configs:
      - source_labels: [__meta_kubernetes_node_name]
        target_label: instance

  - job_name: 'kubernetes-services'
    kubernetes_sd_configs:
      - role: service
    relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true

  - job_name: 'kubernetes-endpoints'
    kubernetes_sd_configs:
      - role: endpoints
    relabel_configs:
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind]
        action: keep
        regex: Pod
      - source_labels: [__meta_kubernetes_endpoint_address_target_name]
        target_label: pod

RBAC权限配置

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus-k8s
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  - nodes/proxy
  verbs:
  - get
  - list
  - watch

适用场景:Kubernetes集群环境,需要自动发现动态变化的Pod、Service等资源。

五、基于DNS的服务发现(dns_sd_configs)

通过DNS查询发现监控目标,支持A记录和SRV记录两种方式。

A记录发现

scrape_configs:
  - job_name: 'dns-a'
    dns_sd_configs:
      - names:
          - 'node1.example.com'
          - 'node2.example.com'
        type: A
        port: 9100

SRV记录发现

scrape_configs:
  - job_name: 'dns-srv'
    dns_sd_configs:
      - names:
          - '_prometheus._tcp.example.com'
        type: SRV

SRV记录格式_service._protocol.domain,例如 _node-exporter._tcp.monitoring.svc.cluster.local

六、Prometheus Operator的ServiceMonitor

在Kubernetes环境中,Prometheus Operator提供了更便捷的配置方式。

ServiceMonitor配置示例

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app
  namespace: monitoring
  labels:
    release: prometheus
spec:
  namespaceSelector:
    matchNames:
      - default
      - my-app
  selector:
    matchLabels:
      app: my-app
  endpoints:
    - port: metrics
      path: /metrics
      interval: 30s
      honorLabels: true

优势:声明式配置,自动发现Service,无需手动维护Prometheus配置文件。

七、最佳实践建议

  1. 标签管理:合理使用标签进行目标分类和过滤
  2. 重标记配置:利用relabel_configs进行标签重写和过滤
  3. 性能优化:根据集群规模调整refresh_interval
  4. 安全配置:使用token进行认证,配置RBAC权限
  5. 多环境支持:支持多数据中心、混合云环境

通过合理选择服务发现机制,可以构建灵活、高效的监控体系,适应各种复杂环境的需求。

作者:严锋  创建时间:2025-12-21 19:52
最后编辑:严锋  更新时间:2025-12-25 10:39