使用 OpenShift 實現高可用的最佳做法


本文說明在 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、記憶體或自訂指標自動調高或調低備援資源。

我們也建議您使用下列負載平衡服務:

定義 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

詳情請參閱「為應用程式指定中斷預算」。

使用支援高可用性和資料複寫的儲存空間

對於需要在容器外部持續儲存資料的工作負載,我們建議採用下列最佳做法。

磁碟最佳做法

如果您需要磁碟儲存空間,請使用下列任一選項:

選取儲存空間選項後,請在叢集中安裝相關驅動程式:

CSI 永久磁碟運算子提供儲存空間類別,可用於建立永久磁碟區要求 (PVC)。針對 Filestore,您必須建立 Filestore 儲存空間級別

資料庫最佳做法

如果您需要資料庫,請使用下列任一方法:

安裝資料庫操作員後,請設定包含多個執行個體的叢集。以下範例顯示叢集的設定,其中包含下列屬性:

  • 系統會建立名為 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 資料複寫功能
  • 外部化應用程式狀態

後續步驟