Kubelet不再支持Docker運行時
時間:2022-04-10 03:27:01 | 來源:行業(yè)動態(tài)
時間:2022-04-10 03:27:01 來源:行業(yè)動態(tài)
人們對Docker未來的擔(dān)心源于Kubernetes 在1.20版本中的 ChangeLog 提到,kubelet 中的 Docker 支持功能現(xiàn)已棄用,并將在之后的版本中被刪除。社區(qū)解釋說,這么做的原因是,Kubelet 之前使用的是一個名為 dockershim 的模塊,用以實現(xiàn)對 Docker 的 CRI 支持,但 Kubernetes 社區(qū)發(fā)現(xiàn)其維護(hù)存在問題,因此建議大家考慮使用包含 CRI 完整實現(xiàn)的可用容器運行時。
首先要說明的是,這里提到的Docker運行時并不等同于我們經(jīng)常說的Docker,這可能是讓人們以為Docker被Kubernetes拋棄的一個原因。運行時(Runtime)為應(yīng)用程序運行時提供保障的一個環(huán)境,通常是一些可以重用的程序/庫或者實例,這些實例可以在它們運行的時候被連接或者被任何程序調(diào)用。在Kubernetes集群內(nèi)部也有一種稱為容器運行時的組件,負(fù)責(zé)提取并運行容器鏡像。Docker就是目前最流行的容器運行時,除此之外容器運行時還有Containerd與CRI-O。
與Containerd與CRI-O的定位就是一個運行時不同,Docker集成了太多功能,而很多功能作為一個運行時并非必須,比如容器創(chuàng)建,而且Docker最初在設(shè)計上也并未考慮到被嵌入到Kubernetes這種用法。
應(yīng)該說,當(dāng)初為了支持使用Docker的這個運行時,kubelet做出了妥協(xié)。如果采用Containerd與CRI-O運行時,其調(diào)用流程是:kubelet向CRI-Container插件發(fā)出調(diào)用請求,由CRI-Container再和容器運行時通信,完成請求的各種操作,但采用Docker運行時,這個流程就需要做出改變。由于Docker運行時并不兼容CRI,不得不引入一個新的插件Dockershimi作為緩沖。此時流程變成:kubelet先向Dockershimi發(fā)出請求,由Dockershimi調(diào)用Docker運行時,Docker運行時再調(diào)用其中的Containerd,由Containerd來負(fù)責(zé)完成請求的各種操作??梢钥闯?,這個過程中Docker運行時有點尬尷,它的加入不僅在流程上多了一個環(huán)節(jié),引入了Dockershimi,而Dockershimi的介入又引發(fā)了新的問題,必須額外加以維護(hù),否則就可能引發(fā)安全問題。
如今,隨著Kubernetes社區(qū)的逐漸強(qiáng)大,當(dāng)初Kubernetes向Docker做出的妥協(xié)現(xiàn)在不打算繼續(xù)了,這才有了kubelet不再支持Docker運行時的舉措。目前來看這件事的影響不大,正如CNCF所言,Docker不會就此消亡,Docker會繼續(xù)構(gòu)建起不計其數(shù)的容器,開發(fā)人員仍然可以繼續(xù)采用Docker,繼續(xù)將Docker作為開發(fā)工具,Docker所生成的鏡像仍可在Kubernetes集群內(nèi)正常運行。
如果使用的是云上的容器服務(wù),比如GKE或者EKS等托管Kubernetes服務(wù),則需要確保在未來的Kubernetes版本徹底去除Docker支持之前,為工作節(jié)點引入受支持的容器運行時。如果是自己負(fù)責(zé)管理的集群,則要注意更新和調(diào)整運行時以避免服務(wù)中斷。在1.20版本中,將收到Docker棄用警告。而在未來的Kubernets版本(計劃在2021年下半年發(fā)布的1.23版本)中,Docker運行時將被徹底移除、不再受到支持。
然而,長期來看呢?