今回は監視ツールのお話です。
次世代監視ツールPrometheusを使ってみた
皆様はどんな監視ツールを使っていますか?BPSでは、nagios + munin
の2本立てでアラート通知やグラフによる監視を行なっています。今年度だけでも、ダウンしたサーバの発見や、リソースが限界に達していないかのチェックなど、監視ツールはさまざまな面で役に立っています。
しかし、監視ツールは監視対象側から監視ツール側に情報を送るという前提で作られていることが多い(世間ではPush型と言われている?)ため、監視ツールの導入は凄く面倒です。運用に関係のない設定はできれば監視対象には追加したくないものです。そこで、今回試験的に裏で運用しているPrometheus
を使ってDockerホストとコンテナの監視を開始しました。
Prometheusとは?
Prometheusはオープンソースの監視ツールです。音楽のソーシャル・プラットフォームを展開しているSoundCloud社によって2012年から開発が行われています。
Prometheusの特徴として、多次元のデータモデルの採用、動的に監視対象を探知できる設定が最初から利用できるなどの点が挙げられます。
しかし私的には、Prometheusが監視対象の情報を取得するPull型の通信を採用していることが一番の特徴ではないかと思っています。Prometheusが監視対象の状態をPull型で取得できることにより、監視対象の状態を監視システムから楽に管理できるというメリットがあります。
Prometheusのコンポーネントで今回利用したのは以下の2つです。
- Prometheus Server
- Prometheus本体です。監視ツールとして監視対象を管理、監視情報を取得するシステムです。
- exporter
- Prometheus Serverで読み取り可能なデータを生成する機能です。これは監視対象側に導入します。標準で
node_exporter
という監視対象のホストの情報を生成する機能があります。今回はこのnode_exporterと Dockerコンテナを監視するため、container_exporter
も一緒に導入します。
この2つを使ってPrometheusによる運用を行なっていきたいと思います。
Prometheusのインストール・設定
Prometheus Serverのインストール(監視サーバ側)
まず、監視ツール側にPrometheus Serverをインストールします。Ubuntu 17.04からようやくPrometheus 1系を標準で公式パッケージにインストールできるようになったため、監視サーバをUbuntu 17.04までアップグレードしました。
$ sudo apt update
$ sudo apt install prometheus
Prometheus Serverをインストールし、起動すると以下のようなGUI画面が出てきます。まだ監視対象を追加していないので、対象を設定してからグラフ描画を開始します。
node-exporterとcontainer-exporterをインストール(監視対象側)
次は監視対象側にnode-exporter
とcontainer-exporter
を導入して、監視対象側のDockerホストとコンテナの情報を生成します。せっかくDockerホストが動いてるので、 ここではnode-exporterとcontainer-exporterもDockerコンテナで運用するようにします。
今回は以下のコンテナを利用しました。
- node-exporter: Dockerホストの監視用にデータを生成
$ sudo docker run -d -p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
--net="host" \
quay.io/prometheus/node-exporter \
-collector.procfs /host/proc \
-collector.sysfs /host/sys \
-collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
- cAdvisor: Dockerコンテナの監視用にデータを生成(実はこのコンテナにアクセスするだけでコンテナ監視用のGUIを利用できたりする)
$ sudo docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
これにより、DockerホストとコンテナのPrometheus用のデータを生成できるようになりました。
DockerホストとDockerコンテナの情報を取得(Prometheusサーバ側の設定)
いよいよ、このDockerホストとコンテナの情報を取得できるようにPrometheusサーバを設定します。
Prometheus Serverの設定ファイル prometheus.yml
でexporterを導入したサーバのデータを取得するように設定します。
scrape_configs:
# dockerコンテナのデータを取得するためにターゲットを設定
- job_name: 'docker'
static_configs:
- targets:
- 'example.bpsinc.jp:8080'
- 'example2.bpsinc.jp:8080'
- 'example3.bpsinc.jp:8080'
labels:
group: 'docker-container'
# dockerホストのデータを取得するためにターゲットを設定
- job_name: 'docker-host'
static_configs:
- targets:
- 'example.bpsinc.jp:9100'
- 'example2.bpsinc.jp:9100'
- 'example3.bpsinc.jp:9100'
labels:
group: 'docker-host'
今回は static_configs
で静的にターゲットを登録するように設定しています。
また、 labels
では任意のラベルを指定できるため、グラフ生成時にこれを使ってグループに名前をつけます。これにより、今後別のグループでDockerホストを構築する場合も切り分けできるようになります。
上記の設定を追記した上でPrometheus Serverを再起動し、Targets
でグループのラベルで指定したホストのデータ取得に成功している事を確認できます。
データ取得後、 Graph
画面でグラフの描画が開始されていることが確認できます。
Prometheusのグラフは非常にシンプルなので、逆に見づらいかと思われます。
そこで、次はGrafanaをPrometheusと連携させてみます。
Grafanaとの連携
GrafanaをPrometheusと連携させると、Grafanaの強力なグラフ描画機能を利用できるようになります。
まず、監視サーバ側にGrafanaをインストールします。
$ sudo apt install grafana
インストール後、DataSourceにPrometheus
を追加します。
次にダッシュボードを作成する必要があります。ここでは、GrafanaのOfficial & community built dashboardsから、Docker and system monitoringをダウンロードして、 DashBoard
→ import
で先ほどダウンロードした Docker and system monitoring
のjsonファイルをインポートするのがよいでしょう。
以上で、強力な監視DashBoardを簡単に作成できます。
まとめ
という訳で、Prometheusのお話でした。先月には2.0.0の開発版がリリースされたため、安定板がリリースされたらそろそろ乗り換えてもいいかなとか思っています。
この記事では触れませんでしたが alertmanagaerというアラート通知ツールも別に存在します。Prometheusと連携させるとアラート通知もできるようになりますが、alertmanagaerがまだ開発途上な面があるので、試験的運用は後日にしてみたいと思います。
参考文献
関連記事
- 超シンプルなコンテナ管理systemd-nspawnを使ってみる
- Dockerでsupervisorを使う時によくハマる点まとめ
- ゆるふわDocker部】気軽にDockerを使うのもいいじゃない
- [翻訳] Dockerについてよくある勘違い