Stateful HA Operator を使用してステートフル アプリの可用性を向上させる


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 を設定する手順は次のとおりです。

  1. StatefulHA アドオンを有効にします。
  2. HighAvailabilityApplication リソースをインストールします。
  3. StatefulSet をインストールします。
  4. 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 フラグを使用してアドオンを有効にします。

アドオンを有効にすると、GKE は standard-rwo-regional という名前の StorageClass を自動的にインストールします。

HighAvailabilityApplication リソースをインストールする

HighAvailabilityApplication は、StatefulSet の設定を簡素化し、GKE で Pod の可用性を向上させる Kubernetes リソースです。Stateful HA Operator は GKE の HighAvailabilityApplication リソースを調整します。

HighAvailabilityApplication 仕様では、HighAvailabilityApplication.spec.resourceSelection.resourceKindStatefulSet に設定する必要があります。

HighAvailability リソースの構成方法については、HighAvailabilityApplicationリファレンス ドキュメントをご覧ください。

次の PostgreSQL の例をご覧ください。

  1. 次のマニフェストを 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.requireRegionalSettingstrue に設定されています。これにより、リージョン ストレージが適用されます。
    • HighAvailabilityApplication.spec.policy.failoverSettingsAfterNodeUnreachable に設定されています。これにより、ノードの障害時に強制削除がトリガーされる方法が決定されます。
    • HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable は 20 に設定されています。これは、実行されているノードが到達不能としてマークされた後に Pod を強制的に削除するためのタイムアウトです。
  2. リソースを作成します。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