導入
Deployment は「どのノードでもいい、同じ Pod を指定数」というアプリ向けでした。しかし用途によっては別のワークロードが向きます。「全ノードに1個ずつ」の DaemonSet と、「安定した名前と保存領域が要る」StatefulSet を紹介します。
説明
DaemonSet(デーモンセット) は、クラスタの全ノードに、その Pod をきっかり1個ずつ配置します。ノードが増えれば自動で1個増やし、減れば減らします。ノードごとに常駐させたい裏方――ログ収集エージェント、監視エージェント、ネットワーク補助――に使います。
graph TB
DS[DaemonSet]
subgraph n1["ノード1"]
A1[エージェントPod]
end
subgraph n2["ノード2"]
A2[エージェントPod]
end
subgraph n3["ノード3"]
A3[エージェントPod]
end
DS --> A1
DS --> A2
DS --> A3
StatefulSet(ステートフルセット) は、状態(データ)を持つアプリ向けです。ステートフル(stateful) とは「状態を保持する」という意味で、データベースのように「前回の続き」を覚えている必要があるものを指します(対して、状態を持たない使い捨て可能なものは ステートレス)。StatefulSet の Pod は、db-0・db-1・db-2 のように序数付きの安定した名前を持ち、それぞれ専用の永続ストレージを保ったまま作り直されます。
3つのワークロードの使い分けはこうです。
| 主な用途 | Podの性格 | 例 | |
|---|---|---|---|
| Deployment | 状態を持たない普通のアプリ | どれも同じ・使い捨て可 | Webサーバー・API |
| DaemonSet | 全ノードに常駐させる裏方 | 各ノードに1個 | ログ・監視エージェント |
| StatefulSet | 状態を持つアプリ | 名前と保存領域が安定 | データベース |
迷ったら Deployment、というのが基本です。DaemonSet と StatefulSet は「全ノードに1個ずつ要る」「安定した名前と永続データが要る」というはっきりした理由があるときに選びます。