有狀態高可用性 (HA) 運算子可讓您使用 GKE 內建的區域永久磁碟整合功能,自動控制 StatefulSet Pod 容錯移轉的速度。在容錯移轉期間,operator 會自動處理節點故障偵測、從故障節點卸載磁碟區,並確保磁碟區連結安全地附加至容錯移轉節點。
為何要使用 Stateful HA Operator
如要達成高可用性,常見的有狀態架構會使用區域性永久磁碟做為儲存層。這類磁碟可在區域內的兩個可用區之間同步複製資料。在節點或區域網路發生故障時,這項架構可讓工作負載容錯移轉 (透過強制附加),將副本附加至其他區域中另一個節點的儲存空間。
有狀態高可用性運算子可讓您進行下列最佳化:
- 縮短單一副本應用程式的復原時間:如果只使用一個副本,您可以在佈建應用程式時使用 Stateful HA Operator,並將區域儲存空間換成區域儲存空間,以提高節點故障時的資料耐久性和可用性。
- 降低跨區域網路費用:對於高處理量應用程式而言,跨多個區域複製資料的成本可能很高。您可以使用 Stateful HA Operator 在單一可用區中執行應用程式,同時維持備援路徑至符合應用程式 SLA 的替代可用區。
限制
- 系統不支援「gcePersistentDisk」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指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
需求條件
- 使用 Stateful HA Operator 時,系統會自動設定連結的 StatefulSet,以使用區域性永久磁碟。不過,您有責任確保 Pod 已設定為使用這些磁碟,且能夠在與基礎儲存空間相關聯的所有區域中執行。
- 確認應用程式在區域性永久磁碟支援的機器形狀上執行:E2、N1、N2、N2D。
- 確認已啟用 Compute Engine Persistent Disk CSI 驅動程式。新的 Autopilot 和 Standard 叢集預設會啟用 Persistent Disk CSI 驅動程式,且使用 Autopilot 時無法停用或編輯。如需從叢集手動新增 Persistent Disk CSI 驅動程式,請參閱「在現有叢集上啟用 Persistent Disk CSI 驅動程式」。
- 如果您使用自訂 StorageClass,請透過
pd.csi.storage.gke.io佈建工具和下列參數設定 Persistent Disk CSI 驅動程式:availability-class: regional-hard-failoverreplication-type: regional-pd
設定及使用 Stateful HA Operator
如要為有狀態工作負載設定有狀態高可用性運算子,請按照下列步驟操作:
- 啟用
StatefulHA外掛程式。 - 安裝 HighAvailabilityApplication 資源。
- 安裝 StatefulSet。
- 檢查 HighAvailabilityApplication 資源。
啟用 StatefulHA 外掛程式
如要使用 Stateful HA Operator,必須在叢集上啟用 StatefulHA 外掛程式。
Autopilot 叢集:GKE 會在建立叢集時自動啟用
StatefulHA外掛程式。如要在現有工作負載上使用 Stateful HA Operator,您必須手動啟用 Compute Engine Persistent Disk CSI 驅動程式。詳情請參閱「在現有叢集上啟用 Persistent Disk CSI 驅動程式」。標準叢集:
- 建立新叢集:按照 gcloud CLI 指令建立標準叢集,並新增
--addons=StatefulHA=ENABLED標記。 - 現有 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
如果您使用現有的 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¨