Fedora ServerでPrometheus、Grafana、Node Exporterを構築:実践的なサーバー監視スタック

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

監視ダッシュボードなしでサーバーを運用することは、霧の中を運転するようなものです。クローラーBotによるCPUのスパイクや、アプリケーションログの肥大化によるディスク使用率100%など、予期せぬトラブルで気づいた時にはサーバーがダウンしていたという事態に陥りかねません。

この課題を解決するための最適な選択肢が、Prometheus + Grafana + Node Exporterの組み合わせです。このスタックは軽量で安定しており、拡張性にも優れています。メモリ2GBの基本的なFedora VPS環境でも、スタック全体でわずか250MB〜350MB程度のメモリしか消費しません。

クイックスタート:5分で監視スタックを構築

すぐに動作確認を行いたい場合は、以下の手順に沿ってセットアップを進めてください。

1. バイナリからNode ExporterとPrometheusをインストール

# ログインシェルを持たない専用のシステムユーザーを作成
sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter

# Node Exporterのダウンロードと配置
NODE_VER="1.8.2"
curl -LO https://github.com/prometheus/node_exporter/releases/download/v${NODE_VER}/node_exporter-${NODE_VER}.linux-amd64.tar.gz
tar -xvf node_exporter-${NODE_VER}.linux-amd64.tar.gz
sudo mv node_exporter-${NODE_VER}.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

# Prometheus Serverのダウンロードと配置
PROM_VER="2.54.1"
curl -LO https://github.com/prometheus/prometheus/releases/download/v${PROM_VER}/prometheus-${PROM_VER}.linux-amd64.tar.gz
tar -xvf prometheus-${PROM_VER}.linux-amd64.tar.gz
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo mv prometheus-${PROM_VER}.linux-amd64/prometheus /usr/local/bin/
sudo mv prometheus-${PROM_VER}.linux-amd64/promtool /usr/local/bin/
sudo mv prometheus-${PROM_VER}.linux-amd64/consoles /etc/prometheus
sudo mv prometheus-${PROM_VER}.linux-amd64/console_libraries /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus /usr/local/bin/prometheus /usr/local/bin/promtool

2. DNFリポジトリからGrafanaをインストール

Grafana Labsの公式リポジトリを追加し、DNF経由で最新版のインストールおよびアップデートができるように設定します。

sudo tee /etc/yum.repos.d/grafana.repo << 'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
enabled=1
EOF

sudo dnf install -y grafana
sudo systemctl daemon-reload
sudo systemctl enable --now grafana-server

3. Firewalldでポートを開放

Fedoraではデフォルトでファイアウォールが厳格に設定されています。3000番ポート(Grafana)と9090番ポート(Prometheus Web UI)を開放する必要があります。

sudo firewall-cmd --permanent --add-port={3000/tcp,9090/tcp}
sudo firewall-cmd --reload

ブラウザを開き、http://<サーバーのIPアドレス>:3000にアクセスします。初期のユーザー名とパスワードはともにadmin / adminです。

仕組みの理解:Pull型の動作モデルとは?

この監視システムはPull型(データ取得型)モデルで動作します。3つのコンポーネントが明確に役割を分担しています。

  • Node Exporter(メトリクス収集エージェント): OS上でバックグラウンド動作し、メモリ消費量はわずか15MB程度です。/procや/sysから直接システムメトリクスを読み取り、9100/metricsエンドポイントでHTTPテキスト形式として公開します。
  • Prometheus(データ蓄積&処理エンジン): 15秒ごとにNode ExporterへHTTPリクエストを送信してメトリクスをスクレイピング(収集)します。データは圧縮され、/var/lib/prometheus内の時系列データベース(TSDB)に直接保存されます。
  • Grafana(可視化ダッシュボード): システムデータを自身で保持することはありません。PromQL言語を用いてPrometheusからデータをクエリし、直感的なダッシュボードとして描画する役割を担います。

Node ExporterとPrometheusのSystemdサービスを作成

OS起動時の自動起動および異常終了時の自動再起動を有効にするため、systemdユニットファイルを作成します。

