使用有狀態 HA Operator 提高有狀態應用程式的可用性


有狀態高可用性 (HA) 運算子可讓您使用 GKE 內建的區域永久磁碟整合功能,自動化及控制 StatefulSet Pod 容錯移轉的速度。在容錯移轉期間,運算子會自動處理節點故障偵測、從故障節點卸離磁碟區,並確保磁碟區安全地附加至容錯移轉節點。

為什麼要使用 Stateful HA Operator

如要實現高可用性,常見的具狀態架構會使用區域永久磁碟做為儲存層。這類磁碟可在同一區域內的兩個可用區之間同步複製資料。在節點或區域網路發生故障時,這項架構可讓工作負載容錯移轉 (透過強制連接),將副本連接至不同區域中其他節點的儲存空間。

有狀態高可用性運算子可讓您進行下列最佳化:

  • 縮短單一副本應用程式的復原時間:如果您只使用一個副本,可以在佈建應用程式時使用 Stateful HA Operator,並將區域儲存空間換成區域儲存空間,以便在節點故障時提高資料耐用性和可用性。
  • 降低跨可用區網路費用:對於高輸送量應用程式而言,跨多個可用區複製資料的成本可能很高。您可以使用 Stateful HA Operator 在單一區域中執行應用程式,同時維持容錯移轉路徑至符合應用程式 SLA 的替代區域。

限制

  • 系統不支援 gcePersistentDisk 磁碟區類型。使用採用永久磁碟 CSI 驅動程式PersistentVolume
  • 採用單一副本 Stateful HA Operator 架構時,GKE 會透過區域永久磁碟將資料保留在兩個區域,但只有在應用程式副本運作正常時,才能存取資料。在容錯移轉期間,應用程式會暫時無法使用,因為副本會重新排定至新的健康節點。如果應用程式的復原時間目標 (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 時,系統會自動設定連結的 StatefulSet,以使用地區永久磁碟。不過,您有責任確保 Pod 已設定為使用這些磁碟,且能夠在與基礎儲存空間相關聯的所有區域中執行。
  • 請確認應用程式是在區域性永久磁碟支援的機器形狀上執行:E2、N1、N2、N2D。
  • 確認已啟用 Compute Engine Persistent Disk CSI 驅動程式。新的 Autopilot 和 Standard 叢集預設會啟用 Persistent Disk CSI 驅動程式,且使用 Autopilot 時無法停用或編輯。如要從叢集手動新增永久磁碟 CSI 驅動程式,請參閱「在現有叢集上啟用永久磁碟 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 叢集中重新部署工作負載。

  • 標準叢集

    • 建立新叢集:按照 gcloud CLI 指令建立標準叢集,並加入下列標記:--add-on=StatefulHA
    • 現有 Standard 叢集:按照 gcloud CLI 指示更新 Standard 叢集的設定,並使用下列標記啟用外掛程式:--update-addons=StatefulHA=ENABLED

啟用外掛程式後,GKE 會自動為您安裝名為 standard-rwo-regional 的 StorageClass。

安裝 HighAvailabilityApplication 資源

HighAvailabilityApplication 是 Kubernetes 資源,可簡化 StatefulSet 設定,並提高 GKE 上的 Pod 可用性。Stateful HA Operator 會調解 GKE 上的 HighAvailabilityApplication 資源。

HighAvailabilityApplication 規格中,您必須將 HighAvailabilityApplication.spec.resourceSelection.resourceKind 設為 StatefulSet

如要瞭解如何設定 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.requireRegionalSettings」已設為「true」。這會強制執行區域儲存空間。
    • HighAvailabilityApplication.spec.policy.failoverSettings 設為 AfterNodeUnreachable。這會決定節點故障時如何觸發強制刪除。
    • 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,後者使用地區永久磁碟。

檢查 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

使用現有的永久磁碟

如果您使用現有的 Persistent Disk 和靜態定義的 PersistentVolume,請使用 .spec.csi.volumeAttributes 中的 force-attach: true 設定 PersistentVolume。例如:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: PV_NAME
spec:
  storageClassName: "STORAGE_CLASS_NAME"
  capacity:
    storage: DISK_SIZE
  accessModes:
    - ReadWriteOnce
  claimRef:
    name: PV_CLAIM_NAME
    namespace: default
  csi:
    driver: pd.csi.storage.gke.io
    volumeHandle: DISK_ID
    fsType: FS_TYPE
    volumeAttributes:
      force-attach: true