本文轉自Rancher Labs
近期,Kubernetes在其最新的Changelog中宣佈,自Kubernetes 1.20之後將棄用Docker作為容器執行時。這一訊息在雲原生領域激起了不小的水花,在Rancher技術社群裡許多小夥伴也對此進行了激烈的討論。
Kubernetes為什麼選擇棄用Docker呢?我們需要先簡單瞭解Dockershim。它是一個橋接服務,幫助Kubernetes與Docker進行通訊,Kubelet 之前使用 dockershim 實現對 Docker 的 CRI 支援(Docker本身目前尚未實現CRI)。但時至今日,維護Dockershim已成為運維/開發人員的沉重負擔。因此Kubernetes社群建議大家考慮使用包含 CRI 完整實現(相容 v1alpha1 或 v1)的可用容器執行時。從而取消了對Docker作為容器執行時的支援。
不過大家不必過分擔心,近期從Rancher社群裡面蒐集了一些大家比較關注的問題,下面一一為大家解答:
1、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的效能,為您在選擇容器執行時的時候提供參考。
CRI-O:https://github.com/cri-o/cri-o
2、我仍然可以在Kubernetes 1.20中使用Docker嗎?
是的,如果使用Docker作為執行時,在1.20中只會在Kubelet啟動時列印一個警告日誌。Kubernetes最早將在2021年末釋出1.23版本中將dockershim移除。
3、我現有的Docker映象仍然可以使用嗎?
仍然可以使用。Docker生成的映象實際上並不是特定於Docker的映象,而是OCI(Open Container Initiative)映象。無論你使用什麼工具構建映象,任何符合OCI標準的映象在Kubernetes看來都是一樣的。containerd和CRI-O都能夠提取這些映象並執行它們。所以您可以仍然使用Docker來構建容器映象,並且可以繼續在containerd和CRI-O上使用。
4、我應該使用哪個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畢業,成為生產可用的專案,更加穩定。
5、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切換成你需要的容器執行時即可。