Prometheus は、v2.20.0 以降、Docker Swarm クラスター内のターゲットを検出できます。このガイドでは、そのサービスディスカバリーメカニズムの使用方法について説明します。
Docker Swarm サービスディスカバリーには、ノード、サービス、タスクの 3 つの異なる役割が含まれています。
最初の役割であるノードは、Swarm の一部であるホストを表します。これは、Swarm ホストで実行されている Docker デーモンまたは Node Exporter を自動的に監視するために使用できます。
2 番目の役割であるタスクは、Swarm にデプロイされた個々のコンテナーを表します。各タスクには、関連付けられたサービスラベルが付きます。1 つのサービスは、1 つまたは複数のタスクによってサポートされる場合があります。
3 番目の役割であるサービスは、Swarm にデプロイされたサービスを検出します。サービスによって公開されたポートを検出します。通常、この役割の代わりにタスクの役割を使用します。
Prometheus は、ポートを公開するタスクとサービスのみを検出します。
このガイドでは、Prometheus をセットアップする必要があります。Prometheus が Docker Swarm マネージャーノードで実行されており、/var/run/docker.sock
で Docker ソケットにアクセスできると想定します。
サービスディスカバリー自体を見てみましょう。
デーモンとしての Docker 自体は、Prometheus サーバーで取り込むことができるメトリックを公開しています。
これらを有効にするには、/etc/docker/daemon.json
を編集し、次のプロパティを設定します
{
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
}
0.0.0.0
の代わりに、Docker Swarm ノードの IP を設定できます。
新しい構成を有効にするには、デーモンの再起動が必要です。
Docker のドキュメントには、これに関する詳細情報が記載されています。
次に、次の prometheus.yml
ファイルを提供することで、Docker デーモンをスクレイプするように Prometheus を構成できます
scrape_configs:
# Make Prometheus scrape itself for metrics.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Create a job for Docker daemons.
- job_name: 'docker'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: nodes
relabel_configs:
# Fetch metrics on port 9323.
- source_labels: [__meta_dockerswarm_node_address]
target_label: __address__
replacement: $1:9323
# Set hostname as instance label
- source_labels: [__meta_dockerswarm_node_hostname]
target_label: instance
ノードの役割については、dockerswarm_sd_configs
の port
パラメーターを使用することもできます。ただし、relabel_configs
を使用することをお勧めします。これにより、Prometheus は同一の Docker Swarm 構成間で同じ API 呼び出しを再利用できます。
次に、Swarm にサービスをデプロイしましょう。cadvisor をデプロイします。これは、コンテナリソースのメトリックを公開します
docker service create --name cadvisor -l prometheus-job=cadvisor \
--mode=global --publish target=8080,mode=host \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock,ro \
--mount type=bind,src=/,dst=/rootfs,ro \
--mount type=bind,src=/var/run,dst=/var/run \
--mount type=bind,src=/sys,dst=/sys,ro \
--mount type=bind,src=/var/lib/docker,dst=/var/lib/docker,ro \
google/cadvisor -docker_only
これを監視するための最小限の prometheus.yml
ファイルは次のとおりです
scrape_configs:
# Make Prometheus scrape itself for metrics.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Create a job for Docker Swarm containers.
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
# Only keep containers that should be running.
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
# Only keep containers that have a `prometheus-job` label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
# Use the prometheus-job Swarm label as Prometheus job label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job
リラベル構成の各部分を分析しましょう。
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
Docker Swarm は、API を介してタスクの望ましい状態を公開します。私たちの例では、実行する必要があるターゲットのみを保持します。これにより、シャットダウンする必要があるタスクの監視を回避できます。
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
cadvisor をデプロイしたときに、prometheus-job=cadvisor
というラベルを追加しました。Prometheus はタスクラベルを取得するため、prometheus-job
ラベルを持つターゲットのみを保持するように指示できます。
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job
最後の部分は、タスクのラベル prometheus-job
をターゲットラベルに変換し、スクレイプ構成から得られるデフォルトの dockerswarm
ジョブラベルを上書きします。
Prometheus のドキュメントには、ラベルの完全なリストが含まれていますが、ここでは役立つ可能性のあるその他のリラベル構成を示します。
- source_labels: [__meta_dockerswarm_network_name]
regex: ingress
action: keep
グローバルタスクはすべてのデーモンで実行されます。
- source_labels: [__meta_dockerswarm_service_mode]
regex: global
action: keep
- source_labels: [__meta_dockerswarm_task_port_publish_mode]
regex: host
action: keep
- source_labels: [__meta_dockerswarm_node_hostname]
target_label: docker_node
上記の dockerswarm_sd_configs
エントリには、host フィールドがあります
host: unix:///var/run/docker.sock
これは Docker ソケットを使用しています。Prometheus は、Unix ソケットではなく HTTP と HTTPS を使用して Swarm に接続するための追加の構成オプションを提供しています。
監視するターゲットとその方法をより適切に決定するために使用できるディスカバリーラベルはたくさんあります。タスクの場合、25 を超えるラベルを使用できます。検出されたすべてのラベルを確認するには、Prometheus サーバーの「サービスディスカバリー」ページ(「ステータス」メニューの下)を遠慮なく参照してください。
サービスディスカバリーは Swarm スタックについて何も想定していないため、適切な構成があれば、既存のスタックにプラグインできるようにする必要があります。
このドキュメントは オープンソースです。問題またはプルリクエストを提出して改善にご協力ください。