Chuyển đến nội dung chính

レッスン 12: ステートフルセット

ステートフル アプリケーションの StatefulSet: データベース、メッセージ ブローカー、分散システム。安定したネットワーク ID、順序付けられたデプロイメント/スケーリング、ポッドごとの永続ストレージ。 PostgreSQL、Kafka、Redis Cluster の使用例。

🔒 DevSecOps — レッスン 12 レッスン 12: ステートフルセット

KUBERNETES: 基本から高度まで

モジュール 3: 構成とストレージ

xdev.asia_

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.local
  • postgres-1.postgres.production.svc.cluster.local
  • postgres-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___