1. ホーム
  2. kubernetes

[解決済み] なぜStatefulSetsなのか?ステートレスPodは永続ボリュームを使えないのですか?

2023-02-15 09:45:34

質問

私は、以下のことを理解しようとしています。 ステートフル セット . その使用方法は、Persistent Volume を持つ "stateless" Pods の使用方法とどのように違うのでしょうか? つまり、quot;normal" Pod が永続ストレージを要求できると仮定すると、この新しい構造(順序付けられた開始/停止など)を必要とする、どのような明白なことを私は見逃していますか?

どのように解決するのですか?

はい、通常のポッドは永続ボリュームを使用できます。しかし、論理的に 1 つのグループを形成する複数の Pod がある場合があります。この例としては、データベース レプリカ、ZooKeeper ホスト、Kafka ノードなどが挙げられます。これらすべての場合において、サーバーの束があり、それらは一緒に動作し、互いに会話します。特別なのは、グループ内の各個人がIDを持っていることです。例えばデータベースクラスタの場合、1台がマスター、2台がフォロワーで、各フォロワーはマスターと通信して、同期したものとしていないものを知らせます。従者は、"db-x-0"がマスターで、マスターは"db-x-2"が従者で、ある時点までのすべてのデータを持っているがそれ以降のデータがまだ必要だということを知っているわけだ。

このような状況では、通常のポッドから簡単には得られないいくつかのものが必要です。

  1. 予測可能な名前: クラスターを形成したり、リーダーを選出したりするために、ポッドに互いを見つける場所を教えて起動したいのですが、それを行うには事前に名前を知っておく必要があります。通常のポッド名はランダムなので、事前に知ることはできません。
  2. 安定したアドレス/DNS名: ステップ(1)で利用可能だったどんな名前も同じままであってほしい。通常のポッドが別のホストで再起動した場合(再デプロイした、起動していたホストが死んだ、など)、新しい名前と新しいIPアドレスを取得することになります。
  3. 永続的な リンク グループ内の個人とその永続的なボリュームとの間のリンクです。 データベースマスターが動作していたホストが死んだ場合、新しいホストに移動されますが 同じ に接続する必要があります。その個人の適切なデータを含むボリュームは1つだけだからです。たとえば、3 台のデータベース ホストのグループを再展開する場合、同じ個人 (DNS 名と IP アドレスによる) が同じ永続ボリュームを取得するようにし、マスターはマスターのまま同じデータを持ち、レプリカ 1 はそのデータを取得します。

ステートフルセットは、これらの問題を解決します。 https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ ):

  1. 安定した、ユニークなネットワーク識別子です。
  2. 安定した、永続的なストレージ。
  3. 順序よく、優雅なデプロイとスケーリング。
  4. 順番に、優雅に削除と終了を行います。

(3)と(4)についてあまり話しませんでしたが、最初にデプロイしたものをマスターにするように指示し、次のものは最初のものを見つけてマスターとして扱うなど、クラスタでも役に立ちそうです。

何人かが指摘したように、確かに いくつかの を使用することができますが、より多くの作業が必要です。例えば、3つのデータベースインスタンスが必要な場合、3つのデプロイメントと3つのサービスを手動で作成することができます。手動で 3つのデプロイメント サービスをデプロイメント内の 1 つのポッドを指すようにすることはできないからです。それから、スケールアップするために、別のデプロイメントと別のサービスを手動で作成する必要があります。これは動作しますし、PetSet/PersistentSetが登場する前は、ある程度一般的な方法でした。これは、上記の利点のいくつかが欠けていることに注意してください (たとえば、永続的なボリューム マッピングとランプ、固定された開始順序など)。