手動升級叢集或節點集區


根據預設,Google Kubernetes Engine (GKE) 叢集和 GKE Standard 節點集區會啟用自動升級功能。

本頁說明如何手動要求升級或降級 GKE 叢集的控制層或節點。您可以手動升級版本,方法如下:

如要升級叢集,GKE 會更新控制層和節點執行的版本。叢集會升級至較新的次要版本 (例如 1.24 至 1.25),或較新的修補程式版本 (例如 1.24.2-gke.100 至 1.24.5-gke.200)。詳情請參閱「GKE 版本管理和支援服務」。

您可以進一步瞭解自動和手動叢集升級的運作方式。您也可以設定維護期間和排除的時段,控制自動升級作業的執行時間。

GKE 會定期發布新版本,您可以透過叢集通知,接收各個叢集可用的新版本通知。如要找出叢集的特定自動升級目標,請取得叢集升級資訊

如要瞭解可用版本,請參閱「版本管理」一文。如要進一步瞭解叢集,請參閱叢集架構。如需升級叢集的相關指引,請參閱升級叢集的最佳做法

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 確認您有現有的 Autopilot 或 Standard 叢集。如要建立新叢集,請參閱「建立 Autopilot 叢集」。

將資料儲存到永久磁碟

請在升級節點集區之前,確保您要保留的資料都已經儲存在 Pod 中,且該 Pod 必須要使用位於永久磁碟中的永久磁碟區。因為在升級期間,永久磁碟只會遭到卸載,而不是遭到清除,且裡面的資料會在不同的 Pod 之間傳遞。

永久磁碟的使用會受到以下限制:

  • 執行 Pod 的節點必須是 Compute Engine VM
  • 這些 VM 所屬的 Compute Engine 專案和區域,必須與永久磁碟的相同

如要瞭解如何將永久磁碟新增到現有的節點執行個體,請參閱 Compute Engine 說明文件中的「新增或調整區域性永久磁碟大小」一文。

關於升級

叢集的控制層節點會分開升級。

無論您是否在發布版本中註冊叢集,叢集控制層一律都會定期升級

限制

Alpha 版叢集無法升級。

支援的版本

版本資訊會公告新版本推出時間,以及舊版本停用時間。您隨時可以使用下列指令,列出所有支援的叢集和節點版本:

gcloud container get-server-config

如果叢集已註冊發布版本,您可以升級至不同發布版本中的修補程式版本,但該版本必須與控制層的子版本相同。舉例來說,您可以將叢集從一般管道的 1.21.12-gke.1700 版,升級至快速管道的 1.21.13-gke.900 版。詳情請參閱「從較新的管道執行修補程式版本」。所有 Autopilot 叢集都會註冊發布管道。

降級限制

在特定情況下,您可以將叢集版本降級至較早版本。

為避免叢集控制層升級失敗,您可以將控制層降級至先前的修補程式版本 (如果該版本是同一子版本中的較早修補程式版本)。舉例來說,如果叢集的控制層執行的是 GKE 1.25.3-gke.400,您可以將控制層降級為 1.25.2-gke.100 (如果該版本仍可供使用)。

您無法將 Kubernetes 叢集控制層降級至先前的次要版本。舉例來說,如果控制層執行的是 GKE 1.25 版,就無法降級為 1.24 版。如果您嘗試這麼做,系統會顯示下列錯誤訊息:

ERROR: (gcloud.container.clusters.upgrade) ResponseError: code=400,
message=Master cannot be upgraded to "1.24.3-gke.100": specified version is not
newer than the current version.

您無法降級叢集控制層的次要版本,因此建議您在新次要版本推出但尚未成為預設版本時,先在測試環境中測試及驗證次要版本升級。如果叢集可能會受到下一個子版本重大變更的影響 (例如已淘汰的 API 或功能遭到移除),就特別建議您這麼做。

如要解決節點集區升級失敗的問題,您可以將節點集區降級至先前的修補程式版本或次要版本。請勿將節點降級至比叢集控制層版本落後超過兩個子版本的版本。

升級叢集

Google 會自動升級叢集和節點。如要進一步掌控叢集和節點會自動升級到哪個版本,請在發布版本中註冊該叢集。所有 Autopilot 叢集都會自動註冊發布管道。

