Kubernetes v1.24將不再支援將Docker作為內建容器運行時,為了將ACK升級到Kubernetes v1.24及更高版本,您需要將節點容器運行時從Docker遷移到containerd。本文介紹如何在ACK管理主控台將節點容器運行時從Docker遷移到containerd。
前提條件
已建立Kubernetes叢集。具體操作,請參見建立Kubernetes託管版叢集。
在您的Kubernetes叢集中存在以Docker作為容器運行時的節點。
Docker遷移到containerd資訊介紹
升級方案
將節點容器運行時從Docker遷移到containerd主要通過以下兩種節點池升級方案實現。
方案一:輪轉節點。通過建立節點池(建立節點池時選擇containerd運行時),然後通過應用負載重新發布,指定節點池調度的方式,逐步把應用全部遷移到新的節點池,舊的節點池再做下線處理。
方案二:替盤升級。該方案需要替換節點的系統硬碟。下文介紹的升級內容,均為替盤升級的方案說明和操作方法。
替盤升級的執行步驟及處理邏輯
前置檢查,背景程式會自動檢查叢集以及所依賴的組件版本是否符合containerd的運行要求,如果有不符合項,在升級前需要提前處理。
執行節點池升級,節點池升級過程會根據設定的最大並行數,依次對節點進行升級,最大並行數不會超過節點總數的10%。每個批次的升級節點數為:1、2、4、8……直至達到最大並行數,達到最大並行數後,每個批次都按最大並行數的節點進行升級。例如最大並行數設定為4,那麼第一批升級的節點個數為1,第二批升級的節點個數為2,第三批升級的節點個數為4,以後每批的升級節點個數均為4。
替盤升級單個節點內部的升級邏輯
執行節點排水(並設定節點為不可調度)。
ECS關機,即停止節點。
更換系統硬碟, 系統硬碟ID會變更,但是雲端硬碟類型、執行個體IP地址以及彈性網卡MAC地址保持不變。
重新初始化節點。
重啟節點,節點就緒(設定節點為可調度)。
注意事項
一般情況下,您的工作負載不依賴於容器運行時,且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。
操作步驟
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在節點池頁面,選擇目標節點池,選擇更多>升級。
選擇運行時升級,單擊前置檢查。
前置檢查通過後,選擇運行時升級,單擊開始升級。
更多節點池升級的內容,請參見升級節點池。
常見問題
每個批次升級大概需要多長時間?
通過節點池升級頁面將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目錄。