2025-04-05  2025-04-06    1941 字  4 分钟

各类探针工具能采集的数据还是太少了, 保存时间也不够长. 所以用Prometheus搭建一个用于监控各个服务器状态的平台

为了方便兼容各个场景, pushgateway和alertmanager也一起搭建

这些服务中, 除了node-exporter外, 其余都通过Docker搭建, 方便备份和迁移

搭建node-exporter

因为考虑到并不是所有的机器都会安装docker, 所以node-exporter并没有通过docker的方式搭建

首先需要创建一个目录, 作为node-exporter的所有依赖和可执行程序的存放位置, 例如/path/to/exporter

我们在这个目录创建三个文件夹, 分别为data, exec, src.

下载

src目录下创建一个脚本用于从官方git上下载二进制文件. 这个脚本会自动获取最新的版本, 然后解压, 并将二进制文件移动到exec目录中

 1#!/bin/bash
 2
 3TEMP=".temp"
 4REPO="prometheus/node_exporter"
 5
 6rm -rf "${TEMP}"
 7mkdir "${TEMP}"
 8cd "${TEMP}"
 9
10tag=$(wget -qO- -t1 -T2 "https://api.github.com/repos/${REPO}/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
11
12if [[ -z $tag ]]; then
13    echo "empty tag"
14    exit 0
15fi
16
17arch=$(uname -m)
18
19if [[ $arch =~ "x86_64" ]];then
20    arch="amd64"
21elif [[ $arch =~ "aarch64" ]];then
22    arch="arm64"
23else
24    echo "unknown arch!!"
25    exit 0
26fi
27
28TGZPATH="node_exporter-${tag:1}.linux-${arch}"
29TGZFILE="${TGZPATH}.tar.gz"
30
31wget https://github.com/${REPO}/releases/download/${tag}/${TGZFILE}
32
33tar -zxvf ${TGZFILE}
34chown root:root ${TGZPATH}/node_exporter
35mv ${TGZPATH}/node_exporter ../../exec/wind
36
37cd ..
38rm -rf ${TEMP}
39echo "Updated ${tag}"

我们在src目录执行这个脚本后, 可执行程序就会被下载到exec目录下

安装

这时我们回到/path/to/exporter编写node-exporter的service文件

  • --web.listen-address=:9100 是监听的端口
  • --collector.systemd 额外采集的数据
  • --collector.processes 额外采集的数据
  • --collector.netdev.device-exclude="^(veth.*|br-.*|docker0|cali.*|flannel.*)$" 忽略掉docker等产生的虚拟网口

首先是服务脚本node-exporter.service

 1[Unit]
 2Description=wind
 3After=network.target auditd.service
 4ConditionFileIsExecutable=/path/to/exporter/exec/wind
 5
 6[Service]
 7User=root
 8StartLimitInterval=5
 9StartLimitBurst=10
10ExecStart=/path/to/exporter/exec/wind --web.listen-address=:9100 --collector.systemd --collector.processes --collector.netdev.device-exclude="^(veth.*|br-.*|docker0|cali.*|flannel.*)$"
11WorkingDirectory=/path/to/exporter/data
12Restart=always
13RestartSec=15
14LimitNPROC=32768
15LimitNOFILE=1048576
16# CAP_NET_ADMIN:允许执行网络管理任务
17# CAP_NET_BIND_SERVICE:允许绑定到小于1024的端口
18CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
19AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
20
21[Install]
22WantedBy=multi-user.target

然后是安装脚本install.sh, 这个脚本会自动将node-exporter.service移动到systemd的目录, 然后启动服务

 1#!/bin/bash
 2
 3NAME="node-exporter.service"
 4
 5DIR="/etc/systemd/system"
 6TARGET="${DIR}/${NAME}"
 7
 8if [ ! -f "$NAME" ]; then
 9  echo "$NAME not exist"
10  exit 0
11fi
12
13if [ -f "$TARGET" ]; then
14  echo "Stop"
15  systemctl stop ${NAME}
16  echo "Disable"
17  systemctl disable ${NAME}
18fi
19
20echo "Copy"
21cp ${NAME} ${TARGET}
22ls -Alh ${TARGET}
23systemctl daemon-reload
24
25echo "Enable"
26systemctl enable ${NAME}
27
28echo "Restart"
29systemctl restart ${NAME}
30sleep 1
31systemctl status ${NAME}
32
33echo ""
34echo "Install ${NAME}"
35
36exit 0

这时运行install.sh就会安装并运行了

搭建Prometheus + Grafana + pushgateway + alertmanager

这些服务我们将使用docker进行部署, 我们为其分配的工作目录为/path/to/docker/monitor

进入这个目录后, 我们创建docker-compose.yaml文件.

根据需要可以自行修改配置, 比如每个服务的数据和配置文件的路径, 我们编辑好后还需要在一些路径下手动创建文件

配置中我选择保留730天的历史, 你可以自行修改的更短一些

 1services:
 2  prometheus:
 3    image: prom/prometheus
 4    user: root
 5    restart: always
 6    ports:
 7      - "9090:9090"
 8    volumes:
 9      - /path/to/docker/monitor/data/prometheus/config:/etc/prometheus
10      - /path/to/docker/monitor/data/prometheus/data:/prometheus
11    command:
12      - '--config.file=/etc/prometheus/prometheus.yml'
13      - '--storage.tsdb.path=/prometheus'
14      - '--storage.tsdb.retention.time=730d'
15      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
16      - '--web.console.templates=/usr/share/prometheus/consoles'
17
18  grafana:
19    image: grafana/grafana
20    user: root
21    restart: always
22    ports:
23      - "3000:3000"
24    volumes:
25      - /path/to/docker/monitor/data/grafana/config:/etc/grafana
26      - /path/to/docker/monitor/data/grafana/data:/var/lib/grafana
27    depends_on:
28      - prometheus
29
30  pushgateway:
31    image: prom/pushgateway
32    user: root
33    restart: always
34    ports:
35      - "9091:9091"
36    volumes:
37      - /path/to/docker/monitor/data/pushgateway/data:/var/lib/pushgateway
38
39  alertmanager:
40    image: prom/alertmanager
41    hostname: alertmanager
42    user: root
43    restart: always
44    ports:
45      - "9093:9093"
46    volumes:
47      - /path/to/docker/monitor/data/alertmanager/data:/var/lib/alertmanage

Prometheus配置

编辑好docker-compose.yaml还不能直接运行, 还需要准备好配置文件

1mkdir -p data/prometheus/config
2vim data/prometheus/config/prometheus.yml

这是Prometheus的配置文件

 1global:
 2  scrape_interval:     2s # 抓取间隔
 3  scrape_timeout:      2s # 抓取超时时间, 不能大于scrape_interval
 4  evaluation_interval: 5s
 5  external_labels:
 6      monitor: 'dashboard'
 7
 8alerting:
 9 alertmanagers:
10 - static_configs:
11    - targets:
12        - "alertmanager:9093"
13
14rule_files:
15  #- 'alert.rules'
16
17scrape_configs:
18  - job_name: 'prometheus'
19    static_configs:
20      - targets: ['prometheus:9090']
21        labels:
22          instance: 'prometheus'
23  - job_name: 'gate'
24    static_configs:
25      - targets: ['pushgateway:9091']
26    honor_labels: true
27  - job_name: 'mynodes'
28    static_configs:
29      - targets: ['node1.domain.com:9100']
30        labels:
31          instance: 'node1'
32      - targets: ['node2.domain.com:9100']
33        labels:
34          instance: 'node2'

Grafana 配置

1mkdir -p data/grafana/config
2vim data/grafana/config/grafana.ini

这是Grafana的配置文件, 配置了用户名和密码

1[security]
2admin_user = username
3admin_password = password
4
5[auth.anonymous]
6enabled=false

运行

运行前需要注意

  • prometheus的服务的web是没有登录验证的, 如果想自己能访问, 但不允许外人访问, 需要自行考虑通过nginx或caddy添加basicauth方式验证
  • 如果开启了防火墙, 注意允许docker的IP段访问自身node-exporter监听的端口

准备好后, 我们就可以docker compose -p prometheus up -d启动这个服务了

Grafana展示

首先我们需要登录然后进行一些配置

添加数据源

我们使用的数据源也就是刚刚配置的prometheus

点击左侧的Connections->Data sources, 然后点击右上角Add new data source, 选择Prometheus

  • Prometheus server URL *处填写http://prometheus:9090
  • Scrape interval处填写4s, 因为我们配置的prometheus抓取频率很高, 如果使用默认的15s就无法展示出高频率抓取的效果

然后保存即可

添加面板

这里我推荐面板ID1860, 也就是Node Exporter Full, 这个展示了node-exporter的所有信息

安装这个面板也很简单, 点击左侧的Dashboards, 然后点击右上角New->Import

然后在输入框填入1860, 点击Load并保存即可

这样我们的面板就添加好了

除另有声明外本博客文章均采用 知识共享 (Creative Commons) 署名 4.0 国际许可协议 进行许可转载请注明原作者与文章出处