StatefulSets: Kubernetes でのステートフル アプリケーションの実行
Deployment はステートレス アプリケーションのデフォルトのワークロード コントローラーです。各ポッドは同一で交換可能なため、自由にスケールアップ/スケールダウンできます。しかし、データベース、メッセージ ブローカー、分散システムでは、各インスタンスに独自の identity、独自の storage、および意味のある起動/シャットダウン順序が必要です。これが、StatefulSet が存在する理由です。
StatefulSet とデプロイメント__HTMLTAG_74___
デプロイメントを使用する場合
- ステートレス アプリケーション: Web サーバー、API サービス、マイクロサービス
- すべてのポッドはあらゆるリクエストを処理できます__HTMLTAG_81___
- 各ポッドに個別の永続ストレージは必要ありません
- 操作に影響を与えることなくポッドをランダムに交換可能
_StatefulSet を使用する場合
- アプリケーションには安定したネットワーク ID が必要です (ポッド名は変更されません)
- 各ポッドには独自の永続ストレージ (プライマリ、レプリカ-1、レプリカ-2) が必要です
- 展開、スケーリング、削除の重要な順序__HTMLTAG_95___
- 予測可能な DNS 名に基づくピア検出
- ユースケース: PostgreSQL、MySQL クラスター、Redis クラスター、Kafka、Zookeeper、Elasticsearch
視覚的な比較
コードブロック_0
StatefulSet の保証
安定したポッド ID
StatefulSet 内の各ポッドには、__HTMLTAG_108___{statefulset-name}-{ordinal} のパターンに従って名前が付けられます。序数は 0 から始まり、徐々に増加します。 Pod が削除されて再作成された場合でも、同じ ID を受け取ります (postgres-1 は常に postgres-1 です)。
ヘッドレス サービスによる安定したネットワーク ID
StatefulSet では、各ポッドの DNS エントリを作成するためにヘッドレス サービス (ClusterIP: なし) が必要です。ヘッドレス サービスでは、DNS はクラスター IP をポイントせず、ポッド IP を直接ポイントします。
コードブロック_1
ヘッドレス サービスでは、DNS レコードが次のパターンに従って作成されます:
postgres-0.postgres.production.svc.cluster.localpostgres-1.postgres.production.svc.cluster.localpostgres-2.postgres.production.svc.cluster.local
これにより、複雑なサービス検出を必要とせずに、Pod が相互に決定的に検索できるようになります。
StatefulSet: PostgreSQL の例
コードブロック_2
コードブロック_3
StatefulSet: Redis クラスターの例
コードブロック_4
コードブロック_5
StatefulSet: Strimzi 演算子を使用した Kafka
Strimzi の紹介
Kafka は Zookeeper (バージョン 3.x まで) に依存しており、多くの複雑な構成があるため、StatefulSet を使用して純粋な Kafka を実行するのは複雑です。 Strimzi Operator は、Kubernetes 上で Kafka クラスターをデプロイおよび管理し、複雑さを抽象化するのに役立つ特殊なオペレーターです。
コードブロック_6
コードブロック_7
コードブロック_8
更新戦略
ローリングアップデート (デフォルト)
コードブロック_9
コードブロック_10
_削除時戦略
コードブロック_11
コードブロック_12
CloudNativePG: PostgreSQL の新しい標準
CloudNativePG を使用する理由
PostgreSQL 専用の StatefulSet では、ストリーミング レプリケーションのセットアップ、フェイルオーバー、バックアップ管理、監視など、依然として多くの手動作業が必要です。 CloudNativePG (CNPG) は、Kubernetes 上の PostgreSQL 向けに特別に設計された CNCF プロジェクト (Sandbox 2022、Incubating 2024) です。
コードブロック_13
コードブロック_14
コードブロック_15
プレーンな StatefulSet の代わりに演算子を使用するのはどのような場合ですか?
StatefulSet Pure Match の場合:
- シンプルなアプリケーション、大規模データベースのような複雑な必要はありません__HTMLTAG_169___
- レプリケーションとフェイルオーバーを自分で管理するのに十分な専門知識をお持ちですか__HTMLTAG_171___
- 展開のあらゆる側面を最大限に制御する必要がある
- _アプリケーションには成熟した演算子がありません__HTMLTAG_175___
演算子が適切な場合:
- データベース/ステートフル システム コンプレックス: PostgreSQL、MySQL、Kafka、Elasticsearch
- 自動フェイルオーバー、バックアップ、復元が必要
- チームには特定のシステムに関する深い専門知識がありません
- _2 日目の操作を自動化したい (アップグレード、スケーリング、証明書)
推奨演算子 (2026)
- PostgreSQL: CloudNativePG (CNCF インキュベート) — 本番環境に対応したアクティブな開発
- MySQL: Oracle の MySQL Operator または MySQL 用 Percona Operator
- Kafka: Strimzi (CNCF Incubating) — 成熟した、機能豊富
- Redis: OpsTree または Spotahome による Redis オペレーター
- Elasticsearch/OpenSearch: ECK (Elastic Cloud on Kubernetes) または OpenSearch Operator
- MongoDB: MongoDB コミュニティ オペレーター
概要__HTMLTAG_218___
StatefulSet は、Kubernetes のステートフル ワークロードに不可欠なツールですが、純粋な StatefulSet をいつ使用するか、および Operator をいつ使用するかを理解することが重要です:
- StatefulSet は、安定した ID、順序付けされた操作、ポッドごとの永続ストレージを保証します — ステートフル アプリに必要なもの__HTMLTAG_225___
- ヘッドレス サービスは、ピア検出用のDNSレコードを作成する必要があります
- volumeClaimTemplates 各ポッドのプライベート PVC が自動的に作成されます - 共有ストレージはありません
- 順序付けられた展開/削除:展開時は0→N、スケールダウン時はN→0 — 分散システムの安全性を確保__HTMLTAG_237___
- _パーティションのローリング更新 により、StatefulSet を使用したカナリア デプロイが可能
- CloudNativePG は、2026 年の K8 での PostgreSQL 運用に最適な標準です
- 複雑なデータベースの場合、__HTMLTAG_247___オペレーター時間を大幅に節約し、運用リスクを軽減__HTMLTAG_249___