【ITニュース解説】DaemonSet vs Deployment in Kubernetes: Key Differences Explained with Docker
2025年09月04日に「Dev.to」が公開したITニュース「DaemonSet vs Deployment in Kubernetes: Key Differences Explained with Docker」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
KubernetesのDeploymentは、Podのレプリカ数を指定し、スケーラブルなアプリに最適。DaemonSetは、各ノードにPodを1つずつ配置し、ログ収集や監視エージェントなど、ノードごとの処理が必要な場合に有効。両者ともDockerイメージを元にコンテナを動かすが、Podの配置戦略が異なる。
ITニュース解説
KubernetesにおけるDeploymentとDaemonSetは、どちらもコンテナ化されたアプリケーションをクラスタ上で実行するための仕組みだが、その目的と動作は大きく異なる。Deploymentは、ステートレスなアプリケーションを管理し、スケーリングやアップデート、ロールバックを容易にする。一方、DaemonSetは、クラスタ内のすべてのノード(または特定のノード)にPodのコピーを確実に配置する。
Deploymentは、ウェブサーバーやAPIサーバー、バックエンドサービスのようなステートレスなアプリケーションに最適だ。Deploymentを使うと、常に指定された数のPodレプリカが実行されることが保証される。また、ローリングアップデートとロールバックがサポートされているため、ダウンタイムなしでアプリケーションを更新できる。Podはクラスタ内の任意のノードにスケジュールされるため、リソースの利用効率を高めることができる。水平方向へのスケーリングが容易なため、トラフィックの増加に応じてPodの数を増やすことができる。
DaemonSetは、クラスタ全体で実行する必要があるワークロードに適している。例えば、ログ収集エージェント(FluentdやLogstashなど)、メトリクス収集ツール(Prometheus Node Exporterなど)、CNIプラグイン、ストレージデーモンなどが挙げられる。DaemonSetは、各ノードに必ず1つのPodを配置することを保証する。新しいノードがクラスタに追加されると、自動的にPodが追加され、ノードが削除されるとPodも削除される。これにより、クラスタ全体にわたる一貫したサービス提供が可能になる。
DeploymentとDaemonSetの主な違いは、Podの配置方法とスケーリング方法にある。Deploymentは、必要に応じてPodを任意のノードに配置し、レプリカ数を調整することでスケーリングを行う。一方、DaemonSetは、各ノードに1つのPodを配置することを基本とし、ノード数の増減に合わせて自動的にPodの数が調整される。
Deploymentは、ステートレスなアプリケーションのスケーラビリティと可用性を重視する場合に選択する。DaemonSetは、クラスタ全体のノード上で実行する必要があるエージェントやサービスを管理する場合に選択する。
Dockerとの関連性について説明する。KubernetesのPodは、コンテナをラップするものであり、実際にはDocker(またはcontainerdやCRI-Oなどのコンテナランタイム)がコンテナを実行する。Deploymentは、指定されたDockerイメージ(例えば、nginx:latest)に基づいて複数のレプリカをクラスタ全体に分散させる。DaemonSetは、各ノードにDockerイメージ(例えば、ログシッパーやモニタリングエージェント)のインスタンスを1つずつ実行させる。kubectl applyコマンドでDeploymentまたはDaemonSetを適用すると、Kubernetesは指定されたDockerイメージをダウンロードし、コントローラのルールに従ってPod内で実行する。
つまり、Docker(または他のコンテナランタイム)は、コンテナのパッケージングと実行を提供する。KubernetesのDeploymentやDaemonSetのようなコントローラは、これらのコンテナをクラスタ全体でどのように、どこに、何回実行するかを決定する。
まとめると、スケーラブルなステートレスアプリケーションを任意のノードで実行する必要がある場合はDeploymentを使用し、ロギング、モニタリング、ネットワーキング、ストレージなどのノードごとのエージェントまたはサービスが必要な場合はDaemonSetを使用する。どちらも、アプリケーションとその依存関係をパッケージ化するDockerイメージ(またはOCI互換イメージ)の上に構築されている。