Docker Swarm

Prometheus は v2.20.0 以降、Docker Swarm クラスター内のターゲットを検出できます。このガイドでは、そのサービス検出メカニズムの使用方法を説明します。

Docker Swarm サービス検出アーキテクチャ

Docker Swarm サービス検出には、ノード、サービス、タスクの 3 つの異なるロールがあります。

最初のロールであるノードは、Swarm に参加しているホストを表します。Swarm ホストで実行されている Docker デーモンまたは 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_configsport パラメータを使用することもできます。ただし、Prometheus が同一の Docker Swarm 設定間で同じ API 呼び出しを再利用できるようにするため、relabel_configs の使用が推奨されます。

コンテナの監視

それでは、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

relabel 設定の各部分を分析しましょう。

- 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 ドキュメントにはラベルの完全なリストが含まれていますが、以下に役立つ可能性のある他の relabel 設定をいくつか示します。

特定のネットワーク経由でのみメトリクスをスクレイプする

- 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 を超えるラベルが利用可能です。Prometheus サーバーの「サービス検出」ページ(「ステータス」メニューの下)を確認して、検出されたすべてのラベルを参照してください。

サービス検出は Swarm スタックに関する仮定を行わないため、適切な設定を行えば、既存のスタックにプラグイン可能になります。

このページの内容