2017-01-19 13 views
18

私はKubernetesのルーキーだと推測されるので、私の用語の使用が正しくない場合は私を許してください。それでも、私の質問の意図がはっきりしていることを願っています。なぜステートフルセット?ステートレスポッドは永続的なボリュームを使用できませんか?

私はStateful Setsの周りに私の頭を包み込みたいです。永続的ボリュームを持つ「ステートレス」ポッドの使用とはどのように使い分けられますか?つまり、「通常の」Podが永続的なストレージにクレームしていると仮定すると、この新しい構成(注文されたスタート/ストップなど)を必要とする明らかなものは何ですか?

答えて

32

はい、通常のポッドでは、固定ボリュームを使用できます。しかし、論理的に "グループ"を構成する複数のポッドがあることがあります。例として、データベースレプリカ、ZooKeeperホスト、カフカノードなどがあります。これらのすべてのケースでは、多数のサーバがあり、それらは協力してお互いに話しています。彼らにとって特別なのは、グループ内の各個人がアイデンティティを持っていることです。たとえば、データベースクラスタの場合、1つはマスターであり、2つはフォロワーであり、フォロワーのそれぞれはマスターと通信して、自分が所有しているものと同期していないものを知らせます。したがって、フォロワーは "db-x-0"がマスターであり、マスターは "db-x-2"がフォロワーであり、すべてのデータを特定のポイントまで持っているが、それ以上のデータを必要としていることを知っています。このような状況で

あなたは簡単に通常のポッドから得ることができないいくつかのことを必要とする:

  1. 予測可能な名前:あなたはどこに形成することができるように、お互いを見つけるためにそれらを伝えるあなたのポッドを開始したいです指導者などを選出することができますが、そのためには事前に名前を知る必要があります。通常のポッド名はランダムなので、あらかじめそれらを知ることはできません。
  2. 安定したアドレス/ DNS名:ステップ(1)で使用できる名前が同じであればどれでもかまいません。通常のポッドが再起動すると(再デプロイしたホストが別のホストで実行中など)、別のホストに新しい名前と新しいIPアドレスが割り当てられます。
  3. グループの個人とその持続的なボリューム間の永続的リンク:データベースのマスターの1を実行していたホストが死亡した場合、それが新しいホストに移動しますよしかし同じ永続的なボリュームに接続する必要がありますその「個人」のための適切なデータを含む唯一の1つのボリュームが存在するためです。たとえば、同じ個人に(DNS名とIPアドレスで)同じ3つのデータベースホストのグループを再デプロイして、同じ永続ボリュームを取得して、マスターが依然としてマスターであり、依然として同じデータを持つ場合、レプリカ1はそれを取得します

    1. 安定した、独自のネットワーク識別子を:彼らは(https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/から引用)提供するため、データ等は、

    StatefulSetsは、これらの問題を解決します。

  4. 安定した永続ストレージ。
  5. 整然とした、優雅な展開とスケーリング。
  6. 整然とした、優雅な削除と終了。

私は実際には(3)と(4)について話しませんでしたが、クラスタに役立つこともあります。最初のものをマスターにして次のものを最初に見つけてマスターなど

一部の人が指摘しているように、通常のポッドとサービスを使用することで、同じ利点のを実際に行うことができますが、はるかに多くの作業が可能です。たとえば、3つのデータベースインスタンスが必要だった場合、手動で3つの展開と3つのサービスを作成できます。デプロイメント内の単一のポッドにサービスポイントを設定することはできないため、という3つのデプロイメントを手動で作成する必要があります()。次に、別の展開と別のサービスを手動で作成してスケールアップします。これはうまくいき、PetSet/PersistentSetが登場する前のやや一般的な方法でした。上に挙げた利点(永続的なボリュームマッピング&固定の開始順序など)の一部が欠落していることに注意してください。

+2

これは、私が必要としていたことを正確に伝える非常に明確な答えです。まあ、ありがとう! –

+0

これをちょっと消化してください。完全性のために、Kubernetes Servicesは私に(あなたの)1と2をくれませんか? (私は(あなたの)3はユニークです)私はすべての私の(関連する)ポッドをサービスの前に置くことはできません。そうすれば、予測可能な名前と住所を得ることができますか? –

+1

persistentVolumeをあるノードから別のノードに手動で移動する必要があります。 StatefulSetは、persistentVolumeをポッドと共に動かすこともします。 – iamnat

関連する問題