本文轉自Rancher Labsgit
近期,Kubernetes在其最新的Changelog中宣佈,自Kubernetes 1.20以後將棄用Docker做爲容器運行時。這一消息在雲原生領域激起了不小的水花,在Rancher技術社區裏許多小夥伴也對此進行了激烈的討論。
Kubernetes爲何選擇棄用Docker呢?咱們須要先簡單瞭解Dockershim。它是一個橋接服務,幫助Kubernetes與Docker進行通訊,Kubelet 以前使用 dockershim 實現對 Docker 的 CRI 支持(Docker自己目前還沒有實現CRI)。但時至今日,維護Dockershim已成爲運維/開發人員的沉重負擔。所以Kubernetes社區建議你們考慮使用包含 CRI 完整實現(兼容 v1alpha1 或 v1)的可用容器運行時。從而取消了對Docker做爲容器運行時的支持。github
不過你們沒必要過度擔憂,近期從Rancher社區裏面蒐集了一些你們比較關注的問題,下面一一爲你們解答:
一、Kubernetes Kubelet 棄用了Docker做爲容器運行時,有代替方案嗎?
在Kubernetes集羣中,容器運行時負責提取和運行容器鏡像。Docker只是被廣泛使用的容器運行時,在Docker被棄用以後,咱們還有兩個常見的選項:containerd 和 CRI-O。
Containerd 是一個工業級標準的容器運行時,它極爲簡單、健壯而且具有可移植性。Containerd 能夠在宿主機中管理完整的容器生命週期。這是一個100%開源的軟件,已於去年2月份從CNCF畢業。
去年年初,Rancher推出的輕量級Kubernetes發行版K3s已經使用containerd做爲默認容器運行時。
containerd:https://github.com/containerd/containerd/
CRI-O是由Red Hat推出的一款容器運行時,旨在提供一種在OCI一致的運行時和Kubelet之間的集成方式。在文章後半部分咱們將會進一步對比containerd和CRI-O的性能,爲您在選擇容器運行時的時候提供參考。
docker
CRI-O:https://github.com/cri-o/cri-o後端
二、我仍然能夠在Kubernetes 1.20中使用Docker嗎?
是的,若是使用Docker做爲運行時,在1.20中只會在Kubelet啓動時打印一個警告日誌。Kubernetes最先將在2021年底發佈1.23版本中將dockershim移除。
三、我現有的Docker鏡像仍然可使用嗎?運維
仍然可使用。Docker生成的鏡像實際上並非特定於Docker的鏡像,而是OCI(Open Container Initiative)鏡像。不管你使用什麼工具構建鏡像,任何符合OCI標準的鏡像在Kubernetes看來都是同樣的。containerd和CRI-O都可以提取這些鏡像並運行它們。因此您能夠仍然使用Docker來構建容器鏡像,而且能夠繼續在containerd和CRI-O上使用。
ide
四、我應該使用哪一個CRI實現?
工具
這是一個比較複雜的問題,它取決於許多因素。若是您以前熟練使用Docker,那麼遷移到containerd應該是一個相對容易的選擇,而且containerd具備更好的性能和更低的成本。固然,您也能夠探索CNCF領域中的其餘項目,來選擇更適合您的環境。
來源:https://kubernetes.io/blog/2020/12/02/dockershim-faq/#which-cri-implementation-should-i-use
性能
eBay對containerd和CRI-O進行了一組性能測試,包括建立、啓動、中止和刪除容器,以比較它們所耗的時間。如圖所示,containerd在各個方面都表現良好,除了啓動容器這項。從總用時來看,containerd的用時比cri-o要短。
測試
如下數據來自eBay的分享:
阿里雲
containerd和cri-o的性能比較
containerd和cri-o的綜合比較
Rancher,阿里雲,AWS, Google,IBM和Microsoft做爲初始成員,共同建設 containerd 社區。2017年3月,Docker 將 containerd 捐獻給CNCF(雲原生計算基金會)。containerd獲得了快速的發展和普遍的支持。Docker引擎已經將containerd做爲容器生命週期管理的基礎,Kubernetes也在2018年5月,正式支持containerd做爲容器運行時管理器。2019年2月,CNCF宣佈containerd畢業,成爲生產可用的項目,更加穩定。
五、Rancher 對 Containerd 的支持
Rancher 在輕量級Kubernetes發行版 K3s和 RKE2(2020年10月推出)中早已將 containerd 做爲默認的容器運行時。相信在 Rancher 2.x 支持 Kubernetes 1.20+ 以後會將這些寶貴經驗運用到新版本的Rancher 2.x 迭代中。
其實Kubernetes棄用Docker這一決定已經醞釀很長時間了,可能對於沒有密切關注這個方面的工程師來講有些措手不及。但其實無需特別擔憂:若是你是Kubernetes的終端用戶,這僅僅是一個後端容器運行時的更改,從使用方面來講幾乎感受不到區別;若是你是一名開發/運維人員,你依舊能夠繼續使用Docker來構建鏡像,以相同的方式將鏡像推送到Registry,而且將這些鏡像部署到你的Kubernetes中;若是你是運行和操做集羣的用戶,你只須要將Docker切換成你須要的容器運行時便可。