Skip to content

Node Exporter(VM 系統層監控)

在 Ubuntu VM 上以 systemd 部署 Prometheus Node Exporter,採集 CPU、記憶體、磁碟、網路等系統指標。

概述

Node Exporter 是 Prometheus 官方提供的系統層 Exporter,負責將 Linux 主機的硬體與作業系統指標轉換為 Prometheus 可抓取的格式,預設監聽 Port 9100。

在多層監控架構中,Node Exporter 扮演「層一(VM 系統層)」角色,回答的問題是「機器的資源瓶頸在哪?」——與層二的應用層 Exporter(如 postgres_exporter)互補,兩者缺一不可。

在 Kubernetes 環境外的 VM 上,Node Exporter 以 systemd service 方式常駐運行,無需容器化,佔用資源極低,適合在每台裸機或 VM 上部署。

核心內容

安裝方式

Node Exporter 以靜態執行檔方式分發,從 GitHub Releases 頁面下載 binary 即可安裝,無需套件管理器。安裝後需為其建立專屬的系統用戶(--no-create-home --shell /bin/false),以最小權限原則運行。

必須先建立系統用戶才能啟動 systemd service;跳過這步會導致 217/USER 錯誤(systemd 找不到指定的 User)。

systemd 服務設計考量

使用 After=network.target 確保網路就緒後才啟動;Restart=always 保證程序異常退出時自動重啟,不需人工介入。WantedBy=multi-user.target 使服務在系統進入多用戶模式時自動啟動。

Prometheus 抓取設計

prometheus.yml 中,同性質的監控目標放同一個 job_name,以 env(production/quality)和 name(主機名稱)label 區分。這個設計讓 Grafana 可以利用 label 做下拉選單切換,或在同一圖表上顯示多台主機的對比曲線。

Grafana Dashboard

官方社群 Dashboard ID 1860(Node Exporter Full)涵蓋 CPU 使用率、記憶體分層、Disk I/O(IOPS / throughput / await)、網路流量、Load Average 等完整指標,可直接匯入使用,無需自行建立 Panel。

關鍵要點

  • 安裝前必須先建立 node_exporter 系統用戶,否則 systemd 啟動失敗(exit-code 217/USER)
  • 驗證安裝:curl http://localhost:9100/metrics | head -20,看到 Prometheus 格式輸出即正常
  • Prometheus scrape job 用 env + name label 區分環境與主機,方便 Grafana 篩選
  • Grafana Dashboard ID 1860 可直接匯入,涵蓋所有常用系統指標
  • Node Exporter(層一)與 postgres_exporter(層二)互補,共同構成完整的 DB 伺服器監控

實際應用

每台需要監控的 Ubuntu VM 都部署一個 Node Exporter 實例。在 Prometheus 的 scrape_configs 中統一以 job_name: 'node' 管理,用 label 區分環境(PRD / QAS)與主機名稱,Grafana 中可設定變數讓使用者動態切換查看對象。

部署設定參考

以下為實際部署時使用的完整設定,供日後查詢與複製使用。

環境參數

項目
作業系統Ubuntu (systemd)
預設 Port9100
Binary 路徑/usr/local/bin/node_exporter
Service 用戶node_exporter(無 home、無 shell)
Metrics 端點http://localhost:9100/metrics
Grafana Dashboard ID1860(Node Exporter Full)

安裝指令

bash
# 下載並安裝 binary
wget https://github.com/prometheus/node_exporter/releases/latest/download/node_exporter-*.linux-amd64.tar.gz
tar xvf node_exporter-*.linux-amd64.tar.gz
sudo cp node_exporter-*/node_exporter /usr/local/bin/

# 建立系統用戶(必要前置步驟)
sudo useradd --no-create-home --shell /bin/false node_exporter

# 設定 binary 擁有者
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

systemd Service 設定

bash
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target
EOF

啟動指令

bash
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter

# 驗證
sudo systemctl status node_exporter
curl http://localhost:9100/metrics | head -20

Prometheus scrape_configs

yaml
scrape_configs:

  # 層一:所有 VM 的系統指標
  - job_name: 'node'
    static_configs:
      - targets: ['10.0.0.1:9100']
        labels:
          env: 'production'
          name: 'db-prd'
      - targets: ['10.0.0.2:9100']
        labels:
          env: 'quality'
          name: 'db-qas'

  # 層二:所有 VM 的 PostgreSQL 指標
  - job_name: 'postgresql'
    static_configs:
      - targets: ['10.0.0.1:9187']
        labels:
          env: 'production'
          name: 'db-prd'
      - targets: ['10.0.0.2:9187']
        labels:
          env: 'quality'
          name: 'db-qas'

Label 說明

Label用途
env區分環境,Grafana 可設為下拉選單切換 PRD / QAS
name區分主機,圖表多條線時可識別來源

Grafana PromQL 查詢範例

promql
# 只看 PRD
node_cpu_seconds_total{env="production"}

# 只看 QAS
node_cpu_seconds_total{env="quality"}

# 兩台同時顯示(不加 filter,Grafana 自動分兩條線)
node_cpu_seconds_total

常見錯誤:exit-code 217/USER

bash
# 原因:node_exporter 系統用戶不存在
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo systemctl start node_exporter

相關概念

來源