升級集群Kubernetes版本時,請在控制面升級后及時在業務低峰期完成節點池的升級。節點池升級包括kubelet升級和容器運行時升級。執行升級操作前,ACK會提供前置檢查,識別并提示可能影響升級的風險因素,以便實現平滑升級。
注意事項
節點伸縮
若集群啟用了節點伸縮功能,為保證自動伸縮功能不受影響,集群在升級成功后會自動更新cluster-autoscaler組件至最新版本。集群升級后,請確認cluster-autoscaler組件版本是否正常。更多信息,請參見啟用節點自動伸縮。
集群升級期間,伸縮模式為極速模式的節點可能會因節點關機而無法完成升級。如果升級結束后存在節點因極速模式未被升級,建議手動移除該節點。
升級集群至1.18版本后,ACK會默認配置節點資源預留。如果集群未配置資源預留且節點水位較高,升級后存在Pod驅逐后無法被快速調度的風險。請為節點預留部分資源,推薦CPU使用率不超過50%,內存使用率不超過70%。更多信息,請參見節點資源預留策略。
在1.24及以下版本的集群中,如果工作負載的Pod只配置了啟動探針(Startup Probe),Pod會在kubelet重啟后出現短暫的NotReady現象。建議您采用多副本部署策略,將工作負載分散在多個節點上,以確保在某個節點重啟期間仍有足夠的可用Pod。
如果某個Pod通過
LoadBalancer
類型的Service的SLB地址訪問同一節點上的另一個Pod,并且該Service的externalTrafficPolicy
設置為Local
,那么在節點輪轉后,兩個Pod可能不再位于同一個節點上,繼而導致網絡不通。自定義操作系統鏡像非ACK官方嚴格驗證。ACK無法完全保證升級成功。
集群升級需要使用yum下載升級所需的軟件包。如果您的集群曾自行修改節點的網絡配置或者使用了自定義的操作系統鏡像,需確保節點的yum能正常使用。您可以執行
yum makecache
進行檢查。如果您對集群有過配置更改,例如打開了SWAP分區、曾通過黑屏操作修改kubelet配置或運行時配置等,集群升級過程有可能失敗,或自定義配置可能會被覆蓋。
通過替盤方式升級節點時,ACK會進行節點排水操作,遵循Pod Disruption Budget(PDB)的前提下將節點上的Pod驅逐至其他可用節點。為確保服務高可用性,建議您采用多副本部署策略,將工作負載分散在多個節點上,同時為關鍵業務配置PDB,控制同時中斷的Pod數量。
節點排水的默認超時時間為30分鐘。如果在超時時間內未能完成Pod遷移,ACK將終止本次升級以確保業務穩定性。
如果節點中的Pod引用了Hostpath,且該Hostpath指向系統盤,替盤升級后Hostpath目錄中數據會丟失。
節點池升級過程中僅支持擴容操作,不支持縮容操作。
如果您的節點為游離節點,即未被節點池管理的Worker節點,需參見遷移游離節點至節點池完成遷移。
功能說明
節點池升級包括kubelet升級和容器運行時升級。
kubelet升級:將節點池內節點的kubelet升級到與控制面相同的版本。默認采取原地升級。
容器運行時升級:容器運行時發布新版本后,可升級節點的容器運行時至最新版本。
從Docker升級為containerd時,將通過替盤重置節點(替換節點系統盤)的方式升級節點池節點,升級過程將清除系統盤上的所有內容。替盤升級前,請務必備份系統盤中的重要數據。更多信息,請參見將節點容器運行時從Docker遷移到containerd。
從containerd升級至更新版本的containerd時,默認采取原地升級。節點上的
/etc/containerd/config.toml
會被替換為ACK提供的新版本。說明運行時升級過程中可能會造成Pod Prober、Lifecycle Hook失敗,也可能會出現Pod原地重啟情況。
操作步驟
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在節點池列表的操作列,選擇目標節點池對應的更多 > Kubelet 升級。
查看待升級對象(容器運行時和/或kubelet),指定待升級節點(所有節點或部分節點),選擇升級方式,并配置批量升級的策略。
升級方式:
批量升級策略:
每批次執行最多節點數:升級過程會根據設置的最大并行數依次對節點進行升級,最大可設置為10。關于升級流程說明,請參見下方參考信息:原地升級和替盤升級。
自動暫停策略:在節點升級過程中的暫停策略。
每批次間隔時間:自動暫停策略為不暫停時,選擇每個升級批次之間是否需要時間間隔或間隔的時長。可選范圍為5~120分鐘。
單擊前置檢查,并在前置檢查通過后按照頁面提示開始升級操作。
說明如果前置檢查執行失敗或者存在警告項,請參見異常檢查項修復方案或根據頁面提示查看檢查報告,進行排查和治理。
升級時,在事件輪轉區域,您可以進行如下操作。
暫停:集群暫停狀態為節點池升級的中間狀態,建議您不要在此期間對集群進行操作,并盡快完成升級過程。處于中間狀態的集群會在7日之后關閉升級過程,并清理一切升級相關的事件和日志信息。
暫停后,已完成升級的節點的kubelet和容器運行時不支持版本回退。
取消:取消升級。單擊取消后,已完成升級的節點的kubelet和容器運行時不支持版本回退。
升級后,您可以在節點頁面單擊節點名稱,在基本信息頁簽查看節點的kubelet版本、容器運行時版本等信息是否符合預期。
參考信息:原地升級和替盤升級
原地升級和替盤升級流程
原地升級和替盤升級的流程如下。節點池升級過程會根據設置的最大并行數,依次對節點進行升級,并行節點數最大可設置為10。每個批次的升級節點數依次為1、2、4、8……直至達到最大并行數。達到最大并行數后,每個批次都按最大并行數的節點進行升級。例如,最大并行數設置為4,那么第一批升級的節點個數為1,第二批升級的節點個數為2,第三批升級的節點個數為4,以后每批的升級節點個數均為4。
下圖以最大并行數=N時為例,介紹分批次執行的流程,即每個批次的升級節點數依次為1、2、4、8……直至達到最大并行數N。
原地升級單個節點內部的升級邏輯
執行升級前置檢查。如果容器有關鍵異常(例如無法正常服務ttrpc請求、容器內進程無法正常響應信號等),則會停止升級。
將當前容器和Pod狀態保留到tmp臨時目錄。
將containerd、crictl及相關配置文件升級為ACK提供的新版本,重啟containerd(此行為不會影響運行中的容器)。如果您之前在節點上修改過
/etc/containerd/config.toml
配置,此次升級會導致您的修改被覆蓋。確保kubelet處于正常運行狀態,節點就緒。
替盤升級單個節點內部的升級邏輯
執行節點排水(若節點可調度,系統會將其設置為不可調度)。
ECS關機,即停止節點。
更換系統盤,系統盤ID會變更,但是云盤類型、實例IP地址以及彈性網卡MAC地址保持不變。
重新初始化節點。
重啟節點,節點就緒(同時設置節點為可調度)。
如果某節點在執行節點排水前已被設置為不可調度,那么在替盤升級完成后,該節點不會自動恢復為可調度。
常見問題
節點池升級后支持版本回退嗎?
kubelet和容器運行時在版本升級后均不支持版本回退。操作系統在升級后支持版本回退,回退時需要確保原鏡像仍被該節點池所支持。
升級過程中業務是否受影響?
原地升級:Pod不會重啟,不會影響業務。
替盤升級:替盤升級時會對節點排水,如果Pod實現了優雅退出邏輯(Graceful shutdown and zero downtime deployments in Kubernetes),并且多副本部署在多個節點上,對業務沒有影響。為了避免同一個應用的多個副本都在一個批次內進行升級,可以手動調整并行數小于Pod副本數。
每個批次升級大概需要多長時間?
原地升級:5min內
替盤升級:如果不涉及快照,一般在8min內。如果在升級時選中快照,升級會在快照結束后執行,執行時間取決于快照時間。節點池升級容忍快照40min,如果40min內快照還未結束會判定節點升級超時失敗,失敗的節點此時還未開始執行升級操作。如果沒有在系統盤中保存業務數據,可以不選中快照,避免升級用時過久。
節點升級過程中節點數據會丟失嗎?
以替換節點系統盤的方式執行節點運行時升級時,請不要在系統盤中保存重要數據或者提前做好備份工作。數據盤在升級過程中則不受影響。
節點替換系統盤后,節點的IP地址會變嗎?
替換系統盤的方式中系統盤ID會變更,但是云盤類型、實例IP地址以及彈性網卡MAC地址保持不變。更多信息,請參見更換操作系統(系統盤)。
如何升級不屬于任何節點池的集群節點?
在節點池功能上線前創建的老集群,會存在不屬于任何節點池的游離節點。您可以將游離節點遷移到一個節點池后,對節點池進行升級。關于如何遷移游離節點至節點池,請參見遷移游離節點至節點池。
節點運行時由Docker切換為containerd后,Docker目錄未被清理占用磁盤空間怎么辦?
除Kubernetes集群可管理的容器、鏡像、日志等文件外,Docker目錄中也包含您自行創建的文件路徑。如無需使用,請在運行時切換后手動刪除數據盤中的Docker目錄。
如何基于快照還原數據?
相關文檔
您也可以啟用集群自動升級功能,降低版本運維壓力,請參見自動升級集群。
關于containerd的變更記錄,請參見containerd運行時發布記錄。
ACK托管節點池提供操作系統CVE漏洞自動修復功能,請參見操作系統CVE漏洞自動修復(推薦)。
Kubernetes 1.24將不再支持將Docker作為內置容器運行時,請將節點容器運行時從Docker遷移到containerd,請參見將節點容器運行時從Docker遷移到containerd。
Docker和containerd的命令行工具不同,關于常用命令對比,請參見Docker和containerd兩種容器引擎常用命令對比。
推薦您及時更新操作系統鏡像版本,請參見更換操作系統。