Stateful High Availability(HA)Operator を使用すると、GKE の組み込みのリージョン Persistent Disk との統合を使用して、StatefulSet Pod のフェイルオーバーの速度を自動化および制御できます。フェイルオーバー中、オペレーターはノードの障害の検出、障害が発生したノードからのボリュームの切断、フェイルオーバー ノードへの安全なボリューム アタッチメントの確保を自動的に行います。
Stateful HA Operator を使用する理由
高可用性を実現するための一般的なステートフル アーキテクチャでは、ストレージ レイヤとしてリージョン Persistent Disk を使用します。これらのディスクは、リージョン内の 2 つのゾーン間でデータの同期レプリケーションを行います。このアーキテクチャでは、ノードまたはゾーンのネットワーク障害が発生した場合に、ワークロードが(強制接続によって)異なるゾーンに存在する別のノード上のストレージにレプリカをフェイルオーバーできます。
Stateful HA Operator を使用すると、次の最適化を行うことができます。
- 単一レプリカ アプリケーションの復旧時間を改善する: レプリカを 1 つのみ使用する場合は、アプリケーションのプロビジョニング時に Stateful HA Operator を使用してゾーン ストレージをリージョン ストレージに切り替えることができ、ノードに障害が発生した場合のデータの耐久性と可用性が向上します。
- ゾーン間のネットワーキング コストを削減する: 高スループットのアプリケーションでは、複数のゾーン間でデータを複製するとコストが増大する可能性があります。Stateful HA Operator を使用すると、アプリケーションの SLA に適合する代替ゾーンへのフェイルオーバー パスを維持しながら、単一のゾーンでアプリケーションを実行できます。
制限事項
単一レプリカの Stateful HA Operator アーキテクチャでは、GKE はリージョン Persistent Disk を介して 2 つのゾーンにデータを保持しますが、データにアクセスできるのはアプリケーション レプリカが正常な場合に限られます。フェイルオーバー中は、レプリカが新しい正常なノードにスケジュール変更されている間、アプリケーションが一時的に使用できなくなります。アプリケーションの目標復旧時間(RTO)が非常に低い値の場合は、マルチレプリカ アプローチを使用することをおすすめします。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
要件
- クラスタ コントロール プレーンとノードで GKE バージョン 1.28 以降が実行されている必要があります。
- Stateful HA Operator を使用すると、リージョン Persistent Disk を使用するように、リンクされた StatefulSet が自動的に構成されます。ただし、これらのディスクを使用するように Pod が構成され、基盤となるストレージに関連付けられたすべてのゾーンで実行可能であることを確認する必要があります。
- リージョン Persistent Disk でサポートされているマシンシェイプ(E2、N1、N2、N2D)でアプリケーションが実行されていることを確認します。
- Compute Engine Persistent Disk の CSI ドライバが有効になっていることを確認します。Persistent Disk の CSI ドライバは、新しい Autopilot クラスタと Standard クラスタではデフォルトで有効になっており、Autopilot の使用時に無効にするまたは編集することはできません。クラスタから Persistent Disk の CSI ドライバを手動で追加する必要がある場合は、既存のクラスタで Persistent Disk の CSI ドライバを有効にするをご覧ください。
- カスタム StorageClass を使用している場合は、
pd.csi.storage.gke.io
プロビジョナーと次のパラメータを使用して Persistent Disk CSI ドライバを構成します。availability-class: regional-hard-failover
replication-type: regional-pd
Stateful HA Operator を設定して使用する
ステートフル ワークロードに Stateful HA Operator を設定する手順は次のとおりです。
StatefulHA
アドオンを有効にします。- HighAvailabilityApplication リソースをインストールします。
- StatefulSet をインストールします。
- HighAvailabilityApplication リソースを検査します。
StatefulHA
アドオンを有効にする
Stateful HA Operator を使用するには、クラスタで StatefulHA
アドオンを有効にする必要があります。
Autopilot クラスタ: GKE は、クラスタの作成時に
StatefulHA
アドオンを自動的に有効にします。既存のワークロードに Stateful HA Operator を使用する場合は、新しい Autopilot クラスタにワークロードを再デプロイします。Standard クラスタ:
- 新しいクラスタの作成: gcloud CLI の手順に沿って Standard クラスタを作成し、
--add-on=StatefulHA
フラグを追加します。 - 既存の Standard クラスタ: gcloud CLI の手順に沿って Standard クラスタの設定を更新し、
--update-addons=StatefulHA=ENABLED
フラグを使用してアドオンを有効にします。
- 新しいクラスタの作成: gcloud CLI の手順に沿って Standard クラスタを作成し、
アドオンを有効にすると、GKE は standard-rwo-regional
という名前の StorageClass を自動的にインストールします。
HighAvailabilityApplication リソースをインストールする
HighAvailabilityApplication
は、StatefulSet の設定を簡素化し、GKE で Pod の可用性を向上させる Kubernetes リソースです。Stateful HA Operator は GKE の HighAvailabilityApplication
リソースを調整します。
HighAvailabilityApplication
仕様では、HighAvailabilityApplication.spec.resourceSelection.resourceKind
を StatefulSet
に設定する必要があります。
HighAvailability リソースの構成方法については、HighAvailabilityApplication
のリファレンス ドキュメントをご覧ください。
次の PostgreSQL の例をご覧ください。
次のマニフェストを
stateful-ha-example-resource.yaml
という名前のファイルに保存します。kind: HighAvailabilityApplication apiVersion: ha.gke.io/v1 metadata: name: APP_NAME namespace: APP_NAMESPACE spec: resourceSelection: resourceKind: StatefulSet policy: storageSettings: requireRegionalStorage: true failoverSettings: forceDeleteStrategy: AfterNodeUnreachable afterNodeUnreachable: afterNodeUnreachableSeconds: 20
次のように置き換えます。
- APP_NAME: 保護するクラスタ内のアプリケーションの名前。この名前は、HighAvailabilityApplication と StatefulSet の両方で共有する必要があります。
- APP_NAMESPACE: アプリケーションの名前空間。この名前空間は、保護対象の HighAvailabilityApplication と StatefulSet の両方で共有する必要があります。
この例では、次のようになります。
HighAvailabilityApplication.spec.policy.storageSettings.requireRegionalSettings
はtrue
に設定されています。これにより、リージョン ストレージが適用されます。HighAvailabilityApplication.spec.policy.failoverSettings
はAfterNodeUnreachable
に設定されています。これにより、ノードの障害時に強制削除がトリガーされる方法が決定されます。HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable
は 20 に設定されています。これは、実行されているノードが到達不能としてマークされた後に Pod を強制的に削除するためのタイムアウトです。
リソースを作成します。
HighAvailabilityApplication
リソースは、一致する名前空間と名前を持つ StatefulSet を識別します。kubectl apply -f stateful-ha-example-resource.yaml
StatefulSet をインストールする
StatefulSet をインストールします。たとえば、Helm を使用して PostgreSQL StatefulSet をインストールできます(Helm には Cloud Shell がプリインストールされています)。
helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql \
--namespace=APP_NAMESPACE \
--set fullnameOverride=APP_NAME
HighAvailabilityApplication
リソースは、StatefulSet の StorageClass を standard-rwo-regional
に自動的に変更します。これは、リージョン Persistent Disk を使用します。
HighAvailabilityApplication リソースを検査する
次のコマンドを実行して、サンプル アプリケーションで自動フェイルオーバーが有効になっていることを確認します。
kubectl describe highavailabilityapplication APP_NAME
出力は次のようになります。
Status:
Conditions:
Last Transition Time: 2023-08-09T23:59:52Z
Message: Application is protected
Observed Generation: 1
Reason: ApplicationProtected
Status: True
Type: Protected