全部產品
Search
文件中心

Container Service for Kubernetes:手動升級ACK叢集

更新時間:Sep 14, 2024

為避免到期版本叢集存在的安全和穩定性風險,同時保證您業務的連貫性,Container ServiceACK採用原地升級的方式升級ACK叢集版本。您可以通過控制台升級叢集的Kubernetes版本,也可以獨立升級控制面和節點池,靈活控制升級節奏。本文介紹叢集升級前後的注意事項、升級流程、操作步驟等。

為什麼需要升級

ACK保證Kubernetes最新3個次要版本的建立。例如,支援Kubernetes 1.28、1.30、1.31三個版本時,1.26版本不再支援建立,到期補丁版本也不再支援建立。

主動升級叢集有以下好處:

  • 降低安全和穩定性風險:隨著Kubernetes版本迭代,會不斷最佳化及修複發現的安全及穩定性漏洞,長久使用到期版本叢集會給業務帶來安全和穩定性風險。

  • 享受更好的維護支援:對於到期Kubernetes版本,ACK不再提供安全補丁和問題修複,也無法保證到期版本的支援人員品質。使用新版本能夠讓您享受更好的支援人員和答疑服務。

  • 使用新版本的新功能:隨著社區Kubernetes版本的演化,新版本包含新的功能和改進,ACK也將適配新版本,為您帶來更好的開發和營運體驗。

此外,基於安全原因,ACK保留強制升級部分到期版本的叢集的權利。建議您參照下文提前主動升級叢集。

重要

升級叢集時,Container ServiceACK會對您的叢集進行前置檢查,但無法保證檢查出所有不相容的功能配置和API。根據安全責任共擔模型,請您通過協助文檔、控制台資訊、站內信等渠道關注版本發布情況,並在叢集升級時提前瞭解相應版本的升級注意事項。

更多關於Kubernetes版本支援資訊,請參見Kubernetes版本概覽及機制

注意事項(重要)

版本說明

ACK叢集的Kubernetes版本只能按照支援的版本依次升級。例如,Kubernetes版本為1.28的ACK叢集升級到1.31時,需要進行兩次叢集升級,即先升級到1.30版本,再升級到1.31版本。

您可以登入Container Service管理主控台,在叢集頁面的版本列查看叢集的Kubernetes版本。確定待升級版本後,請參見Kubernetes版本概覽及機制及各版本說明瞭解待升級版本的版本解讀、廢棄資源API、升級注意事項等,避免因高版本的功能變更導致業務功能不相容,從而影響叢集正常運行。

說明

如果您的Helm Chart YAML檔案中使用了廢棄資源,請及時修改。更多資訊,請參見上方版本說明和廢棄API說明

相關功能及自訂配置說明

如果您的叢集中使用了如下相關功能,請仔細閱讀以下說明及解決方案。

配置項

注意事項

推薦解決方案

Flexvolume儲存

叢集升級過程中,老版本的Flexvolume(v1.11.2.5及以前)掛載的OSS儲存卷會重新掛載。

若您的叢集使用OSS儲存卷,請在叢集升級後重建相應的Pod。

同時,由於Flexvolume儲存外掛程式已經棄用,建議您將FlexVolume遷移至CSI外掛程式。具體操作,請參見遷移Flexvolume至CSI

節點自動調整

  • 如果您的叢集使用了節點自動調整功能,為保證自動調整功能不受影響,叢集在升級成功後會自動更新cluster-autoscaler組件至最新版本。

  • 叢集升級期間,受Auto Scaling極速彈出模式管理的節點可能會因節點關機而無法完成升級。

  • 確認cluster-autoscaler組件版本是否正常。更多資訊,請參見啟用節點自動調整

  • 如果升級結束後排查有節點因極速彈出模式未被升級,建議手動移除該節點。

節點資源預留

升級叢集至1.18版本後,ACK會預設配置節點資源預留。如果叢集未配置資源預留且節點水位較高,升級後存在Pod驅逐後無法被快速調度的風險。

為節點預留部分資源,推薦CPU使用率不超過50%,記憶體使用量率不超過70%。更多資訊,請參見節點資源預留策略

Loadbalancer配置

叢集外部存取叢集時,需要通過SLB來訪問。但當SLB設定externalTrafficPolicy: Local後,只有部署了相應後端Pod的節點才能訪問到對應的SLB地址。如果叢集節點或者Pod所在的節點上沒有相應的後端服務Pod,可能導致網路不通,

