根據預設,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
。詳情請參閱「指定叢集版本」。
控制台
如要手動更新叢集控制層,請執行下列步驟:
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下叢集名稱。
在「Cluster basics」(叢集基本資訊) 下方,按一下「Version」(版本) 旁邊的 edit「Upgrade Available」(可升級)。
選取所需的版本,然後按一下「Save Changes」(儲存變更)。
升級標準控制層後,即可升級節點。根據預設,使用 Google Cloud 控制台建立的標準節點會啟用自動升級功能,因此系統會自動執行這項作業。Autopilot 一律會自動升級節點。
降級叢集
- 降級前請先設定維護作業排除項目,避免 GKE 在降級後自動升級控制層。
將叢集控制層降級至先前的修補程式版本:
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
欄位設為 0
或 0%
,或將 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.2
或cluster-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 控制台升級節點集區,請執行下列步驟:
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下叢集名稱。
在「Cluster details」(叢集詳細資料) 頁面中,按一下「Nodes」(節點) 分頁標籤。
在「Node Pools」(節點集區) 區段中,按一下要升級的節點集區名稱。
按一下「Edit」(編輯)edit。
按一下「Node version」(節點版本) 下方的「Change」(變更)。
從「Node version」(節點版本) 下拉式清單中選取所需版本,然後按一下「Change」(變更)。
節點的版本可能需要幾分鐘的時間才能變更完畢。
降級節點集區
您可以降級節點集區,例如為了減輕節點集區升級失敗的影響。降級節點集區前,請先查看限制。
如果需要針對影響工作負載的節點集區升級作業,盡量降低風險,請使用藍綠節點升級策略。如果升級失敗,您可以使用這項策略復原原始節點的升級作業。
變更節點數擴充升級參數
如要進一步瞭解如何變更節點數擴充升級參數,請參閱「設定節點數擴充升級」。
查看節點集區升級狀態
您可以使用 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
取消節點集區升級
您可隨時取消升級。如要進一步瞭解取消節點數擴充升級的影響,請參閱「取消節點數擴充升級」。如要進一步瞭解取消藍綠升級的影響,請參閱「取消藍綠升級」。
取得升級作業的 ID:
gcloud container operations list
取消升級:
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
物件無法容許任何額外中斷,節點升級可能會在多次嘗試後,仍無法升級至控制層版本。為避免發生這種故障,建議您擴大 Deployment
或 HorizontalPodAutoscaler
,讓節點在排空時仍遵守 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