各类探针工具能采集的数据还是太少了, 保存时间也不够长. 所以用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 国际许可协议 进行许可。转载请注明原作者与文章出处。