有狀態高可用性 (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,請按照下列步驟操作:
- 啟用
StatefulHA
外掛程式。 - 安裝 HighAvailabilityApplication 資源。
- 安裝 StatefulSet。
- 檢查 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
。
- 建立新叢集:按照 gcloud CLI 指令建立標準叢集,並加入下列標記:
啟用外掛程式後,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 範例:
將以下資訊清單儲存至名為
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
,後者使用地區永久磁碟。
檢查 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