Member-only story

ポッドごとにユニークなコンフィグを持つKubernetesのStatefulSet初期化

gavin.zhou
10 min readSep 7, 2021

--

ステートフルアプリケーションでポッドごとに固有の構成をマウントする方法(例:マスターとスレーブのデータベースポッドに別々の構成をマウントする方法)

KubernetesのStatefulSetsは、以下の1つ以上の項目を必要とするステートフルなアプリケーションを管理するために使用されます。

・ 安定した一意のネットワーク識別子

・ 安定した永続的なストレージ

・ 秩序あるグレースフルなデプロイとスケーリング

・ 秩序ある自動ローリングアップデート

実際には、データベース(MySQL、PostgreSQL、Redis、Elasticsearchなど)をKubernetes上にデプロイするために、StatefulSetsが最もよく使われます。Kubernetesの宣言的な性質により、レプリケートされたステートフルなアプリケーションを簡単に実行することができます。例えば、データベースのために複数の読み取り専用レプリカを実行する必要がある場合、ステートフルセットを使用してレプリカごとに同じ構成をマウントすることができます。

しかし、StatefulSetクラスタ内の各ポッドごとに異なるコンフィグレーションを実行する必要がある場合はどうなるでしょうか。よくあるのは、マスターノード(読み書き可能)とスレーブノード(読み取り専用)を区別する必要がある場合です。これは、マスターノードとスレーブノードに別々のStatefulSetを作成することで解決できます。もっと複雑な設定が必要な場合はどうでしょうか。おそらく、ステートフルセットが何らかの分散型元帳ネットワークを実行し、各ステートフルセットが異なる役割を持っているのではないでしょうか(例:Ethereumのフルノード、ライトノード、アーカイブノード)。

これは、同じ役割を持つ異なるStatefulSetポッドが、ネットワーク・トポロジーに応じて異なるパーミッションスキームやデータ同期のニーズを持つ場合のシナリオに拡張することができます(例えば、pod-0はすべてのデータを外部データベースと同期する必要があるのに対し、pod-1はデータのサブセットのみを読み取り、メッセージキューに書き込むことができます)。

現在、Kubernetesは上述のようなユースケースに対応するシンプルなソリューションを提供していません。このように構成ニーズが異なるステートフルセットは、それぞれ別のデプロイメントとして扱うべきだという議論もあります。しかし、私は、様々な役割を持つStatefulSetsのクラスタをグループ化し、それらを簡単に拡張する方法を求めていました。

--

--

No responses yet