/etc/systemd/system/node_exporter.serviceを作成します。

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address="127.0.0.1:9100"
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

続いて、/etc/prometheus/prometheus.ymlにPrometheusのスクレイピング設定ファイルを作成します。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "fedora_node"
    static_configs:
      - targets: ["localhost:9100"]
        labels:
          instance: "fedora-srv-01"

/etc/systemd/system/prometheus.serviceのユニットファイルを作成します。

[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --storage.tsdb.retention.time=30d \
  --storage.tsdb.retention.size=10GB \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --web.enable-lifecycle
Restart=always

[Install]
WantedBy=multi-user.target

2つのサービスを有効化して起動します。

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter prometheus
sudo systemctl status node_exporter prometheus --no-pager

データの可視化とアラート設定

1. データソースの接続とダッシュボードのインポート

  1. Grafanaにログインすると、新しいadminパスワードへの変更が求められます。
  2. 左側のメニューからConnections > Data Sourcesを開き、Add data sourceをクリックしてPrometheusを選択します。
  3. URL欄にhttp://localhost:9090を入力し、ページ下部にあるSave & testをクリックします。緑色の成功バナーが表示されれば接続完了です。
  4. Dashboards > New > Importへ移動し、ID欄に1860(コミュニティで最も利用されているNode Exporter Fullダッシュボード)を入力します。
  5. 先ほど作成したPrometheusデータソースを選択し、Importをクリックします。

これで、各CPUコアの使用率、RAM使用量(Cached、Free、Buffers)、NVMe/SSDのI/O速度、ネットワークトラフィックなどがリアルタイムで表示されるようになります。

2. 基本的なアラートルール(Alert Rules)の設定

サーバー障害を未然に防ぐため、/etc/prometheus/alert_rules.ymlを作成してアラートルールを定義します。

groups:
  - name: HostAlerts
    rules:
      - alert: HighCpuLoad
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }} で高CPU負荷が発生"
          description: "過去5分間のCPU使用率が85%を超えています。"

      - alert: DiskSpaceLow
        expr: (node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} のルートパーティション空き容量が不足しています"
          description: "ルートパーティション(/)の空き容量が15%未満です。"

      - alert: NodeDown
        expr: up{job="fedora_node"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "サーバー {{ $labels.instance }} との接続が切断されました"
          description: "PrometheusがNode Exporterからメトリクスを1分以上取得できていません。"

作成したルールファイルを/etc/prometheus/prometheus.ymlに追記することを忘れないようにしてください。

rule_files:
  - "alert_rules.yml"

新しい設定を適用する前に、必ずpromtoolコマンドで構文エラーを検証します。

promtool check config /etc/prometheus/prometheus.yml

Fedoraでの実践的な運用ノウハウ

再起動なしで設定を即座にリロード

systemdの設定で--web.enable-lifecycleフラグを有効にしているため、アラートルール変更のたびにsystemctl restart prometheusを実行する必要はありません。以下のPOSTリクエストを送信するだけで完了します。

curl -X POST http://localhost:9090/-/reload

Prometheusは数ミリ秒で新しい設定を読み込みます。収集中のメトリクスデータが途切れることもありません。

TSDBによるディスク容量消費の制御

Prometheusはデフォルトで15日分のデータを保持し、容量上限は設定されていません。大量のメトリクスを収集している場合、ディスクが逼迫するリスクがあります。--storage.tsdb.retention.time=30dおよび--storage.tsdb.retention.size=10GBのフラグを設定しておくことで、10GBに達するか30日を超えた古いデータブロックが自動的に削除されるため安心です。

Node Exporterポートのセキュリティ保護

認証付きのリバースプロキシを経由する場合を除き、9100番ポートをインターネットへ公開してはいけません。ハードウェア情報やマウントポイント、ユーザー名などのメトリクスは、攻撃者にとって格好の偵察材料となります。本ガイドのように、Node Exporterのリスンアドレスを127.0.0.1:9100に限定するのが最も安全です。

Share: