本文說明在 Compute Engine 上使用 Red Hat OpenShift Container Platform 工作負載時,如何達成高可用性 (HA) 的最佳做法。本文著重於應用程式層級的策略,協助您確保工作負載在發生失敗時仍能維持高可用性。這些策略有助於消除單點故障,並實作自動備援和復原機制。
本文適用於平台和應用程式架構設計師,並假設您具備部署 OpenShift 的相關經驗。如要進一步瞭解如何部署 OpenShift,請參閱 Red Hat 說明文件。
將部署作業分散至多個可用區
建議您在Google Cloud 地區內的多個區域中部署 OpenShift。這麼做有助於確保在某個區域發生服務中斷時,叢集的控制層節點仍可在部署範圍內的其他區域正常運作。如要在多個區域部署 OpenShift,請在install-config.yaml
檔案中指定同一個地區的 Google Cloud 區域清單。
如要精細控管部署節點的位置,建議您定義 VM 放置政策,確保 VM 分散在同一區域內的不同故障網域。將分散放置政策套用至叢集節點,有助於減少同時受到特定位置中斷影響的節點數量。如要進一步瞭解如何為現有叢集建立散布政策,請參閱「為 VM 建立並套用散布刊登位置政策」。
同樣地,為避免系統將多個 Pod 排程到同一節點,建議您使用 Pod 反相依性規則。這些規則會將應用程式副本分散至多個區域。以下範例說明如何實作 Pod 反關聯規則:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: my-app-namespace spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: # Pod Anti-Affinity: Prefer to schedule new pods on nodes in different zones. affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: my-app topologyKey: topology.kubernetes.io/zone containers: - name: my-app-container image: quay.io/myorg/my-app:latest ports: - containerPort: 8080
對於無狀態服務 (例如網頁前端或 REST API),建議您為每項服務或路徑執行多個 Pod 副本。這麼做可確保流量自動路由至可用區域中的 Pod。
主動管理負載,避免資源超出承諾
建議您主動管理應用程式的負載,以免資源超出承諾。過度承諾可能會導致服務在負載下效能不佳。您可以設定資源要求上限,避免過度承諾。如需更詳細的說明,請參閱「管理 Pod 的資源」一文。此外,您可以使用水平 Pod 自動配置器,根據 CPU、記憶體或自訂指標自動調高或調低備援資源。
我們也建議您使用下列負載平衡服務:
- OpenShift ingress 操作員。Ingress 運算子會部署以 HAProxy 為基礎的 ingress 控制器,以便處理 Pod 的路由。具體來說,建議您為 Ingress 控制器設定全域存取權,讓負載平衡器所在的虛擬私有雲網路和區域中,任何區域的用戶端都能存取叢集中執行的工作負載。此外,建議您實作輸入控制器健康狀態檢查,以便監控 Pod 的健康狀態,並重新啟動失敗的 Pod。
- Google Cloud 負載平衡。負載平衡功能會將流量分配到Google Cloud 區域。選擇符合應用程式需求的負載平衡器。
定義 Pod disruption budget
建議您定義中斷預算,指定應用程式在維護事件或更新期間需要可用的 pod 數量下限。以下範例說明如何定義中斷預算:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-app-pdb namespace: my-app-namespace spec: # Define how many pods need to remain available during a disruption. # At least one of "minAvailable" or "maxUnavailable" must be specified. minAvailable: 2 selector: matchLabels: app: my-app
詳情請參閱「為應用程式指定中斷預算」。
使用支援高可用性和資料複寫的儲存空間
對於需要在容器外部持續儲存資料的工作負載,我們建議採用下列最佳做法。
磁碟最佳做法
如果您需要磁碟儲存空間,請使用下列任一選項:
- 區塊儲存空間: 使用同步複製作業的 Compute Engine 區域性永久磁碟
- 共用檔案儲存空間: Filestore (已啟用快照和備份)
選取儲存空間選項後,請在叢集中安裝相關驅動程式:
CSI 永久磁碟運算子提供儲存空間類別,可用於建立永久磁碟區要求 (PVC)。針對 Filestore,您必須建立 Filestore 儲存空間級別。
資料庫最佳做法
如果您需要資料庫,請使用下列任一方法:
- 全代管資料庫:建議您使用 Cloud SQL 或 PostgreSQL 適用的 AlloyDB 代管資料庫 HA。如果您使用 Cloud SQL,可以使用 Cloud SQL Proxy Operator 簡化應用程式和資料庫之間的連線管理作業。
- 自行管理的資料庫:建議您使用支援 HA 的資料庫,並部署其作業員來啟用 HA。如需更多資訊,請參閱資料庫運算子相關的說明文件,例如 Kubernetes 適用的 Redis Enterprise、MariaDB Operator 或 CloudNative PostgreSQL Operator。
安裝資料庫操作員後,請設定包含多個執行個體的叢集。以下範例顯示叢集的設定,其中包含下列屬性:
- 系統會建立名為
my-postgres-cluster
的 PostgreSQL 叢集,並使用三個執行個體確保高可用性。 - 叢集會使用
regionalpd-balanced
儲存空間類別,在各區域中提供耐用且可複製的儲存空間。 - 使用者
myuser
會使用名為mydatabase
的資料庫進行初始化,其憑證會儲存在名為my-database-secret
的 Kubernetes 祕密中。 - 為提高安全性,超級使用者存取權已停用。
- 叢集已啟用監控功能。
apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: my-postgres-cluster namespace: postgres-namespace spec: instances: 3 storage: size: 10Gi storageClass: regionalpd-balanced bootstrap: initdb: database: mydatabase owner: myuser secret: name: my-database-secret enableSuperuserAccess: false monitoring: enabled: true --- apiVersion: 1 kind: Secret metadata: name: my-database-secret namespace: postgres-namespace type: Opaque data: username: bXl1c2Vy # Base64-encoded value of "myuser" password: c2VjdXJlcGFzc3dvcmQ= # Base64-encoded value of "securepassword"
外部化應用程式狀態
建議您將工作階段狀態或快取移至共用的記憶體內儲存空間 (例如 Redis),或是設定為在 HA 模式下執行的永久儲存空間 (例如 Postgres、MySQL)。
最佳做法摘要
總而言之,請實作下列最佳做法,以便透過 OpenShift 達成高可用性:
- 將部署作業分散至多個可用區
- 主動管理負載,避免資源超出承諾
- 定義 Pod disruption budget
- 使用 HA 資料複寫功能
- 外部化應用程式狀態