Kube.NETes1.24版本發(fā)布時(shí),正式宣布棄用Dockershim,轉(zhuǎn)向ContAInerd作為默認(rèn)的容器運(yùn)行環(huán)境。Kubernetes以CRI(Container Runtime Interface)容器運(yùn)行時(shí)接口制定接入準(zhǔn)則,用戶可以使用Containerd、CRI-O、CRI- Dockerd及其他容器運(yùn)行時(shí)作為Kubernetes的容器引擎。
Kubernetes為何棄用Dockershim?
Docker在早期沒有實(shí)現(xiàn)Container Runtime Interface (CRI),而CRI是Kubernetes后來增加的對額外運(yùn)行時(shí)的支持標(biāo)準(zhǔn)。Dockershim的存在是為了支持將Docker硬編碼到Kubernetes中,但隨著容器化成為行業(yè)標(biāo)準(zhǔn),Kubernetes項(xiàng)目增加了對額外運(yùn)行時(shí)的支持,比如通過Container Runtime Interface (CRI)容器運(yùn)行時(shí)接口來支持運(yùn)行容器。因此,在Kubernetes1.20版本發(fā)布的時(shí)候提到未來會棄用Dockershim引擎,而在Kubernetes1.24版本發(fā)布時(shí), 正式棄用之。
什么是 Containerd ?
containerd是一種容器運(yùn)行時(shí)引擎,原屬于Docker的組件的一部分,主要提供容器生命周期管理(從創(chuàng)建到銷毀容器)、拉取和推送鏡像、存儲管理(管理鏡像及容器數(shù)據(jù)的存儲)、調(diào)用runc容器運(yùn)行等,現(xiàn)已由開源社區(qū)拆分脫離出來單獨(dú)作為容器運(yùn)行時(shí)項(xiàng)目。
在Kubernetes中,Containerd作為容器運(yùn)行環(huán)境,負(fù)責(zé)管理Pod的生命周期,包括容器的創(chuàng)建、啟動、停止和刪除等操作。與Dockershim相比,Containerd具有更好的性能、更強(qiáng)的可擴(kuò)展性以及更簡潔的架構(gòu)。
容器運(yùn)行底層組件有哪些關(guān)系?
Docker Client和Docker Daemon:Docker Client是Docker的客戶端,它可以通過命令行或API向Docker Daemon發(fā)送請求。Docker Daemon是Docker的核心組件,負(fù)責(zé)管理鏡像、容器、網(wǎng)絡(luò)和卷等資源,并將Docker API暴露給客戶端。
Docker鏡像和Docker容器:Docker鏡像是只讀的模板,包含了所有用于運(yùn)行應(yīng)用程序所需要的代碼、庫文件、環(huán)境變量和配置文件等內(nèi)容。Docker容器是基于Docker鏡像創(chuàng)建的可運(yùn)行實(shí)例。每個容器都是一個獨(dú)立的、輕量級的操作系統(tǒng),它們之間相互隔離并且可以共享主機(jī)的內(nèi)核。
CRI(Container Runtime Interface)和容器運(yùn)行時(shí):CRI是Kubernetes的容器運(yùn)行時(shí)標(biāo)準(zhǔn)接口,滿足這個標(biāo)準(zhǔn)的所有容器運(yùn)行時(shí)都可以被使用。容器運(yùn)行時(shí)則提供了一個輕量級的容器運(yùn)行環(huán)境,用于創(chuàng)建、啟動和停止容器。
OCI(Open Container Initiative)和runc:OCI是一個開放的容器組織,它制定了容器運(yùn)行時(shí)的規(guī)范,包括運(yùn)行時(shí)規(guī)范、容器鏡像規(guī)范等。runc是OCI標(biāo)準(zhǔn)的一個參考實(shí)現(xiàn),它與容器所依賴的cgroup/linux kernel等進(jìn)行交互,是容器最終運(yùn)行的形態(tài)之一。
Containerd在Kubernetes的運(yùn)行變化
在Kubernetes 1.24版本以前,Kubernetes通過調(diào)用Docker命令來創(chuàng)建容器。具體來說,Kubernetes將任務(wù)發(fā)送給Docker客戶端,然后Docker客戶端通過與Docker守護(hù)進(jìn)程(daemon)通信來創(chuàng)建容器。Docker守護(hù)進(jìn)程會通過Image模塊下載鏡像并保存,然后通過client調(diào)用containerd創(chuàng)建并運(yùn)行容器。在這個過程中,如果需要給容器添加持久化存儲,可以使用volume參數(shù);如果需要配置容器網(wǎng)絡(luò),可以通過network參數(shù)來實(shí)現(xiàn)。
然而,Kubernetes提供了更強(qiáng)大的卷掛載能力和集群級別的網(wǎng)絡(luò)能力。在集群中,kubelet只會使用到Docker提供的鏡像下載和容器管理功能,而編排、網(wǎng)絡(luò)、存儲等功能都不會用到。
在Kubernetes 1.24版本以后,Containerd作為容器運(yùn)行時(shí)被引入,帶來了創(chuàng)建Pod所需的所有功能。與之前的方案相比,這不僅帶來了更純粹的功能模塊,而且縮短了調(diào)用鏈,提高了系統(tǒng)的效率和穩(wěn)定性。因此,用戶可以使用Containerd、CRI-O、CRI-Dockerd及其他容器運(yùn)行時(shí)作為Kubernetes的容器引擎。
Containerd在Kubernetes中的工作流
- Kubelet通過CRI運(yùn)行時(shí)服務(wù)API調(diào)用CRI插件來創(chuàng)建Pod。
- CRI創(chuàng)建一個特殊的沙箱容器(pause容器),并將其放置在Pod的Cgroups和NameSpace命名空間中。
- CRI使用CNI配置Pod的網(wǎng)絡(luò)命名空間。
- Kubelet隨后通過CRI鏡像服務(wù)API調(diào)用CRI插件來拉取應(yīng)用容器鏡像。如果鏡像不存在于節(jié)點(diǎn)上,CRI會進(jìn)一步使用Containerd來拉取鏡像。
- Kubelet通過CRI運(yùn)行時(shí)服務(wù)API調(diào)用CRI,并使用拉取的容器鏡像在Pod內(nèi)創(chuàng)建和啟動應(yīng)用程序容器。
- CRI創(chuàng)建應(yīng)用程序容器,將其放入Pod的Cgroups和NameSpace中,然后啟動Pod的新應(yīng)用容器。
在這些步驟之后,一個Pod及其相應(yīng)的應(yīng)用程序容器被創(chuàng)建并運(yùn)行。
Kubernetes棄用Dockershim的影響
容器鏡像,由于Docker鏡像符合OCI規(guī)范,因此可以直接使用而不受影響。此外,原鏡像打包方式仍然可用,即使用docker build方式打包鏡像。這意味著用戶在構(gòu)建和打包鏡像時(shí)不需要做出任何改變
Kubernetes中的運(yùn)行過程,作為終端用戶(Kubernetes使用者)基本也不會有任何影響,因?yàn)镵ubernetes的使用邏輯沒有任何變化。然而,與Dockershim相關(guān)的API接口已經(jīng)棄用,如果創(chuàng)建了此類CRD,需要注意修改相關(guān)代碼。
運(yùn)維方式,節(jié)點(diǎn)后端運(yùn)維時(shí)使用的命令由docker命令改為containerd。如果舊環(huán)境使用的是Dockershim引擎,需要先改為containerd運(yùn)行時(shí)再進(jìn)行升級。運(yùn)維人員則需要適應(yīng)新的命令行工具和運(yùn)行時(shí)環(huán)境。
Kubernetes棄用Dockershim而采用containerd作為容器運(yùn)行時(shí)對用戶和運(yùn)維方式會有一些影響,但對于已經(jīng)符合OCI規(guī)范的鏡像和使用docker build方式打包鏡像的用戶來說,基本無感知。
Kubernetes用戶如何應(yīng)對?
用戶需要按照Kubernetes官方提供的遷移指南進(jìn)行操作。這包括更新Kubernetes版本、修改Pod配置文件、調(diào)整部署流程、更換鏡像管理工具以及重新配置監(jiān)控和日志采集工具等步驟。在遷移過程中,用戶還需要注意測試新環(huán)境的穩(wěn)定性和性能,確保遷移成功。
在遷移過程中,用戶可能會遇到各種問題,如配置錯誤、兼容性問題、性能下降等。為了解決這些問題,用戶可以參考Kubernetes官方文檔和社區(qū)資源,或者向靈雀云的服務(wù)團(tuán)隊(duì)尋求幫助和支持。此外,用戶還可以在測試環(huán)境中模擬遷移過程,提前發(fā)現(xiàn)和解決問題。
遷移到Containerd后,用戶可以對系統(tǒng)進(jìn)行一系列優(yōu)化和改進(jìn),以提高性能和穩(wěn)定性。例如,優(yōu)化Pod的配置和部署流程、使用更高效的網(wǎng)絡(luò)配置方式、改進(jìn)監(jiān)控和日志采集策略等。此外,用戶還可以關(guān)注Kubernetes和Containerd的最新版本和功能更新,及時(shí)跟進(jìn)技術(shù)發(fā)展趨勢。
結(jié)論與展望
Kubernetes棄用Dockershim并轉(zhuǎn)向Containerd已經(jīng)成為一個明顯的趨勢信號。對于現(xiàn)有的Kubernetes用戶來說,應(yīng)盡快了解這一變化的影響和應(yīng)對策略,找到適合自己的方案并盡早進(jìn)行改進(jìn)。未來,Kubernetes與Containerd的發(fā)展趨勢將更加緊密地結(jié)合在一起,共同推動容器技術(shù)的不斷創(chuàng)新和發(fā)展。
參考文檔:
- https://kubernetes.io/zh-cn/blog/2022/02/17/dockershim-faq/
- https://kubernetes.io/zh-cn/blog/2020/12/02/dont-panic-kubernetes-and-docker/