擴大 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 範本版本,例如 0.2.0
  • CPU_CORES:要指派給每個伺服器 Pod 的 vCPU 核心數,例如 8
  • MEMORY_LIMIT:每個伺服器 Pod 的 RAM 限制,例如 32Gi
  • NAMESPACE:部署作業的 Kubernetes 命名空間,例如 spanner-ns

水平擴充

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

新增非根伺服器

如要新增非根伺服器,請在 Helm chart 設定中增加副本數量。您可以統一調整所有可用區的規模,也可以調整特定可用區的規模。

統一縮放

如要將部署作業中的每個區域擴展至 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 圖表版本,例如 0.2.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 StatefulSets 會依索引從高到低移除 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 Deployment 縮減至目標副本數量。舉例來說,如要將每個區域的副本數減少至 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)。為避免資料意外遺失,當您縮減 StatefulSet 時,Helm 和 Kubernetes 不會自動刪除 PVC。手動刪除 PVC,徹底回收儲存空間:

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    舉例來說,如要刪除命名空間 spanner-nsspanner-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. 確認區域已移除。執行清單指令,然後等待輸出內容不再顯示該可用區:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. 執行 Helm 升級指令,並傳遞更新後的 locations 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_1STATEFULSET_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 資訊套件版本,例如 0.2.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
    

後續步驟