如要進一步瞭解如何管理叢集的 GKE 版本,請參閱升級

當新版本推出之後,您隨時可以進行手動升級

手動升級控制層

啟動叢集升級作業後,會有好幾分鐘的時間無法修改叢集設定,直到您可以再次存取控制層為止。如果您必須避免在控制層升級期間發生停機的問題,請考慮使用 Autopilot 叢集地區 Standard 叢集。這項作業不會影響工作負載執行的 worker 節點可用性,因為控制層升級期間,這些節點仍可使用。

您可以使用 Google Cloud 控制台或 Google Cloud CLI,手動升級 Autopilot 或 Standard 控制平面。

gcloud

如要查看叢集控制層的可用版本,請執行下列指令:

gcloud container get-server-config

如要升級至預設叢集版本,請執行下列指令:

gcloud container clusters upgrade CLUSTER_NAME --master

如要升級到非預設的特定版本,請指定 --cluster-version 標記,如下列指令所示:

gcloud container clusters upgrade CLUSTER_NAME --master \
    --cluster-version VERSION

VERSION 替換為要升級叢集的版本。您可以使用特定版本,例如 1.18.17-gke.100,也可以使用版本別名,例如 latest。詳情請參閱「指定叢集版本」。

控制台

如要手動更新叢集控制層,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下叢集名稱。

  3. 在「Cluster basics」(叢集基本資訊) 下方,按一下「Version」(版本) 旁邊的 「Upgrade Available」(可升級)

  4. 選取所需的版本,然後按一下「Save Changes」(儲存變更)

升級標準控制層後,即可升級節點。根據預設,使用 Google Cloud 控制台建立的標準節點會啟用自動升級功能,因此系統會自動執行這項作業。Autopilot 一律會自動升級節點。

降級叢集

  1. 降級前請先設定維護作業排除項目,避免 GKE 在降級後自動升級控制層。
  2. 將叢集控制層降級至先前的修補程式版本:

     gcloud container clusters upgrade CLUSTER_NAME \
         --master --cluster-version VERSION
    

停用叢集自動升級功能

GKE 非常重視基礎架構安全,因此會定期升級控制層,且無法停用這項功能。不過,您可以套用維護期間和排除時段,暫時停止升級控制層和節點。

雖然不建議這麼做,但您可以停用節點自動升級功能

查看最近的控制層升級記錄

如要查看叢集近期的自動升級記錄快照,請取得叢集升級資訊

或者,您也可以列出近期作業,查看控制層的升級時間:

gcloud container operations list --filter="TYPE:UPGRADE_MASTER AND TARGET:CLUSTER_NAME"

CLUSTER_NAME 替換為叢集名稱。

升級節點集區

根據預設,叢集的節點會啟用自動升級功能。節點自動升級功能可確保叢集的控制層和節點版本保持同步,並符合 Kubernetes 版本偏差政策,確保控制層與低於自己兩個次要版本之內的節點相容。舉例來說,Kubernetes 1.29 控制層與 Kubernetes 1.27 節點相容。

最佳做法

請勿停用節點自動升級功能,確保叢集能享有上段列出的升級優勢。

使用 GKE 節點集區升級時,您可以選擇兩種可設定的升級策略,分別是節點數擴充升級藍綠升級

選擇策略,並使用參數調整策略,以充分滿足叢集環境的需求。

節點升級的運作方式

節點升級時,GKE 會停止將新的 Pod 排定到該節點上,並嘗試將正在執行的 Pod 排定到其他節點上。這與其他會重新建立節點的事件類似,例如啟用或停用節點集區的功能。

在節點的自動或手動升級期間,可接受的 PodDisruptionBudgets (PDB)Pod 終止寬限期最多為 1 小時。如果系統無法在 1 小時內把在節點上執行的 Pod 排定到新的節點上,GKE 仍會啟動升級作業。即使您將 PDB 設定為一律提供所有副本 (將 maxUnavailable 欄位設為 00%,或將 minAvailable 欄位設為 100% 或副本數量),這個行為仍適用。在上述所有情況中,GKE 會在一小時後刪除 Pod,以便刪除節點。

最佳做法

如果工作負載需要更彈性的正常終止機制,請使用藍綠升級,這項功能提供額外的浸泡時間設定,可將 PDB 檢查時間延長超過預設的一小時。

