CentOS7でDockerを使用してPrometheusをインストールする方法
Prometheusの共同作成者であるJuliusVolzの記事
序章
Prometheusは、オープンソースの監視システムおよび時系列データベースです。 メトリックの生成と収集、ダッシュボードでの結果データのグラフ化、異常のアラートなど、監視の多くの側面に対応します。 これを実現するために、個別に実行されるが組み合わせて使用されるさまざまなコンポーネントを提供します。
Dockerは、Linuxコンテナー(または他のカプセル化テクノロジー)を使用してサーバープロセスをカプセル化する方法を提供します。これにより、サーバープロセスをより簡単に管理し、相互に分離できます。 Dockerの詳細については、 Dockerエコシステム:一般的なコンポーネントの概要を参照してください。
このチュートリアルでは、DockerでPrometheusを使用するための3つの主要コンポーネントをインストールする方法を学習します。 これらは:
- メトリックを収集してクエリするPrometheusサーバー
- Prometheus互換形式でシステムメトリックをエクスポートするノードエクスポータ
- Grafana、他のバックエンドの中でもPrometheusをサポートするWebベースのグラフィカルダッシュボードビルダー
Prometheusエコシステムにはさらに多くのコンポーネントがありますが、これら3つはPrometheusを使用するための良い出発点を提供します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- CentOS7.1ドロップレット
sudo
アクセス権を持つユーザー(詳細については、 CentOS 7 を使用したサーバーの初期設定チュートリアルを参照してください)- CentOS7にDockerComposeをインストールして使用する方法のステップ1の手順でインストールされたDocker
注:この記事は、1 CPU / 512 MB RAMCentOS7.1ドロップレットでテストされています。 Prometheusの構成は、この記事のステップ2で説明されているように、利用可能なリソースの量に合わせて調整する必要があります。
ステップ1—Prometheusをインストールする
このセクションでは、Dockerを使用してメインのPrometheusサーバーをインストールする方法について説明します。 続行する前に、前提条件セクションに従ってDockerをインストールしてください。 Prometheusサーバーは、Prometheusエコシステムの中心的な部分であり、メトリックの収集と保存、および式クエリの処理とアラートの生成を担当します。
すべてのPrometheusコンポーネントのDockerコンテナイメージは、DockerHubのprom組織でホストされています。 prom/prometheus
Dockerイメージをそれ以上のオプションなしで実行すると、コンテナー内の/etc/prometheus/prometheus.yml
にある構成ファイルの例でPrometheusサーバーが起動します。 また、コンテナ内の/prometheus
にマウントされたDockerデータボリュームを使用して、収集されたメトリックデータを保存します。 このデータボリュームディレクトリは、実際には、コンテナが最初に起動されたときにDockerが自動作成するホスト上のディレクトリです。 その中のデータは、同じコンテナーの再起動間で保持されます。
デフォルトの構成ファイルをオーバーライドするには、複数の方法があります。 たとえば、カスタム構成ファイルをホストファイルシステムからDockerデータボリュームとしてコンテナーに渡すことも、独自の構成ファイルをコンテナーイメージにベイクして派生したDockerコンテナーを構築することもできます。 このチュートリアルでは、ホストシステムから構成ファイルを渡すことを選択します。
メトリックのストレージを整理するためのさまざまなパターンもあります。 このチュートリアルでは、Dockerイメージのデフォルトの動作であるDockerデータボリュームを使用してメトリックを保存します。 または、ニーズに適している場合は、データボリュームコンテナの作成を検討することもできます。
注: Dockerデータボリュームを作成する方法については、 Ubuntu 14.04でDockerデータボリュームを操作する方法をお読みください(この記事の関連部分はUbuntu固有ではありません)。
まず、~/prometheus.yml
のホストファイルシステムに最小限のPrometheus構成ファイルを作成します。
nano ~/prometheus.yml
次の内容をファイルに追加します(your_server_ip
をDropletのIPアドレスに置き換えます)。
〜/ prometheus.yml
# A scrape configuration scraping a Node Exporter and the Prometheus server # itself. scrape_configs: # Scrape Prometheus itself every 5 seconds. - job_name: 'prometheus' scrape_interval: 5s target_groups: - targets: ['localhost:9090'] # Scrape the Node Exporter every 5 seconds. - job_name: 'node' scrape_interval: 5s target_groups: - targets: ['your_server_ip:9100']
この構成例では、Prometheusがそれ自体から(PrometheusはPrometheus互換形式でそれ自体に関するメトリックも公開するため)、および後で設定するNodeExporterからメトリックをスクレイプします。 Prometheusはlocalhost
ホスト名を使用してコンテナー内で接続できますが、ノードエクスポーターは別のネットワーク名前空間を持つ別のコンテナーで実行されるため、サーバーの外部IPを使用してノードエクスポーターをスクレイプする必要があります。
外部構成ファイルを使用してPrometheusDockerコンテナーを起動します。
docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000
このコマンドを初めて実行すると、DockerHubからDockerイメージがプルされます。
このコマンドは非常に長く、多くのコマンドラインオプションが含まれています。 それをもっと詳しく見てみましょう:
-d
オプションは、Prometheusコンテナーをデタッチモードで開始します。つまり、コンテナーはバックグラウンドで開始され、CTRL+C
を押しても終了しません。-p 9090:9090
オプションは、PrometheusのWebポート(9090)を公開し、ホストシステムの外部IPアドレスを介して到達可能にします。-v [...]
オプションは、prometheus.yml
構成ファイルをホストファイルシステムから、Prometheusが予期するコンテナー内の場所(/etc/prometheus/prometheus.yml
)にマウントします。-config.file
オプションは、コンテナー内のPrometheus構成ファイルの場所に応じて設定されます。-storage.local.path
オプションは、コンテナー内のメトリックの保存場所を構成します。- 最後に、
-storage.local.memory-chunks
オプションは、Prometheusのメモリ使用量をホストシステムの非常に少量のRAM(512MBのみ)およびこのチュートリアルで保存されている少数の時系列(1000未満)に調整します。 これは、デフォルトの1048576ではなく、10000サンプルチャンク(シリーズごとに約10チャンク)のみをメモリに保持するようにPrometheusに指示します。 これは、より多くのRAMを搭載したマシンでPrometheusを実行する場合、およびより多くの時系列を保存する場合に、必ず調整する必要がある値です。 これに関する詳細については、Prometheusのストレージドキュメントを参照してください。
次のコマンドを使用して、実行中のすべてのDockerコンテナーを一覧表示できます。
docker ps
たとえば、PrometheusDockerコンテナの場合は次のようになります。
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a89ac39911e prom/prometheus "/bin/prometheus -con" 2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike
docker ps
出力に表示されるコンテナIDを使用して、次のコマンドで実行中のPrometheusサーバーのログを調べることができます。
docker logs container_id
この例では、コマンドは次のようになります。
docker logs 6a89ac39911e
ホストのファイルシステムのどこにメトリックストレージボリュームが保存されているかを確認するには、container_idを使用して次のコマンドを実行できます。
docker inspect container_id
これにより、マウントされたDockerボリュームのホストパスなど、コンテナーの構成に関する情報が出力されます。
次のような出力のセクションを見つけます。
Output of `docker inspect ...`... "Mounts": [ { "Source": "/home/sammy/prometheus.yml", "Destination": "/etc/prometheus/prometheus.yml", "Mode": "", "RW": true }, { "Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c", "Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data", "Destination": "/prometheus", "Driver": "local", "Mode": "", "RW": true } ], ...
この例では、メトリックはホストシステムの/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data
に格納されています。 このディレクトリは、Prometheusコンテナを最初に起動したときにDockerによって自動的に作成されました。 コンテナ内の/prometheus
ディレクトリにマップされます。 このディレクトリ内のデータは、同じコンテナを再起動しても保持されます。 必要に応じて、メトリックデータを保存するための既存のホストディレクトリをマウントすることもできます。 これを実現する方法については、 Ubuntu14.04でDockerデータボリュームを操作する方法を参照してください。 この記事はUbuntu14.04向けに書かれていますが、Dockerコマンドと構成ファイルはCentOS7でも同じです。
これで、http://your_server_ip:9090/
でPrometheusサーバーにアクセスできるようになります。 http://your_server_ip:9090/status
に移動し、 Targetsセクションでprometheus
ジョブのhttp://localhost:9090/metrics
エンドポイントを見つけて、自身に関するメトリックを収集していることを確認します。 このターゲットのState列には、ターゲットの状態がHEALTHYと表示されます。 対照的に、http://localhost:9100/metrics
(ノードエクスポータ)エンドポイントは、ノードエクスポータがまだ開始されておらず、スクレイプできないため、UNHEALTHYとして表示されます。
要約すると、これで、ホストファイルシステムにあるカスタムPrometheus構成ファイル~/prometheus.yml
を使用して、PrometheusがDockerコンテナーとして実行されます。 メトリックストレージは、コンテナの/prometheus
ディレクトリにあります。このディレクトリは、このセクションで説明するdocker inspect
コマンドで示されるパスによってホストシステムにバックアップされます。
ステップ2—ノードエクスポーターの設定
このセクションでは、PrometheusNodeExporterをインストールします。 Node Exporterは、実行中のホストマシン(ノード)に関するPrometheusメトリックを公開するサーバーです。 これには、マシンのファイルシステム、ネットワークデバイス、プロセッサ使用量、メモリ使用量などに関するメトリックが含まれます。
DockerでNodeExporterを実行すると、実行しているホストに関するメトリックを公開することが全体の目的であるため、いくつかの課題が発生することに注意してください。 それ以上のオプションなしでDockerで実行すると、ファイルシステムやネットワークデバイスなどのリソースのDockerの名前空間により、ホストの環境とは異なるコンテナの環境に関するメトリックのみがエクスポートされます。 したがって、通常は、Dockerの外部のホストシステムで直接NodeExporterを実行することをお勧めします。 ただし、Dockerを使用してすべてのプロセスを管理する必要がある場合は、Docker内からホストメトリックをエクスポートするための妥当な概算を提供する回避策について説明します。
Dockerを使用してポート9100でNodeExporterを起動するには:
docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
次のDockerフラグとNodeExporterフラグは、hostメトリックの妥当な概算を提供するために使用されます。
- Linuxでは、NodeExporterはほとんどのメトリックを
/proc
および/sys
ファイルシステムから収集します。 これらのファイルシステムは、Dockerの-v
フラグを使用して、ホストから/host
ディレクトリの下のコンテナーにマウントされます。 - NodeExporterの
-collector.procfs
および-collector.sysfs
フラグを介して、非標準の場所で/proc
および/sys
ファイルシステムを探すようにNodeExporterに指示します。 - ホストファイルシステムのメトリックを報告するために、ルート(
/
)ファイルシステム全体をコンテナー(/rootfs
)にマウントし、Dockerの-v
フラグを使用します。 - NodeExporterの
-collector.filesystem.ignored-mount-points
フラグを使用して、ホストシステムに属していないコンテナ内の他のファイルシステムを無視します。 このオプションは、報告されたメトリックから除外するマウントポイントの正規表現を取ります。 --net=host
Dockerフラグを使用して、コンテナーをホストと同じネットワークスタックに配置します。これにより、/proc/net/dev
などのファイルから読み取ると、ホストと同じ結果が得られます(/proc
ホストからマウントされたファイルシステムでは不十分です)。
一部のメトリックは、ホスト上で直接実行されているノードエクスポーターと比較すると依然として異なることに注意してください。 具体的には、ファイルシステムの使用状況について報告されたメトリックには、mountpoint
ラベルの値に/rootfs
プレフィックスが含まれます。これは、コンテナのこのプレフィックスの下にルートファイルシステムをマウントするためです。 また、説明されている回避策が将来のNode Exporter機能に十分であるという保証もありません。そのため、独自の裁量でDocker上でNodeExporterを実行してください。
これで、Prometheusサーバーはノードエクスポーターのスクレイピングを自動的に開始するはずです。 http://your_server_ip:9090/status
にあるPrometheusサーバーのステータスページに移動し、node
ジョブのhttp://your_server_ip:9100/metrics
ターゲットがHEALTHY状態を示していることを確認します。
ステップ3—Grafanaを設定する
最後に、Grafanaをセットアップします。 Grafanaは、グラフ化するデータをクエリするためのバックエンドとしてPrometheusをサポートするグラフィカルダッシュボードビルダーです。
Grafanaは、ダッシュボードのメタデータ(存在するダッシュボードや表示するグラフなど)を構成可能なSQLベースのデータベースに保存します。 Grafanaは、ローカルのファイルベースのSQLite3データベースと、MySQLやPostgreSQLなどの外部データベースサーバーの使用をサポートしています。
このチュートリアルでは、Dockerデータボリュームに支えられたSQLite3データベースを使用します。 詳細については、Sqliteの使用方法と使用時期を参照してください。
選択した管理者パスワード(admin_password
)を使用して、DockerコンテナーとしてGrafanaを起動します。
docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana
これにより、DockerHubからGrafanaDockerイメージがダウンロードされ、ホストシステムの~/grafana_db
とコンテナファイルシステムの/var/lib/grafana
に配置された新しいDockerボリュームが作成されます。 コンテナ内で、Grafanaは/var/lib/grafana/grafana.db
でSQLite3データベースを自動的に作成して初期化します。
-e
フラグを使用すると、Dockerコンテナ内で起動されたプロセスに環境変数を渡すことができます。 ここでは、これを使用してGF_SECURITY_ADMIN_PASSWORD
環境変数を目的のダッシュボード管理者パスワードに設定し、デフォルトのパスワードadmin
を上書きします。 環境変数を使用して、他のGrafana構成設定をオーバーライドすることもできます。 詳細については、環境変数の使用を参照してください。
Grafanaが正しく実行されていることを確認するには、http://your_server_ip:3000/
に移動します。 管理者のユーザー名はadmin
で、パスワードは以前にDockerコンテナーを起動したときに選択したものです。
ログインすると、Grafanaのメインビューが表示されます。
Grafanaの使用を開始する方法の詳細については、Grafanaのドキュメントを参照してください。 Prometheus Grafanaのドキュメントには、GrafanaをPrometheusと組み合わせて使用する方法も示されています。
結論
おめでとう! Prometheusサーバー、ノードエクスポーター、Grafanaをセットアップしました。すべてDockerを使用しています。 これらは現在すべて同じマシンで実行されていますが、これはデモンストレーションのみを目的としています。 本番環境では、通常、監視対象のすべてのマシン、複数のPrometheusサーバー(組織の必要に応じて)、およびこれらのサーバーからのデータをグラフ化するための単一のGrafanaサーバーでNodeExporterを実行します。
Prometheusの一般的な使用方法の詳細については、そのドキュメントを参照してください。