Appearance
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+namelabel 區分環境與主機,方便 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) |
| 預設 Port | 9100 |
| Binary 路徑 | /usr/local/bin/node_exporter |
| Service 用戶 | node_exporter(無 home、無 shell) |
| Metrics 端點 | http://localhost:9100/metrics |
| Grafana Dashboard ID | 1860(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_exportersystemd 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 -20Prometheus 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相關概念
- Prometheus on Kubernetes 部署與設定 — Prometheus 主體部署,含 scrape_configs 完整設定
- Prometheus Exporter 部署模式 — Exporter 的通用 K8s 部署模式
- Postgres Exporter 部署 — 層二:PostgreSQL 應用層指標採集,與本文互補
- Grafana on Kubernetes 部署 — Grafana 部署與 Dashboard 設定