Skip to content
Go back

搭建 Prometheus + Grafana 监控平台并使用 Node Exporter 监测服务器状态

| 0 Views Edit page

前言

去年升级 Grafana 监控面板的适合,发现 Gemini 等 AI 也具有书写监控 Dashboard 的能力了,于是在本次重构中,彻底放弃从 2019 年使用至今的 Zabbix,转而使用 Prometheus + Grafana 监控不止业务数据、还包括服务器状态等指标。


方案概述

  1. 使用 Docker 启动 Prometheus
  2. 使用 Docker 启动 Grafana
  3. 在需要监控的服务器上安装 Node Exporter
  4. 配置 Prometheus 定时拉取 Node Exporter 的数据
  5. 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.yml
basic_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 模板:
选择 Import
输入模板 ID 1860 或者输入 URL https://grafana.com/grafana/dashboards/1860-node-exporter-full/ 进行导入。
最终成品如下图所示:
Node Exporter Dashboard

结束。


Edit page