為避免過期版本集群存在的安全和穩定性風險,同時保證您業務的連貫性,容器服務ACK采用原地升級的方式升級ACK集群版本。您可以通過控制臺升級集群的Kubernetes版本,也可以獨立升級控制面和節點池,靈活控制升級節奏。本文介紹集群升級前后的注意事項、升級流程、操作步驟等。
為什么需要升級
ACK保證Kubernetes最新3個次要版本的創建。例如,支持Kubernetes 1.28、1.30、1.31三個版本時,1.26版本不再支持創建,過期補丁版本也不再支持創建。
主動升級集群有以下好處:
降低安全和穩定性風險:隨著Kubernetes版本迭代,會不斷優化及修復發現的安全及穩定性漏洞,長久使用過期版本集群會給業務帶來安全和穩定性風險。
享受更好的維護支持:對于過期Kubernetes版本,ACK不再提供安全補丁和問題修復,也無法保證過期版本的技術支持質量。使用新版本能夠讓您享受更好的技術支持和答疑服務。
使用新版本的新功能:隨著社區Kubernetes版本的演進,新版本包含新的功能和改進,ACK也將適配新版本,為您帶來更好的開發和運維體驗。
此外,基于安全原因,ACK保留強制升級部分過期版本的集群的權利。建議您參照下文提前主動升級集群。
升級集群時,容器服務ACK會對您的集群進行前置檢查,但無法保證檢查出所有不兼容的功能配置和API。根據安全責任共擔模型,請您通過幫助文檔、控制臺信息、站內信等渠道關注版本發布情況,并在集群升級時提前了解相應版本的升級注意事項。
更多關于Kubernetes版本支持信息,請參見Kubernetes版本概覽及機制。
注意事項(重要)
版本說明
ACK集群的Kubernetes版本只能按照支持的版本依次升級。例如,Kubernetes版本為1.28的ACK集群升級到1.31時,需要進行兩次集群升級,即先升級到1.30版本,再升級到1.31版本。
您可以登錄容器服務管理控制臺,在集群頁面的版本列查看集群的Kubernetes版本。確定待升級版本后,請參見Kubernetes版本概覽及機制及各版本說明了解待升級版本的版本解讀、廢棄資源API、升級注意事項等,避免因高版本的功能變更導致業務功能不兼容,從而影響集群正常運行。
如果您的Helm Chart YAML文件中使用了廢棄資源,請及時修改。更多信息,請參見上方版本說明和廢棄API說明。
相關功能及自定義配置說明
如果您的集群中使用了如下相關功能,請仔細閱讀以下說明及解決方案。
配置項 | 注意事項 | 推薦解決方案 |
Flexvolume存儲 | 集群升級過程中,老版本的Flexvolume(v1.11.2.5及以前)掛載的OSS存儲卷會重新掛載。 | 若您的集群使用OSS存儲卷,請在集群升級后重建相應的Pod。 同時,由于Flexvolume存儲插件已經棄用,建議您將FlexVolume遷移至CSI插件。具體操作,請參見遷移Flexvolume至CSI遷移Flexvolume至CSI。 |
節點自動伸縮 |
|
|
節點資源預留 | 升級集群至1.18版本后,ACK會默認配置節點資源預留。如果集群未配置資源預留且節點水位較高,升級后存在Pod驅逐后無法被快速調度的風險。 | 為節點預留部分資源,推薦CPU使用率不超過50%,內存使用率不超過70%。更多信息,請參見節點資源預留策略。 |
Loadbalancer配置 | 集群外部訪問集群時,需要通過SLB來訪問。但當SLB設置 | 檢查是否完成對應配置,避免LoadBalancer暴露的SLB地址訪問不通的風險。如有相關問題,請參見Kubernetes集群中訪問LoadBalancer暴露的SLB地址不通Kubernetes集群中訪問LoadBalancer暴露出去的SLB地址不通。 |
API Server | 集群升級過程中,ACK竭力保障控制面的平滑升級,集群上的應用不會中斷,但升級過程中可能會出現短暫的API Server中斷。如果您的應用強依賴于API Server,例如需要對資源進行List-Watch,API Server重啟會導致Watch 中斷,需要您自行保證在中斷時自動重試。 | 如果您的應用不訪問API Server,將不會受到升級影響;如果需要訪問API Server,則需要具備失敗重試的能力。 |
啟動探針 | 如果集群中的Pod配置了啟動探針(Startup Probe),Pod會在kubelet重啟后出現短暫的NotReady現象。 | 建議Pod采用多副本模式,將Pod分散到不同的節點上,以確保在某個節點重啟期間仍有足夠的可用Pod。 |
kubectl | 集群升級后,請同步升級您本地的kubectl版本。 如果未及時升級,在使用本地kubectl的過程中可能會因為與集群API Server版本不同,發生類似 | 安裝或升級kubectl。具體操作,請參見安裝kubectl。 |
如果您對集群曾有自定義配置,請仔細閱讀以下說明。
配置項 | 說明 |
網絡 | 集群升級需要使用yum下載升級所需的軟件包。如果您的集群曾自行修改節點的網絡配置或者使用了自定義的操作系統鏡像,需確保節點的yum能正常使用。您可以執行 |
操作系統鏡像 | 自定義操作系統鏡像非容器服務官方嚴格驗證。ACK無法完全保證升級成功。 |
其他 | 如果您對集群有過配置更改,例如打開了SWAP分區、曾通過黑屏操作修改kubelet配置等,集群升級過程有可能失敗,或自定義配置有可能丟失。 |
升級流程、方式及所需時間
升級流程
準備工作及前置檢查:
注意事項:確定您待升級集群的Kubernetes版本后,仔細閱讀待升級目標版本的版本升級注意事項,避免升級時潛在的功能不兼容問題。更多信息,請參見上文的版本說明。
前置檢查:執行前置檢查,排查暴露影響升級的風險項。如有檢查異常項,請按控制臺提示或參見集群檢查項及修復方案修復風險項。
集群升級:前置檢查通過后,可開始集群升級,包括控制面和節點池的升級。ACK提供以下兩種升級模式。
同時升級:一起完成控制面和節點池升級。
獨立升級:先獨立升級控制面,再獨立升級節點池。
控制面升級包括對核心組件kube-apiserver的升級,節點池升級包括對kubelet及其依賴組件的升級。為保證集群穩定性和可靠性,需要保證kube-apiserver不低于kubelet兩個版本,故需要先完成控制面獨立升級,再在業務低峰期完成節點池升級。
集群升級后:核驗集群、kubelet等版本,檢查節點池運行是否正常,以及檢查集群業務是否運行正常。
升級方式
控制面升級
ACK托管集群、ACK Serverless集群
ACK托管集群、ACK Serverless集群采用滾動升級的方式。具體流程如下。
升級控制面和托管組件,包括kube-apiserver、kube-controller-manager、cloud-controller-manager、kube-scheduler。
升級Kubernetes組件,例如kube-proxy等。
ACK專有集群
ACK專有集群采用原地升級的方式,以更大程度地保證您業務的連貫性,減少數據遷移和配置調整的風險。具體流程如下。
當ACK檢測到您的集群需要進一步升級etcd和Container Runtime時,將依次升級Master節點上的etcd和Container Runtime。
依次選擇Master節點,一次只升級一個Master節點,并展示當前正在升級的Master節點的編號。
升級Master組件,包括kube-apiserver、kube-controller-manager、cloud-controller-manager、kube-scheduler等。
升級Master節點上的kubelet。
在所有Master節點升級完成后,升級Kubernetes組件,例如kube-proxy等。
節點池升級
節點池升級包括kubelet、OS鏡像和容器運行時的升級。如您需要更換操作系統,或運行時需從Docker升級為containerd,系統會通過替換系統盤(替盤升級)的方式完成升級,即更換磁盤的同時進行操作系統或應用程序的升級。請提前做好系統盤的備份工作。其他情況下,保持使用原地升級方式。更多信息,請參見升級節點池。
ACK將集群中的節點按照分批策略執行分批升級:
根據節點池依次執行,同一時間只有一個節點池進行升級。
在同一個節點池內進行分批升級。第一批升級的節點數為1,后續的批次以2的冪數進行增長。如果暫停后重新恢復升級,依然遵循該分批策略。您可以在節點池升級頁面配置每批升級節點的最大數量,推薦設置為10。具體操作,請參見升級節點池。
升級所需時間
ACK托管集群、ACK Serverless集群控制面升級時間約為5分鐘;ACK專有集群的Master節點需逐個、串行升級,每個Master節點升級時間約為8分鐘。節點池升級時內部節點分批升級,每批升級時間約為5分鐘。
操作步驟
僅升級控制面
使用限制
僅1.18及以上版本的集群支持升級ACK集群時僅升級控制面。
操作步驟
節點池升級前,您應先完成控制面升級。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,選擇目標集群,并在目標集群右側操作列,選擇 。
在集群升級頁面的操作對象區域,選擇可升級的集群版本,選擇升級模式為僅控制面,然后單擊前置檢查。
檢查完成后,單擊查看詳情,查看檢查報告。
當檢查報告中檢查結果為正常時,表示升級檢查成功,您可以進行集群升級操作。
當檢查報告中檢查結果為異常時,不影響當前集群的運行及集群狀態。請單擊待處理頁簽按照頁面提示進行修復。典型修復方案,請參見集群檢查項及修復方案。
說明Kubernetes 1.20及以后版本的集群升級前檢查時,會檢查當前版本是否使用了廢棄API,檢查結果不會影響升級流程,僅作為提示信息。詳細內容,請參見廢棄API說明。
前置檢查通過后,單擊開始升級。
升級過程中,您可以在集群升級頁面下方查看升級進程。升級完成后,您可以在集群列表查看集群版本,確認管控組件升級是否成功。
后續操作:升級節點池
控制面升級完成后,新擴容節點的版本遵循控制面的版本。建議您在業務低峰期盡快完成存量節點的升級,并在升級完成后查看kubelet版本,確認升級是否成功。具體操作,請參見升級節點池。
同時升級控制面和所有節點池
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,選擇目標集群,并在目標集群右側操作列,選擇 。
在集群升級頁面的操作對象區域,選擇可升級的集群版本,選擇升級模式為控制面和所有節點池,并在批量升級策略區域,設置每批次的最大并行數,然后單擊前置檢查。
檢查完成后,單擊查看詳情,查看檢查報告。
檢查結果為正常時,您可以繼續進行集群升級操作。
檢查結果為異常時,請單擊待處理頁簽按照頁面提示進行修復。詳細信息,請參見集群檢查項及修復方案。
前置檢查通過后,單擊開始升級。
升級過程中,請勿添加或刪除節點(如需操作,請先取消升級)。您可以在集群升級頁面下方的事件輪轉區域查看升級進程,還可按需進行以下操作。
暫停與繼續升級:升級過程中,如需在某個階段暫停升級,可單擊暫停。如需繼續集群升級進程,單擊繼續。
集群暫停狀態為集群升級的中間狀態,請盡快完成升級,并在此期間請勿對集群進行任何操作。處于暫停狀態的集群將7日后關閉升級過程,同時清理升級相關的事件和日志信息。
取消升級:如需取消集群升級,可在暫停升級后單擊取消,然后在彈出的對話框單擊確定。取消升級后,當前批次已經開始升級的節點將完成升級且無法回滾,未開始升級的節點不會升級。
說明如果集群升級過程中發生錯誤,系統將暫停集群升級進程。具體失敗原因會展示在頁面下方詳情中,您可根據提示進行修復。
集群升級過程中,除非發生錯誤,否則請勿修改kube-upgrade命名空間下的相關資源。
升級完成后,您可以在集群列表查看集群版本,確認管控組件升級是否成功,并在集群信息頁面的左側導航欄單擊節點管理 > 節點,查看kubelet版本,確認節點升級是否成功。
集群升級常見問題
如何處理專有版集群Master節點升級超時?
問題原因
Admission Webhook組件自簽發的服務端證書未包含必要的SAN字段,導致Master組件啟動失敗。
解決方案
通過以下命令查看Webhook使用的自簽發證書是否具備SAN字段。下述命令需要在已配置kubectl的集群節點中執行。
執行如下命令,查看集群中所有的Admission Webhook。
kubectl get mutatingwebhookconfigurations
預期輸出:
NAME WEBHOOKS AGE ack-node-local-dns-admission-controller 1 27h
執行如下命令,查看對應Webhook配置的Service。
kubectl get mutatingwebhookconfigurations ack-node-local-dns-admission-controller -oyaml | grep service -A 5 service: name: ack-node-local-dns-admission-controller namespace: kube-system path: /inject port: 443 failurePolicy: Ignore
執行如下命令,查找Service的ClusterIP。
kubectl -n kube-system get service ack-node-local-dns-admission-controller
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ack-node-local-dns-admission-controller ClusterIP 192.168.XX.XX <none> 443/TCP 27h
執行如下命令,通過ClusterIP訪問Webhook獲取證書,確保存在Subject Alternative Name字段。
openssl s_client -connect 192.168.XX.XX:443 -showcerts </dev/null 2>/dev/null|openssl x509 -noout -text
如何處理集群升級失敗并提示the aliyun service is not running on the instance?
如何處理節點PLEG not healthy?
容器或者容器運行時無響應。請重啟節點后重新執行升級。
相關文檔
1.24版本不再支持將Docker作為內置容器運行時。升級集群至1.24及更高版本前,請將節點容器運行時遷移到containerd。具體操作,請參見將節點容器運行時從Docker遷移到containerd。