Kubernetes 1.24不再支援將Docker作為內建容器運行時,Dockershim組件也將在1.24版本中被正式移除。這意味著kubelet將無法與Docker進行互動完成容器的建立和管理操作。為此,ACK也將在1.24及更高版本中不再支援將Docker作為內建容器運行時。為了將ACK升級到1.24及更高版本,您需要將節點容器運行時從Docker遷移到containerd。
Containerd容器運行時是Kubernetes支援的行業標準容器運行時,與Docker運行時相比,containerd具有啟動速度更快、更省資源且更安全的優勢。
Docker遷移到containerd升級方案
升級前,請確認工作負載不依賴於節點Docker進行鏡像構建工作。一般情況下,您的工作負載不依賴於容器運行時,且Docker本身的後端也是調用的containerd。因此,理論上在完成遷移後,您的工作負載將不受影響。
建議先進行測試環境遷移,然後在業務低峰期進行生產環境遷移。
將節點容器運行時從Docker遷移到containerd可以通過以下兩種方案實現。
方案一:原節點池操作升級(推薦)
通過節點池頁面的Kubelet 升級功能完成Docker到containerd的遷移。此方案會自動替換節點系統硬碟,請勿在系統硬碟中儲存重要資料,或提前做好備份工作。資料盤在升級過程中則不受影響。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在目標節點池列表的操作列,選擇
> Kubelet 升級。確認運行時升級的相關資訊,單擊前置檢查。前置檢查通過後,按照頁面提示完成運行時的升級。
相關注意事項及配置項的詳細說明,請參見升級節點池。
方案二:建立containerd節點池輪轉遷移(可選)
建立一個節點池,運行時選擇containerd,擴容節點。通過設定老節點池禁止調度或者更新應用負載指定節點池調度的方式(例如Label),逐步將應用全部遷移至新的節點池,再將舊節點池進行下線處理。
遷移後注意事項
遷移後,Dockerfile的主要文法保持不變,但請關注與運行時環境相關的配置,例如基礎鏡像的相容性、環境變數的設定和運行時命令的定義,以確保鏡像在containerd環境下能夠順利構建和運行。
由於containerd本身不具有鏡像構建的功能,因此在完成升級後,您將在叢集節點上無法使用Docker Build進行鏡像構建,但鏡像的拉取不受影響。
將容器運行時遷移到containerd後,Docker將不再作為容器生命週期的管理者。因此,在完成遷移後您將無法在節點上使用Docker命令或Docker API查看容器狀態或與容器進行互動。但是你依然可以使用containerd命令代替Docker命令,關於containerd的命令與Docker命令映射關係,請參見containerd、安全沙箱、Docker運行時的對比。
替盤升級原理介紹
ACK會自動按照以下流程執行替盤升級完成Docker到containerd遷移操作。
執行節點排水(並設定節點為不可調度)。
ECS關機,即停止節點。
更換系統硬碟, 系統硬碟ID會變更,但是雲端硬碟類型、執行個體IP地址以及彈性網卡MAC地址保持不變。
重新初始化節點安裝containerd運行時。
重啟節點,節點就緒(設定節點為可調度)。
常見問題
每個批次升級大概需要多長時間?
通過節點池升級頁面將Docker遷移到containerd,採用的是替盤升級方式。如果不涉及快照,一般是8min內。如果在升級時選中快照,升級會在快照結束後執行,執行時間取決於快照時間。節點池升級容忍快照40min,如果40min內快照還未結束會判定節點逾時失敗,失敗的節點此時還未開始執行升級操作。如果沒有在系統硬碟中儲存業務資料,可以不選中快照,避免升級用時過久。
每個批次的升級節點數為:1、2、4、8……直至達到最大並行數,達到最大並行數後,每個批次都按最大並行數的節點進行升級。例如每批次執行最多節點數設定為4,那麼第一批升級的節點個數為1,第二批升級的節點個數為2,第三批升級的節點個數為4,以後每批的升級節點個數均為4。
升級過程業務是否受影響?
通過節點池升級頁面將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。
節點運行時由Docker切換為containerd後,Docker目錄未被清理佔用磁碟空間怎麼辦?
除Kubernetes叢集可管理的容器、鏡像、日誌等檔案外,Docker目錄中也包含您自行建立的檔案路徑。如無需使用,請在運行時切換後手動刪除資料盤中的Docker目錄。