擴大 Kubernetes Deployment

Kubernetes 環境可讓您根據工作負載需求變化,動態調整資料庫資源。如果您使用 Helm 圖表部署 Spanner Omni,請按照下列程序調整資源配置。

事前準備

在調度 Kubernetes 部署作業資源前,請務必完成下列事項:

最佳做法是先垂直擴充,將每部伺服器的記憶體增加到至少 32 GB,再新增更多伺服器來水平擴充。

限制

在 Kubernetes 中調度資源有下列限制:

  • 僅限非根伺服器:非根執行個體支援水平擴充。不支援根伺服器資源調度。

  • StatefulSet 儲存空間限制:由於 Kubernetes volumeClaimTemplates 無法變更,因此您無法使用單一 helm upgrade 指令擴充 Pod 磁碟。如要調度儲存空間資源,必須手動擴充磁碟區。

垂直擴充

如要調整伺服器的 CPU 或記憶體資源,請使用 Helm 升級功能更新設定:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set resources.cpu=CPU_CORES \
  --set resources.memory=MEMORY_LIMIT \
  -n NAMESPACE

更改下列內容:

  • HELM_CHART_PATH:Helm 圖表的路徑,例如 oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni。
  • VERSION:Helm 圖表版本,例如 1.1.0。
  • CPU_CORES:要指派給每個伺服器 Pod 的 vCPU 核心數量,例如 8。
  • MEMORY_LIMIT:每個伺服器 Pod 的 RAM 限制,例如 32Gi。
  • NAMESPACE:部署作業的 Kubernetes 命名空間,例如 spanner-ns。

水平擴充

如要水平擴充,請在部署作業中新增更多伺服器。非根伺服器支援水平擴充。

新增非根伺服器

如要新增非根伺服器,請在 Helm 圖表設定中增加副本數量。您可以統一調度所有可用區,或調度特定可用區。

統一縮放

如要將 Deployment 中的每個可用區擴充至 15 個伺服器,請執行下列指令:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set deployment.replicasPerZone=REPLICAS \
  -n NAMESPACE

更改下列內容:

  • HELM_CHART_PATH:Helm 圖表的路徑,例如 oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni。
  • VERSION:Helm 圖表版本,例如 1.1.0。
  • REPLICAS:每個可用區的目標伺服器副本數量,例如 15。
  • NAMESPACE:Kubernetes 命名空間,例如 spanner-ns。

擴充特定可用區

如果初始部署作業為個別可用區設定不同的伺服器數量,您可以指定單一可用區。舉例來說,如要將第一個位置內第一個可用區的副本數量增加到 15 個,請執行下列指令:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set locations[0].zones[0].replicas=REPLICAS \
  -n NAMESPACE

將 REPLICAS 替換為目標可用區副本數量,例如 15。

如要確認新伺服器是否成功加入部署作業,請查詢 Spanner Omni CLI,列出部署伺服器或查看 Grafana 資訊主頁。

spanner deployment servers list \
  --zone=ZONE \
  --deployment-endpoint=ENDPOINT

更改下列內容:

  • ZONE:要列出的可用區,例如 us-central1-a。
  • ENDPOINT:部署作業的外部端點,例如 ${ENDPOINT}:15000。

移除根伺服器以外的伺服器

縮減伺服器需要額外步驟,因為系統必須安全地將資料分區從停用的伺服器移出。由於 Kubernetes StatefulSet 會從最高到最低索引移除 Pod,因此您必須先指定最高索引的非根伺服器進行移除。

如要縮減伺服器數量,請按照下列步驟操作:

  1. 列出可用區中的伺服器,找出可移除的伺服器:

    spanner deployment servers list \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    輸出內容範例:

    NAME                                                          HOST                        PORT_BASE  ROOT  STATE
    zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000  spanner-a-0.pod.spanner-ns  15000      true  -
    zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000  spanner-a-1.pod.spanner-ns  15000      -     -
    

    刪除索引最高的已停用非根伺服器 (例如 spanner-a-1.pod.spanner-ns:15000):

    spanner deployment servers delete SERVER_NAME \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    將 SERVER_NAME 替換為伺服器 ID,例如 spanner-a-1.pod.spanner-ns:15000。

    查看伺服器清單,直到目標伺服器從清單中移除。刪除後,伺服器在系統中會轉換為健康狀態不良,並從有效服務路徑中移除。

  2. 執行 Helm 升級指令,縮減 Helm 部署作業,以符合目標副本數量。舉例來說,如要將每個可用區的副本數量減少至 1 個 Pod,請執行下列指令:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set deployment.replicasPerZone=REPLICAS \
      -n NAMESPACE
    

    將 REPLICAS 替換為更新後的副本數量,例如 1。

  3. 刪除與已移除 Pod 相關聯的 Kubernetes 永久磁碟區要求 (PVC)。為避免資料意外遺失,Helm 和 Kubernetes 在縮減 StatefulSet 時不會自動刪除 PVC。手動刪除 PVC,徹底回收儲存空間:

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    舉例來說,如要刪除命名空間 spanner-ns 中 spanner-a-1 的記錄和資料磁碟區,請執行下列指令:

    kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
    