如要進一步瞭解在節點停止運作期間通常會發生什麼事,請參閱關於 Pod 的文章。

只有在所有節點都重新建立完畢且叢集處於所需狀態的情況下,升級作業才算完成。當剛升級的節點向控制層註冊之後,GKE 就會將該節點標記為可排定。

新節點執行個體會執行需要的 Kubernetes 版本,以及:

如要視為完成節點集區升級,節點集區中的所有節點都必須重建。如果升級作業已啟動,但未完成且處於部分升級狀態,節點集區版本可能無法反映所有節點的版本。詳情請參閱「節點集區升級作業不完整,導致部分節點版本與節點集區版本不符」。如要判斷節點集區升級是否完成,請檢查節點集區升級狀態。如果升級作業超出保留期限,請檢查每個節點的版本是否與節點集區版本相符。

手動升級節點集區

您可以手動升級節點集區版本,使其與控制層版本一致,或是升級至仍可使用且與控制層相容的舊版。您可以平行手動升級多個節點集區,但 GKE 一次只會自動升級一個節點集區。

手動升級節點集區時,GKE 會移除您使用 kubectl 新增至個別節點的所有標籤。為避免這種情況,請改為將標籤套用至節點集區

手動升級節點集區前,請先考量下列條件:

  • 當節點集區升級時,在該節點集區中執行的工作負載可能會受到干擾。如要避免這種情況發生,請建立採用所需版本的新節點集區,並把工作負載遷移過去,遷移完成後,即可刪除舊節點集區。
  • 如果升級的節點集區含有處於錯誤狀態的 Ingress,執行個體群組就不會進行同步處理。如要解決此問題,請先使用 kubectl get ing 指令檢查狀態。如果執行個體群組並未同步,則可將用於建立輸入的資訊清單重新套用,以解決此問題。

您可以使用 Google Cloud 控制台或 Google Cloud CLI,手動將節點集區升級至與控制平面相容的版本。

gcloud

本節指令會使用下列變數:

  • CLUSTER_NAME:要升級節點集區的叢集名稱。
  • NODE_POOL_NAME:要升級的節點集區名稱。
  • VERSION:節點升級到的 Kubernetes 版本。例如 --cluster-version=1.7.2cluster-version=latest

升級節點集區:

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME

如要在節點上指定不同版本的 GKE,請使用選用的 --cluster-version 標記:

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME \
  --cluster-version VERSION

如要進一步瞭解如何指定版本,請參閱「版本管理」。

詳情請參閱 gcloud container clusters upgrade 說明文件。

控制台

如要使用 Google Cloud 控制台升級節點集區,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下叢集名稱。

  3. 在「Cluster details」(叢集詳細資料) 頁面中,按一下「Nodes」(節點) 分頁標籤。

  4. 在「Node Pools」(節點集區) 區段中,按一下要升級的節點集區名稱。

  5. 按一下「Edit」(編輯)

  6. 按一下「Node version」(節點版本) 下方的「Change」(變更)

  7. 從「Node version」(節點版本) 下拉式清單中選取所需版本,然後按一下「Change」(變更)

節點的版本可能需要幾分鐘的時間才能變更完畢。

降級節點集區

您可以降級節點集區,例如為了減輕節點集區升級失敗的影響。降級節點集區前,請先查看限制

最佳做法

如果需要針對影響工作負載的節點集區升級作業,盡量降低風險,請使用藍綠節點升級策略。如果升級失敗,您可以使用這項策略復原原始節點的升級作業。

  1. 為叢集設定維護作業排除項目,避免節點集區在降級後,由 GKE 自動升級。
  2. 如要降級節點集區,請按照「手動升級節點集區」一文的說明,指定較早的版本。

變更節點數擴充升級參數

如要進一步瞭解如何變更節點數擴充升級參數,請參閱「設定節點數擴充升級」。

查看節點集區升級狀態

您可以使用 gcloud container operations 查看升級作業的狀態。

查看叢集中所有執行中和已完成作業的清單 (如果作業少於 5,000 項,則為過去 12 天的作業;如果作業超過 5, 000 項,則為最近 5,000 項作業):

gcloud container operations list

每個作業都會獲派一個「作業 ID」和作業類型,還有開始和結束時間、目標叢集和狀態。清單看起來類似以下範例:

