全部產品
Search
文件中心

Container Service for Kubernetes:將節點容器運行時從Docker遷移到containerd

更新時間:Jun 19, 2024

Kubernetes v1.24將不再支援將Docker作為內建容器運行時,為了將ACK升級到Kubernetes v1.24及更高版本,您需要將節點容器運行時從Docker遷移到containerd。本文介紹如何在ACK管理主控台將節點容器運行時從Docker遷移到containerd。

前提條件

  • 已建立Kubernetes叢集。具體操作,請參見建立Kubernetes託管版叢集

  • 在您的Kubernetes叢集中存在以Docker作為容器運行時的節點。

Docker遷移到containerd資訊介紹

升級方案

將節點容器運行時從Docker遷移到containerd主要通過以下兩種節點池升級方案實現。

  • 方案一:輪轉節點。通過建立節點池(建立節點池時選擇containerd運行時),然後通過應用負載重新發布,指定節點池調度的方式,逐步把應用全部遷移到新的節點池,舊的節點池再做下線處理。

  • 方案二:替盤升級。該方案需要替換節點的系統硬碟。下文介紹的升級內容,均為替盤升級的方案說明和操作方法。

替盤升級的執行步驟及處理邏輯

  1. 前置檢查,背景程式會自動檢查叢集以及所依賴的組件版本是否符合containerd的運行要求,如果有不符合項,在升級前需要提前處理。

  2. 執行節點池升級,節點池升級過程會根據設定的最大並行數,依次對節點進行升級,最大並行數不會超過節點總數的10%。每個批次的升級節點數為:1、2、4、8……直至達到最大並行數,達到最大並行數後,每個批次都按最大並行數的節點進行升級。例如最大並行數設定為4,那麼第一批升級的節點個數為1,第二批升級的節點個數為2,第三批升級的節點個數為4,以後每批的升級節點個數均為4。

替盤升級單個節點內部的升級邏輯

  1. 執行節點排水(並設定節點為不可調度)。

  2. ECS關機,即停止節點。

  3. 更換系統硬碟, 系統硬碟ID會變更,但是雲端硬碟類型、執行個體IP地址以及彈性網卡MAC地址保持不變。

  4. 重新初始化節點。

  5. 重啟節點,節點就緒(設定節點為可調度)。

注意事項

一般情況下,您的工作負載不依賴於容器運行時,且Docker本身的後端也是調用的containerd,因此,理論上在完成遷移後您的工作負載將不受影響。

重要

建議您先在測試環境中進行遷移測試,確認沒有影響後再在生產環境中進行遷移操作,以免造成預期外的損失。

由於containerd本身不具有鏡像構建的功能,因此在完成升級後,在叢集節點上您將無法使用Docker Build進行鏡像構建,但鏡像的拉取不受影響。

重要

建議您不要在叢集節點上進行鏡像構建工作。

將容器運行時遷移到containerd後,Docker將不再作為容器生命週期的管理者。因此,在完成遷移後您將無法在節點上使用Docker命令或Docker API查看容器狀態或與容器進行互動。

背景資訊

因為Kubernetes社區將在Kubernetes v1.24中不再支援將Docker作為內建容器運行時。為此,Dockershim組件也將在Kubernetes v1.24版本中被正式移除,這意味著kubelet將無法再通過該組件與Docker進行互動並進行容器的建立和管理操作。

由於社區的更改,ACK也將在Kubernetes v1.24及更高版本中不再支援將Docker作為內建容器運行時。如果您正在使用Docker作為容器運行時,則必須先遷移到使用containerd作為容器運行時,否則將無法在ACK的後續更新中升級到Kubernetes v1.24及更高版本。

containerd容器運行時是Kubernetes支援的行業標準容器運行時,與Docker運行時相比,containerd具有更省資源且更安全的優勢。關於containerd的更多資訊,請參見containerd

操作步驟

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇節點管理 > 節點池

  3. 節點池頁面,選擇目標節點池,選擇更多>升級

  4. 選擇運行時升級,單擊前置檢查

  5. 前置檢查通過後,選擇運行時升級,單擊開始升級

說明

更多節點池升級的內容,請參見升級節點池

常見問題

每個批次升級大概需要多長時間?

通過節點池升級頁面將Docker遷移到containerd,採用的是替盤升級方式。如果不涉及快照,一般是8min內。如果在升級時選中快照,升級會在快照結束後執行,執行時間取決於快照時間。節點池升級容忍快照40min,如果40min內快照還未結束會判定節點逾時失敗,失敗的節點此時還未開始執行升級操作。如果沒有在系統硬碟中儲存業務資料,可以不選中快照,避免升級用時過久。

升級過程業務是否受影響?

通過節點池升級頁面將Docker遷移到containerd,採用的是替盤升級方式。替盤升級時會對節點排水,如果Pod實現了優雅退出邏輯(Graceful shutdown and zero downtime deployments in Kubernetes),並且多副本部署在多個Node上,對業務沒有影響。為了避免同一個應用的多個副本都在一個批次內進行升級,可以手動調整並行數小於Pod副本數。

將Docker遷移到containerd後,支援回退嗎?

不支援回退。

將Docker遷移到containerd的過程中,節點資料會丟失嗎?

通過節點池升級頁面將Docker遷移到containerd,採用的是替盤升級方式。以替換節點系統硬碟的方式執行節點運行時升級時,請不要在系統硬碟中儲存重要資料或者提前做好備份工作,資料盤在升級過程中則不受影響。

節點替換系統硬碟後,節點的IP地址會變嗎?

替換系統硬碟, 系統硬碟ID會變更,但是雲端硬碟類型、執行個體IP地址以及彈性網卡MAC地址保持不變。更多資訊,請參見更換作業系統(系統硬碟)

containerd對Docker的相容情況是怎樣的?

一般情況下,您的工作負載不依賴於容器運行時,且Docker本身的後端也是調用的containerd,因此,理論上在完成遷移後您的工作負載將不受影響。

由於containerd本身不具有鏡像構建的功能,因此在完成升級後,在叢集節點上您將無法使用Docker Build進行鏡像構建,但鏡像的拉取不受影響。

將容器運行時遷移到containerd後,Docker將不再作為容器生命週期的管理者。因此,在完成遷移後您將無法在節點上使用Docker命令或Docker API查看容器狀態或與容器進行互動。

如果之前在叢集節點上依賴Docker構建了鏡像,現在運行時升級為containerd怎麼辦?

您可以基於阿里雲Container RegistryACR的產品化能力構建鏡像,也可以手動構建鏡像。

  • 使用ACR構建(推薦):ACR鏡像構建基於Docker官方鏡像構建工具BuildKit實現。您可以建立ACR執行個體,基於Dockerfile檔案的構建規則自動觸發鏡像構建,然後運行Dockerfile執行構建,構建完成後自動認可鏡像到容器鏡像倉庫。具體操作,請參見使用企業版執行個體構建鏡像

  • 手動構建:為保障最佳的節點效能,建議額外建立一台ECS執行個體,手動安裝Docker後使用Docker命令構建鏡像。具體操作,請參見安裝Docker並使用(Linux)

節點運行時由Docker切換為containerd後,Docker目錄未被清理佔用磁碟空間怎麼辦?

除Kubernetes叢集可管理的容器、鏡像、日誌等檔案外,Docker目錄中也包含您自行建立的檔案路徑。如無需使用,請在運行時切換後手動刪除資料盤中的Docker目錄。