前言
去年升级 Grafana 监控面板的适合,发现 Gemini 等 AI 也具有书写监控 Dashboard 的能力了,于是在本次重构中,彻底放弃从 2019 年使用至今的 Zabbix,转而使用 Prometheus + Grafana 监控不止业务数据、还包括服务器状态等指标。
方案概述
- 使用 Docker 启动
Prometheus - 使用 Docker 启动
Grafana - 在需要监控的服务器上安装
Node Exporter - 配置
Prometheus定时拉取Node Exporter的数据 - 在
Grafana中创建 Dashboard 展示监控数据
操作步骤
一、使用 Docker 启动 Prometheus
安装 Docker 参考:Ubuntu 20.04 从官方源安装最新的 Docker
这里我使用 docker compose 来进行配置和启动:
# 目录为 /opt/prometheus
mkdir -vp /opt/prometheus
# 创建数据目录并设置权限
mkdir -vp /opt/prometheus/data
chown -R 65534:65534 /opt/prometheus/data
chmod -R 755 /opt/prometheus/data
# 创建 docker-compose.yml 文件
cd /opt/prometheus
nano docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:v3
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./data:/prometheus
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
- --storage.tsdb.retention.time=180d
- --storage.tsdb.retention.size=50GB
- --web.enable-lifecycle
关于参数:
--config.file=/etc/prometheus/prometheus.yml:指定Prometheus的配置文件路径,同时搭配volumes将本地的prometheus.yml文件挂载到容器中并设置为只读,确保配置文件的安全性。--storage.tsdb.path=/prometheus:指定Prometheus存储数据的路径,这里将容器内的/prometheus目录挂载到主机的./data目录,确保数据持久化。--storage.tsdb.retention.time=180d:数据保留时间为 180 天。--storage.tsdb.retention.size=50GB:数据保留大小为 50GB。--web.enable-lifecycle:启用Prometheus的生命周期管理接口,允许在运行时重新加载配置文件。
在启动前,还需要创建 prometheus.yml 配置文件:
cd /opt/prometheus
nano prometheus.yml
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets:
- 'localhost:9090'
这里的配置定义了全局抓取间隔、超时时间和评估间隔。
并且还配置了一个抓取Prometheus自身指标的 job,目标是localhost:9090。
接着启动:
docker compose up -d
访问 http://<服务器IP>:9090,如果看到 Prometheus 的界面,说明 Prometheus 已经成功启动了。
也可以直接
curl来测试:curl http://localhost:9090/metrics
二、使用 Docker 启动 Grafana
同样使用 docker compose 来配置和启动 Grafana:
# 目录为 /opt/grafana
mkdir -vp /opt/grafana
cd /opt/grafana
# 创建数据目录并设置权限
mkdir -vp /opt/grafana/data
chown -R 472:472 /opt/grafana/data
chmod -R 755 /opt/grafana/data
# 创建 docker-compose.yml 文件
nano docker-compose.yml
version: '3.8'
services:
grafana:
image: grafana/grafana:12.4
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- /opt/grafana/data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: change-this-password
GF_USERS_ALLOW_SIGN_UP: "false"
GF_AUTH_ANONYMOUS_ENABLED: "false"
GF_SERVER_DOMAIN: grafana.example.com
GF_SERVER_ROOT_URL: https://grafana.example.com
参数都是比较常规的,主要是设置了管理员账号和密码,并且禁用了用户注册和匿名访问。
启动 Grafana:
docker compose up -d
访问 http://<服务器IP>:3000,使用之前设置的管理员账号登录。
也可以直接
curl来测试:curl http://localhost:3000/api/health
三、在需要监控的服务器上安装 Node Exporter
首先下载并解压 Node Exporter,发布页:Node Exporter Releases
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz
tar -xzf node_exporter-1.10.2.linux-amd64.tar.gz
cp node_exporter-1.10.2.linux-amd64/node_exporter /usr/local/bin/
chmod 0755 /usr/local/bin/node_exporter
由于我的
Node Exporter接口将直接暴露在公网,所以需要添加认证信息。
这些步骤都是可选的,首先生成密码:htpasswd -nBC 12 "" | tr -d ':\n'这会生成一个 bcrypt 加密的密码字符串,使用它配置
/etc/node_exporter/web-config.yml文件:mkdir -vp /etc/node_exporter nano /etc/node_exporter/web-config.ymlbasic_auth_users: admin: $2y$12$yEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
然后创建 systemd 服务文件来管理 Node Exporter:
nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=0.0.0.0:9100 \
# 配置了认证后需要添加以下参数
--web.config.file=/etc/node_exporter/web-config.yml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
保存后,重新加载 systemd 配置并启动服务:
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter
验证 Node Exporter 是否正常运行:
curl http://localhost:9100/metrics
如果配置了认证,需要使用
curl的-u参数来提供用户名和密码(原始密码,不是 bcrypt 加密后的字符串):curl -u admin:yourpassword http://localhost:9100/metrics
记得开启服务器的防火墙和安全组,放行 9100 端口,以便 Prometheus 能够访问 Node Exporter 的指标数据。
四、配置 Prometheus 定时拉取 Node Exporter 的数据
编辑 Prometheus 的配置文件 prometheus.yml,在 scrape_configs: 下添加 Node Exporter 的抓取配置:
nano /opt/prometheus/prometheus.yml
- job_name: 'node_exporter'
basic_auth:
username: admin
password: yourpassword
static_configs:
- targets:
- 'your-node-exporter-server-ip:9100'
这里需要注意,认证方式会绑定这个
job内的所有目标,因此需要尽量避免不同Node Exporter密码不同的情况,也不要混用不同的认证方式,否则就需要配置多个job来抓取不同的Node Exporter,会比较麻烦。
然后重新加载 Prometheus 的配置:
curl -X POST http://localhost:9090/-/reload
查看下拉取的指标数据:
curl http://localhost:9090/api/v1/targets
如果看到 node_exporter 的目标状态为 UP,说明 Prometheus 已经成功拉取了 Node Exporter 的数据。
五、在 Grafana 中创建 Dashboard 展示监控数据
首先在 Connections > Data Sources 中添加 Prometheus 数据源,URL 填写 http://<Prometheus 服务器 IP>:9090,保存并测试连接。
然后在 Dashboards 页面的右上角,选择引入一个现成的 Node Exporter 的 Dashboard 模板:
输入模板 ID 1860 或者输入 URL https://grafana.com/grafana/dashboards/1860-node-exporter-full/ 进行导入。
最终成品如下图所示:
结束。