NAME                              TYPE                ZONE           TARGET              STATUS_MESSAGE  STATUS  START_TIME                      END_TIME
operation-1505407677851-8039e369  CREATE_CLUSTER      us-west1-a     my-cluster                          DONE    20xx-xx-xxT16:47:57.851933021Z  20xx-xx-xxT16:50:52.898305883Z
operation-1505500805136-e7c64af4  UPGRADE_CLUSTER     us-west1-a     my-cluster                          DONE    20xx-xx-xxT18:40:05.136739989Z  20xx-xx-xxT18:41:09.321483832Z
operation-1505500913918-5802c989  DELETE_CLUSTER      us-west1-a     my-cluster                          DONE    20xx-xx-xxT18:41:53.918825764Z  20xx-xx-xxT18:43:48.639506814Z

如要取得某個特定作業的詳細資訊,請使用下列指令來指定作業 ID:

gcloud container operations describe OPERATION_ID

例如:

gcloud container operations describe operation-1507325726639-981f0ed6
endTime: '20xx-xx-xxT21:40:05.324124385Z'
name: operation-1507325726639-981f0ed6
operationType: UPGRADE_CLUSTER
selfLink: https://container.googleapis.com/v1/projects/.../kubernetes-engine/docs/zones/us-central1-a/operations/operation-1507325726639-981f0ed6
startTime: '20xx-xx-xxT21:35:26.639453776Z'
status: DONE
targetLink: https://container.googleapis.com/v1/projects/.../kubernetes-engine/docs/zones/us-central1-a/clusters/...
zone: us-central1-a

如果升級作業已取消或失敗,但部分作業已完成,您可以繼續復原升級作業。

檢查節點集區升級設定

您可以使用 gcloud container node-pools describe 指令,查看節點集區使用的節點升級策略詳細資料。如果是藍綠升級,這項指令也會傳回升級的目前階段

執行下列指令:

gcloud container node-pools describe NODE_POOL_NAME \
--cluster=CLUSTER_NAME

更改下列內容:

  • NODE_POOL_NAME:要說明的節點集區名稱。
  • CLUSTER_NAME:要說明節點集區的叢集名稱。

這項指令會輸出目前的升級設定。以下範例顯示使用藍綠升級策略時的輸出內容。

upgradeSettings:
  blueGreenSettings:
    nodePoolSoakDuration: 1800s
    standardRolloutPolicy:
      batchNodeCount: 1
      batchSoakDuration: 10s
  strategy: BLUE_GREEN

如果您使用藍綠升級策略,輸出內容也會包含藍綠升級設定和目前中間階段的詳細資料。以下範例顯示這類要求可能看起來的樣子:

updateInfo:
  blueGreenInfo:
    blueInstanceGroupUrls:
    - https://www.googleapis.com/compute/v1/projects/{PROJECT_ID}/zones/{LOCATION}/instanceGroupManagers/{BLUE_INSTANCE_GROUP_NAME}
    bluePoolDeletionStartTime: {BLUE_POOL_DELETION_TIME}
    greenInstanceGroupUrls:
    - https://www.googleapis.com/compute/v1/projects/{PROJECT_ID}/zones/{LOCATION}/instanceGroupManagers/{GREEN_INSTANCE_GROUP_NAME} 
    greenPoolVersion: {GREEN_POOL_VERSION}
    phase: DRAINING_BLUE_POOL

取消節點集區升級

您可隨時取消升級。如要進一步瞭解取消節點數擴充升級的影響,請參閱「取消節點數擴充升級」。如要進一步瞭解取消藍綠升級的影響,請參閱「取消藍綠升級」。

  1. 取得升級作業的 ID:

    gcloud container operations list
    
  2. 取消升級:

    gcloud container operations cancel OPERATION_ID
    

請參閱 gcloud container operations cancel 說明文件。

繼續升級節點集區

如要繼續升級,請再次手動啟動升級,並指定原始升級的目標版本。

舉例來說,如果升級失敗,或是您暫停進行中的升級作業,可以對節點集區再次啟動相同的升級作業,並指定初始升級作業的目標版本,藉此繼續已取消的升級作業。

如要進一步瞭解繼續升級作業的影響,請參閱「繼續節點數擴充升級」和「藍綠升級」。

