Docker Swarm
Prometheus は v2.20.0 以降、Docker Swarm クラスター内のターゲットを発見できます。このガイドでは、そのサービスディスカバリメカニズムの使用方法を説明します。
Docker Swarm サービスディスカバリのアーキテクチャ
Docker Swarm サービスディスカバリには、ノード、サービス、タスクの 3 つの異なるロールがあります。
最初のロールである ノード は、Swarm の一部であるホストを表します。これは、Docker デーモンや Swarm ホストで実行されている Node Exporter を自動的に監視するために使用できます。
2 番目のロールである タスク は、Swarm にデプロイされている個々のコンテナを表します。各タスクには関連するサービスラベルが割り当てられます。1 つのサービスは、1 つまたは複数のタスクによってバックアップできます。
3 番目のロールである サービス は、Swarm にデプロイされているサービスを検出します。これは、サービスによって公開されているポートを検出します。通常、このロールの代わりにタスクロールを使用することをお勧めします。
Prometheus は、ポートを公開しているタスクとサービスのみを検出します。
注この投稿の残りの部分では、Swarm が実行されていることを前提としています。
Prometheus の設定
このガイドでは、Prometheus を設定する必要があります。Prometheus が Docker Swarm マネージャーノードで実行されており、/var/run/docker.sock
にある Docker ソケットにアクセスできることを前提としています。
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
ファイルを提供することで、Prometheus が Docker デーモンをスクレイプするように設定できます。
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 が同じ API 呼び出しを同一の Docker Swarm 設定で再利用できるようになります。
コンテナの監視
次に、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
ターゲットに docker_node ラベルを追加する
- source_labels: [__meta_dockerswarm_node_hostname]
target_label: docker_node
Docker Swarm への接続
上記の dockerswarm_sd_configs
エントリには host フィールドがあります。
host: unix:///var/run/docker.sock
これは Docker ソケットを使用しています。Prometheus は、Unix ソケットよりも HTTP や HTTPS を使用して Swarm に接続するための追加の設定オプションを提供しています。
まとめ
監視するターゲットと、タスクの監視方法をより正確に決定するために、多くのディスカバリラベルを使用できます。25 以上のラベルが利用可能です。「Status」メニューの下にある Prometheus サーバーの「Service Discovery」ページで、検出されたすべてのラベルを確認することを躊躇しないでください。
このサービスディスカバリは、Swarm スタックについて何の前提も置いていないため、適切な設定を行えば、既存のあらゆるスタックにプラグインできるはずです。