Prometheus 服务发现:Consul 注册中心与 K8s 原生服务的整合

Prometheus 的服务发现机制支持多种来源,包括 Consul 注册中心和 Kubernetes 原生服务。以下是整合方案及实施步骤:


一、核心概念
  1. 服务发现原理
    Prometheus 通过定期扫描目标源(Consul/K8s API)获取动态变化的监控端点列表,无需手动配置 IP 列表。
    更新周期由 scrape_interval 控制,通常设为 $15\text{s} \sim 1\text{min}$。

  2. 数据流架构
    $$ \begin{array}{c} \text{Consul/K8s} \ \downarrow \ \text{Prometheus Server} \ \downarrow \ \text{Alertmanager + Grafana} \end{array} $$


二、Consul 服务发现配置

步骤:

  1. 注册服务到 Consul
    在服务启动时通过 HTTP API 注册元数据:

    curl -X PUT -d '{
      "ID": "node-exporter-01",
      "Name": "node-exporter",
      "Address": "192.168.1.10",
      "Port": 9100,
      "Tags": ["prod", "metrics"]
    }' http://consul-server:8500/v1/agent/service/register
    

  2. Prometheus 配置
    prometheus.yml 添加 Consul SD 作业:

    scrape_configs:
      - job_name: 'consul-services'
        consul_sd_configs:
          - server: 'consul-server:8500'
            services: ['node-exporter', 'redis']  # 指定发现的服务
        relabel_configs:
          - source_labels: [__meta_consul_tags]
            regex: .*prod.*
            action: keep  # 仅保留带 prod 标签的服务
    


三、Kubernetes 服务发现配置

支持三种模式:

  1. Node 模式
    发现所有 K8s 节点:

    - job_name: 'k8s-nodes'
      kubernetes_sd_configs:
        - role: node  # 发现集群节点
      relabel_configs:
        - replacement: '${1}:9100'
          source_labels: [__address__]
          regex: '(.*)'
    

  2. Pod 模式
    自动发现指定命名空间的 Pod:

    - job_name: 'k8s-pods'
      kubernetes_sd_configs:
        - role: pod
          namespaces:
            names: [monitoring]
      relabel_configs:
        - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
          regex: "true"
          action: keep  # 仅监控带注解的 Pod
    

  3. Service 模式
    通过 Service 发现后端端点:

    - job_name: 'k8s-services'
      kubernetes_sd_configs:
        - role: service
      metrics_path: /metrics
      scheme: https
    


四、整合方案

场景:混合环境(部分服务在 K8s,部分在 Consul)

scrape_configs:
  # Consul 发现
  - job_name: 'consul-apps'
    consul_sd_configs: [{server: 'consul:8500'}]
  
  # K8s 发现
  - job_name: 'k8s-apps'
    kubernetes_sd_configs: [{role: pod}]
  
  # 通用重标记规则
  relabel_configs:
    - source_labels: [__meta_consul_service]
      target_label: service_name
    - source_labels: [__meta_kubernetes_pod_name]
      target_label: pod_name


五、最佳实践
  1. 标签统一
    使用 relabel_configs 将不同来源的元数据转为统一标签,例如:

    • Consul 的 __meta_consul_service $\to$ service
    • K8s 的 __meta_kubernetes_namespace $\to$ namespace
  2. 动态配置
    通过模板生成配置:

    template: |
      global:
        scrape_interval: {{ .Values.interval }}
    

  3. 安全加固

    • Consul:启用 ACL 和 TLS
    • K8s:使用 ServiceAccount RBAC 权限控制

故障排查工具
访问 http://prometheus:9090/service-discovery 查看实时发现的端点列表

整合后架构可支撑 $10\text{k}$ 节点规模,服务变更 $5\text{s}$ 内生效,显著降低运维复杂度。

更多推荐