Kubernetesのデプロイとステートフルセット


110

私はKubernetesで多くの掘り出し物をしてきました、そして私は私がよく見るものを好みます!私が明確なアイデアを得ることができなかった1つのことは、DeploymentリソースとStatefulSetリソースの正確な違いは何であり、どのシナリオでそれぞれを使用するかです(または、一般的にどちらが優先されるか)。

人々が共有できるあらゆる経験は素晴らしいでしょう!!

回答:


113

DeploymentとReplicationControllerは、ステートレスな使用を目的としており、かなり軽量です。StatefulSetは、状態を永続化する必要がある場合に使用されます。したがって、後者はvolumeClaimTemplates永続ボリュームに対して/を使用して、コンポーネントの再起動後も状態を維持できるようにします。

アプリケーションがステートフルである場合、またはKubernetesの上にステートフルストレージをデプロイする場合は、StatefulSetを使用してください。

アプリケーションがステートレスである場合、または開始時にバックエンドシステムから状態を構築できる場合は、Deploymentsを使用します。

ステートフルアプリケーションの実行の詳細については、2016年kubernetesのステートフルアプリケーションに関するブログエントリをご覧ください。


16
デプロイのポッドを永続的なボリュームクレームに接続して、安全にすることもできます。
Torsten Bronger 2017年

9
@TorstenBronger同意します-その時点で、StatefulSetのポイントは何であるかという最初の質問に戻りますか?
HDave

6
@HDave動的永続ボリュームと急速に開発されているストレージプロバイダー(Portworx、OpenEBSなど)を使用すると、データ永続性の問題は解決できますが、StatefulSetを使用すると命名と起動/アップグレードの順序が異なるため、マスター/スレーブまたはその他のセットアップを必要とするアプリで適切にクラスターを形成します。おそらく、これらすべてを単一の構成にまとめて、deploymentノードごとに1つ(デーモンセット)、レプリカ、またはステートフルな順序を設定する単純な仕様にすることができることに同意します。
Mani Gandham 2017年

4
「起動/アップグレードの順序」がポッドのレプリカ(つまり、1、2、3 ...)であることを認識することが重要です。異なるポッド(つまり、web、srv、dbなど)ではありません。別の言い方をすると、それはdocker-compose依存関係の代わりではありません。
HDave

72
  • デプロイ- すべてのポッドレプリカで共有されるPersistentVolumeClaimを指定します。つまり、共有ボリュームです。

    複数のレプリカポッドがある場合、バッキングストレージには明らかにReadWriteManyまたは ReadOnlyMany accessModeが必要です。

  • StatefulSet- volumeClaimTemplatesを指定して、各レプリカポッドに 関連付けられた一意のPersistentVolumeClaimを取得します。つまり、共有ボリュームはありません。

    ここで、バッキングストレージはReadWriteOnce accessMode を持つことができます。

    StatefulSetは、Hadoopクラスター、MySQLクラスターなど、クラスター内で物事を実行するのに役立ちます。各ノードには独自のストレージがあります。


23

TL; DR

デプロイは、ステートレスアプリケーションをデプロイするためのリソースです。PVCを使用する場合、すべてのレプリカは同じボリュームを使用し、どのボリュームにも独自の状態はありません。

ステートフルセットはステートフルアプリケーションに使用され、ポッドの各レプリカは独自の状態を持ち、独自のボリュームを使用します。

DaemonSetは、ポッドがクラスターのすべてのノードで実行されるようにするコントローラーです。ノードがクラスターに追加/クラスターから削除されると、DaemonSetはポッドを自動的に追加/削除します。

Deployments、StatefulSets&Daemonsetsの詳細な違い、およびこれらのリソースK8を使用してサンプルアプリケーションをデプロイする方法について説明しました:Deployments vs StatefulSets vs DaemonSets


4
あなたのコメントをフォローアップすると、2つの違いは、1つはポッド固有のストレージを指定する(したがって、ポッド固有の状態を永続化する)ことができる一方で、もう1つは指定しない(したがって、サービスのみを永続化できる)ことです-ワイド状態)。その意味で、サービスレベルでは、どちらもステートフルと見なすことができます。ただし、ポッドレベルでは、ステートフルセットのみがステートフルです。
キャベツ

14

ステートフルセット

各ノードに永続的な状態が必要なステートフル分散アプリケーションで「StatefulSet」を使用します。StatefulSetは、構成(レプリカ= N)を介して、ステートフルアプリケーション/コンポーネントの任意の数のノードを構成する機能を提供します。

ステートフル分散アプリケーションには、マスターマスターとマスタースレーブの2種類があります。マスターマスター構成のすべてのノードとマスタースレーブ構成のスレーブノードは、StatefulSetを使用できます。
例:
マスター-スレーブ-> Hadoopクラスターのデータノード(スレーブ)
マスター-マスター-> Cassandraクラスターのデータベースノード(マスター-マスター)

StatefulSetの各ポッド(レプリカ/ノード)には、一意で安定したネットワークIDがあります。たとえば、名前が「cassandra」でレプリカノードの数がNのCassandra StatefulSetでは、各Cassandraポッド(ノード)に次のようになります。

  • 各ポッドの序数インデックス:0、1、..、N-1
  • 安定したネットワークID:cassandra-0、cassandra-1、..、cassandra-N-1
  • ボリュームクレームテンプレートに対する各ポッドの個別の永続ボリューム、つまりすべてのポッド(ノード)の個別のストレージ
  • ポッドは0からN-1の順序で作成され、逆の順序N-1から0で終了します

参照:https : //kubernetes.io/docs/concepts/workloads/controllers/statefulset/

配備

一方、「デプロイメント」は、ノードが特別なIDを必要としないステートレスアプリケーション/サービスに適しています。ロードバランサーは、選択した任意のノードに到達できます。すべてのノードは同じです。Deploymentは、構成(レプリカ= N)を通じて任意の数の任意のノードを作成するのに役立ちます。


7

StatefulSetとデプロイメントの違い

StatefulSetは特別なデプロイメントと同等です。StatefulSetの各ポッドには、クラスター内の他のメンバーを検出するために使用できる安定した一意のネットワーク識別子があります。StatefulSetの名前がKafkaの場合、最初のポッドはKafka-0と呼ばれ、2番目のポッドはKafka-1と呼ばれます。StatefulSetによって制御されるポッドコピーの開始および停止シーケンスが制御されます。n番目のポッドが操作されると、最初のN-1ポッドはすでに実行中で、良好な状態です。StatefulSetのポッドは、PVまたはPVCによって実装される安定した永続ストレージボリュームを使用します。ポッドを削除しても、StatefulSetに関連付けられているストレージボリュームはデフォルトでは削除されません(データセキュリティのため)。StatefulSetはPVボリュームにバインドされるようにバインドされています。ポッドの状態データを格納するために使用されます。また、ヘッドレスサービスに属することが宣言された、ヘッドレスサービスと組み合わせて使用​​されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.