Kubernetes棄用Docker後怎麼辦?

本文轉自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://github.com/containerd/containerd/

CRI-O是由Red Hat推出的一款容器運行時,旨在提供一種在OCI一致的運行時和Kubelet之間的集成方式。在文章後半部分我們將會進一步對比containerd和CRI-O的性能,為您在選擇容器運行時的時候提供參考。

CRI-O://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領域中的其他項目,來選擇更適合您的環境。

來源://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切換成你需要的容器運行時即可。