如要繼續升級,請使用下列指令:

    gcloud container clusters upgrade CLUSTER_NAME \
      --node-pool=NODE_POOL_NAME \
      --cluster-version VERSION

更改下列內容:

  • NODE_POOL_NAME:要繼續升級的節點集區名稱。
  • CLUSTER_NAME:要繼續升級的節點集區叢集名稱。
  • VERSION:取消升級節點集區的目標版本。

詳情請參閱 gcloud container clusters upgrade 說明文件。

將已升級的節點集區復原

您可以將節點集區復原,將升級的節點降級至節點集區升級前的原始狀態。

如果升級作業取消、失敗或因維護期間逾時而未完成,請使用 rollback 指令。或者,如要指定版本,請按照降級節點集區的說明操作。

如要進一步瞭解復原節點集區升級作業的影響,請參閱「復原節點數擴充升級」或「復原藍綠升級」。

如要復原升級,請執行下列指令:

gcloud container node-pools rollback NODE_POOL_NAME \
  --cluster CLUSTER_NAME

更改下列內容:

  • NODE_POOL_NAME:要復原節點集區升級的節點集區名稱。
  • CLUSTER_NAME:要復原升級的節點集區所在叢集名稱。

請參閱 gcloud container node-pools rollback 說明文件。

完成節點集區升級

如果您使用藍綠升級策略,可以在浸泡階段完成節點集區升級,略過其餘浸泡時間。

如要瞭解如何完成節點集區升級作業,請參閱「完成節點集區升級作業」。

使用藍綠升級策略時,請執行下列指令來完成升級:

gcloud container node-pools complete-upgrade NODE_POOL_NAME \
  --cluster CLUSTER_NAME

更改下列內容:

  • NODE_POOL_NAME:要完成升級的節點集區名稱。
  • CLUSTER_NAME:要完成升級的節點集區叢集名稱。

請參閱 gcloud container node-pools complete-upgrade 說明文件。

已知問題

如果設定的 PodDisruptionBudget 物件無法容許任何額外中斷,節點升級可能會在多次嘗試後,仍無法升級至控制層版本。為避免發生這種故障,建議您擴大 DeploymentHorizontalPodAutoscaler,讓節點在排空時仍遵守 PodDisruptionBudget 設定。

如要查看所有不允許任何中斷的 PodDisruptionBudget 物件,請按照下列步驟操作:

kubectl get poddisruptionbudget --all-namespaces -o jsonpath='{range .items[?(@.status.disruptionsAllowed==0)]}{.metadata.name}/{.metadata.namespace}{"\n"}{end}'

雖然自動升級可能會遇到問題,但自動升級程序會強制節點升級。不過,如果 istio-system 命名空間中的節點違反 PodDisruptionBudget,升級時間會延長一小時。

疑難排解

節點集區升級不完整,導致部分節點版本與節點集區版本不符

節點集區升級作業可能因下列任一原因而無法完成:

  • 您或 GKE 取消了升級作業。
  • 發生無法預料的問題,因此升級失敗。
  • 升級作業因維護期間逾時而未完成,或因維護作業排除時段而無法升級。

如果作業已完成,您可以檢查節點集區升級狀態,確認節點集區升級作業的狀態。

如果節點集區升級作業只完成一部分,可能會有下列情況:

  • 部分節點的版本與節點集區的版本不符。
  • 節點集區版本為現有版本或新版本。

如要讓節點集區恢復所有節點都執行相同版本的狀態,請繼續或復原未完成的節點集區升級

繼續或復原未完成的節點集區升級

如果 GKE 未完成節點集區升級,且節點已部分升級至新版本,您可以繼續復原升級作業。這與使用節點升級策略 (節點數擴充升級藍綠升級) 的節點集區升級相關。

按照操作說明繼續還原升級作業,確保節點集區中的所有節點都執行一致的版本。如果您沒有採取任何行動,GKE 最終會在維護作業可用時,再次嘗試升級節點集區。

節點 CPU 使用率高於預期

您可能會遇到某些節點的 CPU 使用率高於執行中 Pod 預期的情況。

如果叢集或節點未執行支援的版本,就可能發生這種情況。請參閱版本資訊,確認您使用的版本是否可用且受支援。您也可以執行下列指令,列出所有支援的叢集和節點版本:

gcloud container get-server-config

後續步驟