随着 Prom 监控的体量越来越大,每次加入新的监控指标接口,都要手动的在 prometheus.yml 文件中添加内容,每次还要重新加载,维护管理起来也是鸡肋的存在,Prom 有原生支持的监控服务发现
Prom 常见的服务发现分为以下 3 种:
基于文件的服务发现
基于 Consul 的服务发现
基于 Kubernetes 的服务发现
基于文件的服务发现
在 Prom 的配置文件中添加 file_sd_configs 字段配置
$ vim /opt/monitoring/prometheus/prometheus.yml
# 在 scrape_configs: 下添加
  - job_name: "file_sd"      # 名字可以写一个比较有规则性的
    file_sd_configs:  # 文件服务发现的配置
      - files: ['/opt/monitoring/prometheus/file_sd/*.yml']    # 指定通过哪个文件进行服务发现
        refresh_interval: 15s   # 每隔多长时间检测一遍文件,自动服务发现全靠这个配置
$ systemctl reload prometheus编写文件服务发现的内容
$ mkdir /opt/monitoring/prometheus/file_sd
$ cat > /opt/monitoring/prometheus/file_sd/node.yml << EOF
- targets: ['192.168.1.11:9100', '192.168.1.12:9100', '192.168.1.13:9100']
EOF这种模式我感觉像 ansible 的 playbook 的 task 一样,写一个 main.yml ,剩下的使用 include 的形式。
等待检测文件时长后,进入 prom 的 url 进行查看

基于 Consul 的服务发现
通过使用文件的服务发现可以感觉到,其实只是省去了加载文件的繁琐,手动录入并没有减少多少工作量。
Consul 是个分布式的服务发现和 key/value 存储系统
Prometheus 是通过 Consul 来获取被监控端的 Exporter 的监控数据的,每新起一个服务就会通过配置自动注册到 Consul 中供 Prom 使用
Consul 我不太熟,自己悄悄拿 helm 部署了一个。二进制的部署方式可以参考:Consul 微服务注册
配置 Consul API 到 Exporter 中,自动注册到 Consul
curl -X PUT -d '{"id": "k8s-01","name": "k8s","address": "192.168.1.11","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.1.11:9100","interval": "5s"}]}' http://192.168.1.11:32427/v1/agent/service/register
# "name": "k8s"    分组
# "id": "k8s-01"   组内主机名
curl -X PUT -d '{"id": "k8s-02","name": "k8s","address": "192.168.1.12","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.1.12:9100","interval": "5s"}]}' http://192.168.1.11:32427/v1/agent/service/register
curl -X PUT -d '{"id": "k8s-03","name": "k8s","address": "192.168.1.13","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.1.13:9100","interval": "5s"}]}' http://192.168.1.11:32427/v1/agent/service/register在 Prom 的配置文件中添加 consul_sd_configs 字段配置
$ vim /opt/monitoring/prometheus/prometheus.yml
# 在 scrape_configs: 下添加           
  - job_name: "consul_sd"
    consul_sd_configs:
      - server: 192.168.1.11:32427    # Consul地址
        services: ['k8s']             # Consul 服务组
$ systemctl reload prometheus查看 Prom 界面的 Consul 自动注册效果

基于 Kubernetes 的服务发现
prom 配置
- job_name: 'xxx'
  kubernetes_sd_configs:
  - role: pod    # 自动注册到prom的k8s资源
    namespaces:
      names:
        - prod   # 指定命名空间的pod进行自动注册
  relabel_configs:
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]   # 识别pod中的注解,用作自动注册
      action: keep
      regex: "true"
    - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]     # 识别pod中的注解,用作自动注册
      action: replace
      target_label: __metrics_path__
      regex: (.+)
    - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]  # 识别pod中的注解,用作自动注册
      action: replace
      target_label: __address__
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
    # 以下的label则是一些基于k8s的指标lable
    - source_labels: [__meta_kubernetes_pod_name]
      separator: ;
      regex: (.+)
      target_label: pod_name
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_namespace]
      separator: ;
      regex: (.+)
      target_label: namespace
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_pod_label_app]
      separator: ;
      regex: (.+)
      target_label: app
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_pod_label_version]
      separator: ;
      regex: (.+)
      target_label: version
      replacement: $1
      action: replacedeployment 中配置注解
spec:
  template:
    metadata:
      annotations:
        # 以下三项就是上面prom配置中需要识别的内容
        prometheus.io/path: /actuator/prometheus         # 获取指标的uri路径
        prometheus.io/port: '9095'                       # 指标暴露的端口
        prometheus.io/scrape: 'true'                     # 是否开启prom自动注册pod 中配置注解
metadata:
  annotations:
    prometheus.io/path: /actuator/prometheus
    prometheus.io/port: '9095'
    prometheus.io/scrape: 'true'配置好重启 prom 即可
自动化监控思路
当有大量服务器需要进行自动化监控,首先需要使用自动化工具批量部署相关 exporter,将部署好的 exporter 所在机器的 ip 和 端口注册到 Consul,Prom 从 Consul 获取 exporter 的 ip 和端口即可
 
          
          
          
         
    
    
    
   
       
            
               
            
           
          
         
          
         
          
        