node_exporter と cAdvisor でホストとコンテナを監視する
Prometheus、node_exporter、cAdvisor を一緒に実行し、両方をスクレイプして、ターゲットが正常であることを確認します。
ホストレベルのメトリクス(CPU、メモリ、ディスク、ネットワーク)とコンテナごとのメトリクスは、2 つの異なる exporter から得られます。このガイドでは、Docker Compose で Prometheus を両方と並べて実行し、両方をスクレイプするように Prometheus を設定して、次のガイドでダッシュボードに引き渡す前に、動作していることを確認します。
3 つの部品
- Prometheus 自体:スケジュールに従ってターゲットをスクレイプし、結果を保存します。
- node_exporter:ホストのオペレーティングシステム自身のメトリクス(CPU、メモリ、ディスク、ネットワーク)を、ポート 9100 の
/metricsで公開します。 - cAdvisor(Container Advisor、Google が保守):コンテナごとのリソース使用量(CPU、メモリ、I/O)を、ポート 8080 の
/metricsで公開します。
どちらの exporter も、通常のコンテナからは見えないものを見る必要があります。node_exporter は、自分のコンテナだけでなくホストについて正確に報告するために、ホストのルートファイルシステムとプロセス namespace を必要とします。cAdvisor は、自分自身だけでなく、ホスト上で動作するすべてのコンテナについて報告するために、コンテナランタイム自身のデータへのアクセスを必要とします。
3 つすべてのための Docker Compose
version: "3"
volumes:
prometheus-data:
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.retention.time=15d"
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
pid: host
volumes:
- /:/host:ro,rslave
command:
- "--path.rootfs=/host"
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
node-exporter の pid: host と読み取り専用のルートマウントによって、分離された自分のコンテナのビューではなく、ホストについて報告できます。--path.rootfs=/host は、マウントされたルートがコンテナ内の実際にどこに置かれたかを伝えます。cadvisor も、同じ理由で、ホストのランタイム状態への読み取り専用マウントのセットを必要とします。それがないと、自分自身しか見えず、ホスト上の他のコンテナは見えません。ここでは何もホストへの書き込みアクセスを必要とせず、すべてのマウントが読み取り専用です。セキュリティレビューでこれらのコンテナが実際に何をできるかを聞かれたときに、覚えておく価値があります。
両方をスクレイプするように Prometheus を設定する
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "node-exporter"
static_configs:
- targets: ["node-exporter:9100"]
- job_name: "cadvisor"
static_configs:
- targets: ["cadvisor:8080"]
global.scrape_interval は Prometheus の組み込みのデフォルト(1 分)ではありません。ほとんどの入門例のように明示的に 15 秒に設定するのは、従うべき慣習です。応答性の高いダッシュボードを得るのに十分頻繁で、かつ過剰なスクレイプ量を生み出さないからです。各 job_name は、あなたが選ぶ任意のラベルで、そのジョブがスクレイプするすべての系列に付与されます。これが、後でクエリで「このメトリクスは node-exporter から来た」と「このメトリクスは cadvisor から来た」を区別する方法です。ターゲットは、Compose のサービス名(node-exporter、cadvisor)でアドレス指定されます。同じ Compose ネットワーク上のコンテナは、サービス名で互いを自動的に解決するため、ここではコンテナの IP アドレスも localhost も必要ありません。
起動して、ターゲットが正常であることを確認する
docker compose up -d
ブラウザで http://localhost:9090/targets を開きます。設定した各ジョブが UP と表示されるはずです。そうでないものがあれば、問題が Prometheus の設定ではなくターゲット自体にあると決めつける前に、まずそのコンテナ自身のログを確認し、その /metrics エンドポイントに直接到達できることを確認してください(ホストから curl http://localhost:9100/metrics、または Prometheus コンテナに docker exec して、ターゲットの Compose サービス名に curl します)。
Prometheus 自身の Graph ページで、簡単な動作確認を試します。
up{job="node-exporter"}
up は、Prometheus がすべてのターゲットに対して自分で生成する合成メトリクスで、最後のスクレイプが成功すれば 1、そうでなければ 0 です。Targets ページではなく、PromQL を通じてターゲットの健全性を直接確認する手早い方法になります。
先に進む前の注意
Prometheus の UI も cAdvisor の UI も、デフォルトでは認証や TLS が付属していません。これは、信頼できるネットワーク内からスクレイプされクエリされることを想定したものにとっては妥当なデフォルトですが、アクセス制御を追加せずに、これらのポートを公開インターネットに直接公開すべきではないということです。前面に認証付きのリバースプロキシを置く、あるいは最初から内部ネットワークからのみ到達可能にしておくなどです。
両方の exporter が Prometheus に報告するようになったので、次のガイドでは、これを Grafana を使った実際のダッシュボードにする方法を説明します。