Podman コンテナランタイムとの Docker インテグレーションの使用

Podman は、Linux システムで OCI コンテナを開発、管理、実行するためのデーモンレスコンテナエンジンです。詳細については、https://podman.io/ をご覧ください。

Podman では、ルートレスコンテナやルートフルコンテナをデプロイできます。ルートレスコンテナは管理者権限を持たないユーザーでも実行でき、ルートフルコンテナは root 権限で実行するコンテナです。 ルートレスコンテナが提供する主な利点は、コンテナが侵害されたときに潜在的な攻撃者がホストの root 権限を取得できないことです。 Datadog Agent は、ルートレスコンテナとルートフルコンテナの両方で動作します。

要件

  • Podman バージョン >= 3.2.0
  • Datadog Agent バージョン >= 7.30.0

Podman ルートレスコンテナとしての Agent デプロイ

Agent をルートレス Podman コンテナとしてデプロイするために実行するコマンドは、Docker で使用されるコマンドと似ています。

主な違いは、Agent はランタイムソケットにアクセスできないため、必要なコンテナ情報を抽出するために Podman DBに依存することです。そのため、Docker ソケットをマウントして DOCKER_HOST を設定する代わりに、Podman DB をマウントする必要があります (以下のコマンドでは <PODMAN_DB_PATH>)。 システムによっては Podman DB のパスは $HOME/.local/share/containers/storage/libpod/bolt_state.db ですが、お使いのシステムでは違うかもしれません。以下のコマンドで <PODMAN_DB_PATH> を適宜設定してください。

$ podman run -d --name dd-agent \
    --cgroupns host --pid host \
    -v <PODMAN_DB_PATH>:/var/lib/containers/storage/libpod/bolt_state.db:ro \
    -v /proc/:/host/proc/:ro \
    -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
    -e DD_API_KEY=<API_KEY> \
    -e DD_HOSTNAME=<DD_HOSTNAME> \
    gcr.io/datadoghq/agent:latest

Agent は、Podman コマンドを実行した非管理ユーザーが管理するコンテナをすべて検出し、すべてのコンテナに対して container.* メトリクスを発行する必要があります。

Podman ルートフルコンテナとしての Agent デプロイ

ルートフルコンテナを実行する場合、上記のルートレスコンテナの例のように Podman DB に依存するか、Podman ソケットを使うかの 2 つの選択肢があります。

Podman DB の使用

DB を使って実行するコマンドは上述のものと同一ですが、DB のパスはユーザーごとに異なることに注意してください (root を含む)。root の場合、通常は /var/lib/containers/storage/libpod/bolt_state.db ですが、お使いのシステムでは異なるかもしれませんので、<PODMAN_DB_PATH> を適宜設定してください。

Podman ソケットの使用

Podman ソケットは Docker ソケットと互換性があります。そのため、この場合、Datadog Agent は Docker 上で動作しているかのようにすべてを実行します。これは、例えば docker.* メトリクスを発行することを意味します。

Podman ソケットに依存する Agent をデプロイするには、root で以下を実行します。

$ podman run -d --name dd-agent \
    --cgroupns host --pid host \
    -v /run/podman/podman.sock:/run/podman/podman.sock:ro \
    -v /proc/:/host/proc/:ro \
    -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
    -e DD_API_KEY=<API_KEY> \
    -e DD_HOSTNAME=<DD_HOSTNAME> \
    -e DOCKER_HOST=unix:///run/podman/podman.sock \
    gcr.io/datadoghq/agent:latest

どちらの場合も、Agent は root が管理するすべてのコンテナを検出し、すべてのコンテナに対して container.* メトリクスを出力する必要があります。