檢查是否完成對應配置,避免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版本不同,發生類似invalid object doesn't have additional properties的報錯。

安裝或升級kubectl。具體操作,請參見安裝kubectl

如果您對叢集曾有自訂配置,請仔細閱讀以下說明。

配置項

說明

網路

叢集升級需要使用yum下載升級所需的軟體包。如果您的叢集曾自行修改節點的網路設定或者使用了自訂的作業系統鏡像,需確保節點的yum能正常使用。您可以執行yum makecache進行檢查。

作業系統鏡像

自訂動作系統鏡像非Container Service官方嚴格驗證。ACK無法完全保證升級成功。

其他

如果您對叢集有過配置更改,例如開啟了SWAP分區、曾通過黑屏操作修改kubelet配置等,叢集升級過程有可能失敗,或自訂配置有可能丟失。

升級流程、方式及所需時間

升級流程

image.png

  • 準備工作及前置檢查

    • 注意事項:確定您待升級叢集的Kubernetes版本後,仔細閱讀待升級目標版本的版本升級注意事項,避免升級時潛在的功能不相容問題。更多資訊,請參見上文的版本說明

    • 前置檢查:執行前置檢查,排查暴露影響升級的風險項。如有檢查異常項,請按控制台提示或參見叢集檢查項及修複方案修複風險項。

  • 叢集升級:前置檢查通過後,可開始叢集升級,包括控制面和節點池的升級。ACK提供以下兩種升級模式。

    • 同時升級:一起完成控制面和節點池升級。

    • 獨立升級:先獨立升級控制面,再獨立升級節點池。

    控制面升級包括對核心組件kube-apiserver的升級,節點池升級包括對kubelet及其相依元件的升級。為保證叢集穩定性和可靠性,需要保證kube-apiserver不低於kubelet兩個版本,故需要先完成控制面獨立升級,再在業務低峰期完成節點池升級。

  • 叢集升級後:核驗叢集、kubelet等版本,檢查節點池運行是否正常,以及檢查叢集業務是否運行正常。

升級方式

控制面升級

ACK託管叢集ACK Serverless叢集

ACK託管叢集ACK Serverless叢集採用滾動升級的方式。具體流程如下。

  1. 升級控制面和託管組件,包括kube-apiserverkube-controller-managercloud-controller-managerkube-scheduler

  2. 升級Kubernetes組件,例如kube-proxy等。

ACK專有叢集

ACK專有叢集採用原地升級的方式,以更大程度地保證您業務的連貫性,減少資料移轉和配置調整的風險。具體流程如下。

  1. 當ACK檢測到您的叢集需要進一步升級etcd和Container Runtime時,將依次升級Master節點上的etcd和Container Runtime。

  2. 依次選擇Master節點,一次只升級一個Master節點,並展示當前正在升級的Master節點的編號。

  3. 升級Master組件,包括kube-apiserverkube-controller-managercloud-controller-managerkube-scheduler等。

  4. 升級Master節點上的kubelet。

  5. 在所有Master節點升級完成後,升級Kubernetes組件,例如kube-proxy等。

節點池升級

節點池升級包括kubelet、OS鏡像和容器運行時的升級。如您需要更換作業系統,或運行時需從Docker升級為containerd,系統會通過替換系統硬碟(替盤升級)的方式完成升級,即更換磁碟的同時進行作業系統或應用程式的升級。請提前做好系統硬碟的備份工作。其他情況下,保持使用原地升級方式。更多資訊,請參見升級節點池

ACK將叢集中的節點按照分批策略執行分批升級:

  • 根據節點池依次執行,同一時間只有一個節點池進行升級。

  • 在同一個節點池內進行分批升級。第一批升級的節點數為1,後續的批次以2的冪數進行增長。如果暫停後重新恢複升級,依然遵循該分批策略。您可以在節點池升級頁面配置每批升級節點的最大數量,推薦設定為10。具體操作,請參見升級節點池

升級所需時間

ACK託管叢集ACK Serverless叢集控制面升級時間約為5分鐘;ACK專有叢集的Master節點需逐個、串列升級,每個Master節點升級時間約為8分鐘。節點池升級時內部節點分批升級,每批升級時間約為5分鐘。

操作步驟

僅升級控制面

使用限制

僅1.18及以上版本的叢集支援升級ACK叢集時僅升級控制面。

操作步驟