新增可用區

在部署作業中新增可用區,可提高可用性,並保護資料庫免受單一可用區服務中斷的影響。

舉例來說,下列指令會在 us 區域的 us-east1-b 可用區中,初始化 Google Kubernetes Engine (GKE) 上執行中的單一可用區部署作業:

helm upgrade --install spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --set resources.cpu=2 \
  --set resources.memory=8Gi \
  --set global.platform=gke \
  --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
  -n NAMESPACE

請按照下列步驟,將可用區 us-east1-c 新增至這項設定:

  1. 執行 helm upgrade 指令,並傳遞包含新位置可用區的更新 JSON 區塊,在新可用區中啟動 Pod:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \
      -n NAMESPACE
    
  2. 使用 Spanner Omni CLI 新增可用區。等待新建立可用區中的根伺服器 Pod 進入 Running 和就緒狀態。接著,執行區域建立指令:

    spanner deployment zones create NEW_ZONE \
      --location=LOCATION \
      --root-servers=ROOT_SERVERS_LIST \
      --deployment-endpoint=ENDPOINT
    

    更改下列內容:

    • NEW_ZONE:要新增的可用區 ID,例如 us-east1-c。
    • LOCATION:部署位置,例如 us。
    • ROOT_SERVERS_LIST:新區域中根伺服器端點的逗號分隔的清單,例如 spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000。
    • ENDPOINT:外部部署作業端點,例如 ${ENDPOINT}:15000。
  3. 等待區域建立完成。將現有資料庫結構定義和資料表複製到新可用區需要一些時間。列出部署可用區,監控可用區同步處理進度:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    

移除區域

您可以停用多可用區部署項目中的有效可用區,減少資源或配合拓撲變更。

請按照下列步驟,移除在上一節建立的可用區 us-east1-c:

  1. 刪除區域,並在 Spanner Omni 中啟動區域拆除作業:

    spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINT
    

    將 ZONE 替換為要移除的可用區,例如 us-east1-c。

  2. 確認區域已移除。執行 list 指令,並等待輸出內容不再顯示該可用區:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. 執行 helm 升級指令,並傳遞不含已移除可用區的更新位置 JSON 區塊,從 Kubernetes 叢集移除伺服器:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
      -n NAMESPACE
    

擴充儲存空間

由於 Kubernetes volumeClaimTemplates 無法變更,因此您無法直接使用 helm upgrade 指令擴充 Pod 儲存空間容量。您必須手動擴充磁碟區。詳情請參閱 GKE StatefulSet 磁碟區擴充指南。

如要擴充磁碟儲存空間,請按照下列步驟操作:

  1. 在終端機中,將磁碟區擴充作業的參數定義為環境變數:

    NEW_SIZE="NEW_SIZE"
    NAMESPACE="NAMESPACE"
    RELEASE_NAME="spanner-omni"
    STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3"
    HELM_CHART_PATH="HELM_CHART_PATH"
    VERSION="VERSION"
    

    更改下列內容:

    • NEW_SIZE:目標儲存空間容量大小,例如 200Gi。
    • NAMESPACE:Kubernetes 命名空間,例如 spanner-ns。
    • STATEFULSET_NAME_1、STATEFULSET_NAME_2、...:部署作業中的 StatefulSets 名稱,通常對應至可用區的簡稱 (例如 spanner-east-b spanner-east-c)。
    • HELM_CHART_PATH:Helm 圖表的路徑,例如 oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni。
    • VERSION:Helm 圖表版本,例如 1.1.0。
  2. 執行指令來修補 PVC、刪除 StatefulSet (保留後端 Pod),以及升級 Helm 部署作業:

    # Patch all associated PVCs directly.
    for pvc in $(kubectl get pvc -n $NAMESPACE \
      -l app.kubernetes.io/instance=$RELEASE_NAME \
      -o name | grep "data-volume"); do
      kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}"
    done
    
    # Delete the StatefulSet while leaving backend pods intact (orphan cascade).
    kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan
    
    # Run Helm upgrade to align the templates with the expanded size.
    helm upgrade $RELEASE_NAME $HELM_CHART_PATH \
      --version $VERSION \
      --reuse-values \
      --set storage.data.size=$NEW_SIZE \
      -n $NAMESPACE
    

後續步驟