Kubernetes は、コンテナ・オーケストレーションのデファクト・スタンダードとなっており、コンテナ化されたアプリケーションを大規模に管理するためのさまざまなツールを提供しています。Deployment と StatefulSet は、コンテナ化されたワークロードを効果的にオーケストレーションおよびスケーリングするのに役立つ 2 つの強力なツールです。どちらもデプロイメントを管理しますが、ステートレスおよびステートフル・アプリケーション向けに設計された独自の機能を備えています。
この記事では、Deployment と StatefulSet の主な違い(それぞれのベスト・プラクティスを含む)を解説し、ニーズに応じて適切なアプローチを選択できるようにします。
Deployment とは
Deployment は、ステートレス・アプリケーションの管理に使用される Kubernetes のリソース・オブジェクトです。アプリケーションの更新に対して宣言的なアプローチを提供します。必要な状態(ポッドの数、コンテナ・イメージなど)を指定し、Kubernetes がその状態を達成します。これにより、アプリケーション管理が簡素化され、デプロイメントが合理化されます。
Deployment の主なメリット:
- ローリング・アップデート:Deployment の大きなメリットは、ローリング・アップデートの実行能力です。この機能により、古いポッドを新しいポッドに徐々に置き換えることで、最小限のダウンタイムでアプリケーションを更新できます。これにより、高可用性を確保し、アップグレード中の中断を最小限に抑えることができます。
- レプリカ管理:Deployment はレプリカ・セットとして機能し、目的の数のアプリケーション・ポッド・レプリカがクラスタ内で常に実行されていることを保証します。ポッドに障害が発生したり、不健全な状態になった場合、Deployment は自動的に新しいレプリカを起動し、指定された数を維持します。
- 自己修復機能:Deployment は、自己修復動作を備えています。ポッドが故障またはクラッシュした場合、Deployment は問題を検出し、自動的に交換用ポッドを起動します。これにより、ポッド障害が発生した場合でもアプリケーションが機能し続けます。
- 宣言型構文:Deployment では、宣言型構文を使用します。YAML ファイルまたは JSON ファイルを使用してアプリケーションの望ましい状態を定義し、Kubernetes は基礎となるインフラを処理してその状態を実現します。
StatefulSet とは
StatefulSet は、ステートフル・アプリケーションの管理に使用される Kubernetes のリソースです。Deployment はステートレス・アプリケーションの管理に優れていますが、Kubernetes では特定の要件を持つステートフル・アプリケーション向けに StatefulSet が提供されています。StatefulSet は、ポッドのライフサイクルの発注と独自性を保証し、次のようなアプリケーションに最適です。
- 安定したネットワーク ID:StatefulSet によって管理される各ポッドには、固有で永続的なネットワーク識別子が割り当てられます。この識別子は、ポッドがクラスタ内の別のノードに再スケジュールされていても一定です。これは、データベースなどの、通信のために特定のネットワーク・アドレスに依存するアプリケーションにとって重要です。
- 順序制御された更新:StatefulSets ポッドは、あらかじめ決められた順序で作成、スケール、削除されるため、デプロイメント中のアプリケーションの適切な初期化と正常なシャットダウンが可能になります。これにより、中断やデータ損失を最小限に抑えます。
- 永続ストレージの統合:StatefulSets は、Persistent Volume Claim(PVC)とシームレスに統合します。PVC はストレージ・リソースの要求として機能し、ポッドの再起動や再スケジュールを乗り越える永続ストレージへのアクセスを可能にします。これにより、ステートフル・アプリケーションは、ポッドのライフサイクル全体でデータを維持します。
比較:Deployment と StatefulSet
Kubernetes ワークロードの管理に適したアプローチを選択するには、Deployment と StatefulSet の根本的な違いを理解することが必要です。考慮すべき主な要素を以下にまとめます。
- アプリケーション・タイプ:Deployment は、各インスタンスを同一として処理できるステートレス・アプリケーション向けに設計されています。StatefulSets は、永続ストレージと安定したネットワーク ID を必要とするステートフル・アプリケーション向けに構築されています。
- ポッドとネットワーク ID:Deployment により、ポッドは交換可能として扱われます。ポッドは、アプリケーション全体の機能に影響を与えることなく、再起動または再スケジュールできます。これは、各ポッド・インスタンスが独立して動作し、一意の ID を保持していないためです。
一方、StatefulSets は、各ポッドにユニークで安定した ID を提供します。この予測可能な ID は、一貫したネットワーク・アドレスや特定のポッド・インスタンスに依存するデータベースなどのステートフル・アプリケーションに不可欠です。
- ストレージ:Deployment はエフェメラル・ストレージ(一時的なストレージ)を使用します。つまり、ポッドの再起動や再スケジュール時に、ポッドに保存されたデータが失われます。これは、永続データ・ストレージを必要としないステートレス・アプリケーションに受け入れられます。StatefulSet は、PVC を活用して、ポッドの再スケジュール全体でデータの永続性を保証します。PVC はストレージ・リソースの要求として機能し、ポッドの再起動やノード間の移動に耐える永続ストレージへのアクセスを可能にします。これにより、ステートフル・アプリケーションがポッドのライフサイクル全体でデータを維持できます。
- スケーリングと更新:Deployment は、柔軟なスケーリング・アプローチを提供します。新しいポッドは、保証された注文なしで、その場で追加または削除できます。StatefulSet は、制御された順序でデプロイメントとスケーリング操作を実行します。ポッドの作成、更新、削除はあらかじめ決められた順序で行われ、デプロイメント中のアプリケーションの適切な初期化と正常なシャットダウンを可能にします。
Deployment と StatefulSet:適切なオプションの選択
Deployment と StatefulSet の主な違いを理解したところで、特定のアプリケーションに適したアプローチを選択する際に考慮すべき主なポイントを以下に示します。
アプリケーションのステートフルネス
アプリケーションはステートレスですか、ステートフルですか? アプリケーションが各ポッド・インスタンスを交換可能として扱い、データの永続ストレージを必要としない場合は、Deployment が理想的な選択肢です。Web サーバーやマイクロサービスなどのステートレス・アプリケーションは、Deployment の柔軟なアプローチを使用して容易に拡張および更新できます。
再起動や再スケジュール時に状態(データ)を維持するために永続ストレージが必要なアプリケーションでは、StatefulSets が最適です。さらに、アプリケーションが他のサービスとの通信に安定したネットワーク ID に依存している場合は、StatefulSets が必要です。データベース、メッセージ・キュー、クラスタ化されたアプリケーションは全て、StatefulSet が提供する安定性と順序付けられた操作を必要とするステートフル・アプリケーションの代表的な例です。
ポッドの識別要件
ステートレス・アプリケーションでは、一般的にポッドに固有の ID は必要ありません。これらのシナリオでは、ポッドを交換可能として扱う Deployment で十分です。
ステートフル・アプリケーションは、再起動全体で一意の ID を維持するためにポッドに依存することがよくあります。StatefulSets は、これらの固有の ID を保証し、アプリケーションがデータに一貫してアクセスおよび管理できるようにします。
ストレージに関する考慮事項
ポッドの再起動時に失われるエフェメラル・ストレージがアプリケーションに十分である場合、Deployment はコンテナ管理に適したオプションとなります。それ以外の場合は、StatefulSets は、PVC を活用した、アプリケーションに永続ストレージを提供する理想的なオプションです。
更新とスケーリングのニーズ
アプリケーションを特定の順序でスケールする必要がある場合は、StatefulSets がそれを提供します。Kubernetes Deployment は、コンテナが相互依存しておらず、注文に関係なく削除または追加できる場合に理想的なオプションです。
まとめ
Kubernetes ワークロードを効果的に管理するには、Deployment と StatefulSet の違いを理解することが不可欠です。迅速なスケーリングと更新を必要とするステートレス・アプリケーションには、Deployment が理想的です。StatefulSets は、永続ストレージと安定した ID を必要とするステートフル・アプリケーションに不可欠です。
アプリケーションの要件を慎重に評価することで、最適な性能と信頼性を確保するために適切な Kubernetes リソースを選択できます。Portworx のような Kubernetes 向けの永続ストレージを提供する包括的なソリューションをご検討ください。