節點池升級前,您應先完成控制面升級。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,選擇目的地組群,並在目的地組群右側操作列,選擇更多 > 營運管理 > 叢集升級

  3. 叢集升級頁面的操作對象地區,選擇可升級的叢集版本,選擇升級模式僅控制面,然後單擊前置檢查

    檢查完成後,單擊查看詳情,查看檢查報告。

    • 當檢查報告中檢查結果正常時,表示升級檢查成功,您可以進行叢集升級操作。

    • 當檢查報告中檢查結果異常時,不影響當前叢集的運行及叢集狀態。請單擊待處理頁簽按照頁面提示進行修複。典型修複方案,請參見叢集檢查項及修複方案

      說明

      Kubernetes 1.20及以後版本的叢集升級前檢查時,會檢查目前的版本是否使用了廢棄API,檢查結果不會影響升級流程,僅作為提示資訊。詳細內容,請參見廢棄API說明

  4. 前置檢查通過後,單擊開始升級

    升級過程中,您可以在叢集升級頁面下方查看升級進程。升級完成後,您可以在叢集列表查看叢集版本,確認管控組件升級是否成功。

後續操作:升級節點池

控制面升級完成後,新擴容節點的版本遵循控制面的版本。建議您在業務低峰期儘快完成存量節點的升級,並在升級完成後查看kubelet版本,確認升級是否成功。具體操作,請參見升級節點池

同時升級控制面和所有節點池

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,選擇目的地組群,並在目的地組群右側操作列,選擇更多 > 營運管理 > 叢集升級

  3. 叢集升級頁面的操作對象地區,選擇可升級的叢集版本,選擇升級模式控制面和所有節點池,並在批量升級策略地區,設定每批次的最大並行數,然後單擊前置檢查

    檢查完成後,單擊查看詳情,查看檢查報告。

    • 檢查結果正常時,您可以繼續進行叢集升級操作。

    • 檢查結果異常時,請單擊待處理頁簽按照頁面提示進行修複。詳細資料,請參見叢集檢查項及修複方案

  4. 前置檢查通過後,單擊開始升級

    升級過程中,請勿添加或刪除節點(如需操作,請先取消升級)。您可以在叢集升級頁面下方的事件輪轉地區查看升級進程,還可按需進行以下操作。

    • 暫停與繼續升級:升級過程中,如需在某個階段暫停升級,可單擊暫停。如需繼續叢集升級進程,單擊繼續

      叢集暫停狀態為叢集升級的中間狀態,請儘快完成升級,並在此期間請勿對叢集進行任何操作。處於暫停狀態的叢集將7日後關閉升級過程,同時清理升級相關的事件和日誌資訊。

    • 取消升級:如需取消叢集升級,可在暫停升級後單擊取消,然後在彈出的對話方塊單擊確定。取消升級後,當前批次已經開始升級的節點將完成升級且無法復原,未開始升級的節點不會升級。

      說明
      • 如果叢集升級過程中發生錯誤,系統將暫停叢集升級進程。具體失敗原因會展示在頁面下方詳情中,您可根據提示進行修複。

      • 叢集升級過程中,除非發生錯誤,否則請勿修改kube-upgrade命名空間下的相關資源。

    升級完成後,您可以在叢集列表查看叢集版本,確認管控組件升級是否成功,並在叢集資訊頁面的左側導覽列單擊節點管理 > 節點,查看kubelet版本,確認節點升級是否成功。

叢集升級常見問題

如何處理專有版叢集Master節點升級逾時?

問題原因

Admission Webhook組件自簽發的服務端認證未包含必要的SAN欄位,導致Master組件啟動失敗。

解決方案

通過以下命令查看Webhook使用的自簽發認證是否具備SAN欄位。下述命令需要在已配置kubectl的叢集節點中執行。

  1. 執行如下命令,查看叢集中所有的Admission Webhook。

    kubectl get mutatingwebhookconfigurations

    預期輸出:

    NAME                                      WEBHOOKS   AGE
    ack-node-local-dns-admission-controller   1          27h
  2. 執行如下命令,查看對應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
  3. 執行如下命令,尋找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
  4. 執行如下命令,通過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?

問題原因

雲助手不可用,導致升級命令下發失敗。

解決方案

請啟動或停止雲助手後,重新執行叢集升級操作。具體操作,請參見啟動、停止或者卸載雲助手Agent

如何處理節點PLEG not healthy?

容器或者容器運行時無響應。請重啟節點後重新執行升級。

相關文檔