Prometheus & Cadvisor & Node Exporter 节点监控利器

前言

Prometheus 作为时序数据库保存数据,Agent 采集数据。Agent 会暴露一个 http 地址出来,然后在 Prometheus 里面配置,会定期去指定的地址拉去数据(pull 模式)

在这之后,用户使用 Grafana 查看的时候,就会自动从 Prometheus 中查询数据

一般 Prometheus 的 Agent 叫做 Exporter

Prometheus

安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
services:
  prometheus:
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    image: prom/prometheus
    extra_hosts:
      - host.docker.internal:host-gateway

volumes:
  prometheus-data:

这里暴露的端口,是向外提供服务的端口,也就 Grafana 导入数据时需要的端口

为了可以访问主机的端口,所以添加了这一条。在容器中访问 host.docker.internal 即可访问主机

1
2
    extra_hosts:
      - host.docker.internal:host-gateway

配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

这便是 Prometheus 的默认配置,粘贴过去即可,里面自带一个自身的数据监控

如果要添加监控配置的话,就在最下面 scrape_configs 这里添加配置就行了

Cadvisor

监控容器的各项指标

安装

参考文档

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
services:
  cadvisor:
    image: gcr.m.daocloud.io/cadvisor/cadvisor:v0.49.1
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    ports:
      - 8080:8080
    container_name: cadvisor
    privileged: true
    devices:
      - /dev/kmsg

配置

1
2
3
4

  - job_name: cadvisor
    static_configs:
      - targets: ["host.docker.internal:8080"]

把这段配置复制到 Prometheus 的配置文件的 scrape_configs 项里面就行了

检查数据是否可用之后,就可以在 Grafana 里面添加面板

我用的是这个,Cadvisor exporter,导入之后直接可以用,非常方便

Node Exporter

监控节点的信息

安装

参考 官方文档

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - "--path.rootfs=/host"
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - "/:/host:ro,rslave"

官方没有使用端口映射,实际暴露的端口是 9100

配置

1
2
3
4

  - job_name: "node"
    static_configs:
      - targets: ["host.docker.internal:9100"]

面板用这个,官方的 Node Exporter Full

Process Exporter

新增,类似于 Node Exporter,用于监控主机上面的进程

官方文档使用的配置文件,文档没说用命令行参数,所以这里也使用配置文件

本来想用点骚操作,像前面的 Grafana 那样子,改 entrypoint,然后里面用sh -euc,手动在运行之前把配置文件写进去。但是,不行,因为这镜像是 FROM scratch 的,根本没有 shell 环境

比较好一点的解决方法应该是写一个 Dockerfile,把配置文件 COPY 进去,但是也觉得麻烦了,所以还是直接文件挂载了,反正都是在 git 仓库里面的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  process-exporter:
    image: ncabatoff/process-exporter:sha-e2a9f0d
    ports:
      - 9256:9256
    privileged: true
    volumes:
      - /proc:/host/proc
      - ./process-exporter.yaml:/config/config.yml
    command: --procfs /host/proc -config.path /config/config.yml

配置文件用的这个,懒得选择,就全部都监控了吧

1
2
3
4
process_names:
  - name: "{{.Comm}}"
    cmdline:
      - ".+"

同样的,在 Prometheus 里面配置

1
2
3
  - job_name: process-exporter
    static_configs:
      - targets: ["host.docker.internal:9256"]

Tips

检查 Prometheus 配置是否正确

进入 Prometheus 的后台,查询 up,即可查询所有配置,行尾的数字代表 job 是否在线

image.png

添加多个 Exporter

不需要新增 job,只需要添加 Target 就行了

还是建议添加多个 job,面板应该要能够分别出来的

1
2
3
4
  ~~- job_name: "node"
    static_configs:
      - targets: ["host.docker.internal:9100"]
      - targets: ["host.docker.internal:9101"]  # New Node Exporter~~