随着 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 进行查看

prom_filesd

基于 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 自动注册效果

prom_consulsd

基于 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: replace

deployment 中配置注解

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 和端口即可

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0