docker、oci、runc以及kubernetes梳理


容器無疑是近年來雲計算中最火熱的關鍵詞。隨着docker的大熱,docker、oci、runc、containerd等等名詞也逐漸傳播開來。這么多的名詞,也容易讓人混淆。本文對相關名詞和其之間的聯系進行一下梳理和總結,方便大家更好地理解。

container

首先說的是container容器。隨着docker的大熱,docker的經典圖標,一條鯨魚拖着若干個集裝箱的經典形象已經深入人心。docker中container的翻譯是譯為容器還是集裝箱,中文社區做過一次小小的討論。討論參見http://dockone.io/question/408。在這次討論中,筆者的意見是container並不是docker出現了才有的,而在之前,linux container就已經翻譯為linux容器並被大家接受。而從含義來看,一開始選定把“容器”作為container的翻譯,也應該是准確的。而隨着docker出現,container的概念深入人心,而其與原來的linux container中的container,含義應該說是一致的。所以沿用容器的翻譯,筆者認為是比較合適的。

那么何為容器。容器本質上是受到資源限制,彼此間相互隔離的若干個linux進程的集合。這是有別於基於模擬的虛擬機的。對於容器和虛擬機的區別的理解,大家可以參考《京東基礎架構建設之路》中的闡釋,這里不再贅述。一般來說,容器技術主要指代用於資源限制的cgroup,用於隔離的namespace,以及基礎的linux kernel等。

OCI

Open Container Initiative,也就是常說的OCI,是由多家公司共同成立的項目,並由linux基金會進行管理,致力於container runtime的標准的制定和runc的開發等工作。

所謂container runtime,主要負責的是容器的生命周期的管理。oci的runtime spec標准中對於容器的狀態描述,以及對於容器的創建、刪除、查看等操作進行了定義。

runc,是對於OCI標准的一個參考實現,是一個可以用於創建和運行容器的CLI(command-line interface)工具。runc直接與容器所依賴的cgroup/linux kernel等進行交互,負責為容器配置cgroup/namespace等啟動容器所需的環境,創建啟動容器的相關進程。

為了兼容oci標准,docker也做了架構調整。將容器運行時相關的程序從docker daemon剝離出來,形成了containerd。Containerd向docker提供運行容器的API,二者通過grpc進行交互。containerd最后會通過runc來實際運行容器。

containerd

容器引擎

容器引擎,或者說容器平台,不僅包含對於容器的生命周期的管理,還包括了對於容器生態的管理,比如對於鏡像等。現在的docker、rkt以及阿里推出的pouch均可屬於此范疇。

docker,筆者認為可以分為兩個階段來理解。在筆者接觸docker之初,docker版本為1.2,當時的docker的主要作用是容器的生命周期管理和鏡像管理,當時的docker在功能上更趨近於現在的container runtime。而后來,隨着docker的發展,docker就不再局限於容器的管理,還囊括了存儲(volume)、網絡(net)等的管理,因此后來的docker更多的是一個容器及容器生態的管理平台。

kubernetes與容器

kubernetes在初期版本里,就對多個容器引擎做了兼容,因此可以使用docker、rkt對容器進行管理。以docker為例,kubelet中會啟動一個docker manager,通過直接調用docker的api進行容器的創建等操作。

在k8s 1.5版本之后,kubernetes推出了自己的運行時接口api--CRI(container runtime interface)。cri接口的推出,隔離了各個容器引擎之間的差異,而通過統一的接口與各個容器引擎之間進行互動。

與oci不同,cri與kubernetes的概念更加貼合,並緊密綁定。cri不僅定義了容器的生命周期的管理,還引入了k8s中pod的概念,並定義了管理pod的生命周期。在kubernetes中,pod是由一組進行了資源限制的,在隔離環境中的容器組成。而這個隔離環境,稱之為PodSandbox。在cri開始之初,主要是支持docker和rkt兩種。其中kubelet是通過cri接口,調用docker-shim,並進一步調用docker api實現的。

如上文所述,docker獨立出來了containerd。kubernetes也順應潮流,孵化了cri-containerd項目,用以將containerd接入到cri的標准中。

cri-containerd

為了進一步與oci進行兼容,kubernetes還孵化了cri-o,成為了架設在cri和oci之間的一座橋梁。通過這種方式,可以方便更多符合oci標准的容器運行時,接入kubernetes進行集成使用。可以預見到,通過cri-o,kubernetes在使用的兼容性和廣泛性上將會得到進一步加強。

kubelet

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM