容器執行時是在某個節點上執行容器並且管理容器映象的軟體。如今,最廣為人知的容器執行時是Docker,但是,生態系統內也有一些別的容器執行時,比如rkt,containerd和Ixd。Docker是目前為止在Kubernetes生產環境裡使用最多的容器執行時,不過Docker的近親,containerd,可能將被證明是一種更好的方案。本文介紹在Kubernetes上使用containerd。
Kubernetes 1.5引入了一種內部外掛API,名為Container Runtime Interface(CRI),它提供簡單的訪問介面,去訪問不同的容器執行時。CRI讓Kubernetes可以使用多種容器執行時,而無需重新編譯。理論上,Kubernetes可以使用任意實現了CRI的容器執行時,來管理pod,容器和容器映象。
在過去的6個月裡,來自Google,Docker,IBM,ZTE和ZJU的工程師一起為containerd實現了CRI。該專案稱為cri-containerd[1],在2017年9月25號釋出了功能完備的v1.0.0-alpha.0版本[2]。使用cri-containerd,使用者可以使用containerd作為底層執行時來執行Kubernetes叢集,而無需安裝Docker。
Containerd是滿足OCI規範的核心容器執行時,從設計上就是為了嵌入大型系統的。它提供了要支援執行容器,並且在某個節點上管理映象所需功能的最小集合。它由Docker Inc公司啟動,並且在2017年3月份捐贈給了CNCF。Docker引擎本身是在containerd的早期版本上構建的,並將很快升級到最新版本。Containerd幾乎可以稱得上是功能完備且穩定的版本,目前可用的是1.0.0-beta.1。
Containerd的範圍比Docker小得多,它提供golang的客戶端API,更加關註於可嵌入化。更小的範圍意味著更小的程式碼基,更易於維護和支援,和Kubernetes的需求匹配見下表:
總的來說,從技術角度看,Containend是Kubernetes上很好的容器執行時的替代方案。
Cri-containerd[3]是:containerd的CRI的一種實現。它在Kubelet和containerd所在的相同節點上操作。在Kubernetes和containerd之間,cri-containerd處理來自Kubelet的所有CRI服務請求,並且使用containerd來管理容器和容器映象。Cri-containerd管理這些服務請求,部分是透過在containerd的服務請求上新增足夠的額外資訊來支援CRI的要求。
和當前的Docker的CRI實現(dockershim)相比,cri-containerd去掉了stack裡的額外hop,讓stack更為穩定和高效。
Cri-containerd使用containerd來管理完整的容器生命週期和所有容器映象。正如下圖所示,Cri-containerd透過CNI(另一個CNCF的專案)管理pod網路。
讓我們使用一個示例來說明當Kubelet建立一個但容器pod時,Cri-containerd是如何工作的:
-
Kubelet呼叫Cri-containerd,透過CRI執行時服務API,來建立pod;
-
Cri-containerd使用containerd建立並且啟動一個特定的pause容器(沙箱容器),並且將該容器放到pod的cgroup和名稱空間裡(簡化起見跳過這裡的詳細步驟);
-
Cri-containerd使用CNI配置pod的網路名稱空間;
-
Kubelet接下來透過CRI映象服務API呼叫Cri-containerd,來拉取應用程式容器映象;
-
如果該映象不在這個節點上,Cri-containerd就會使用containerd來拉取映象;
-
Kubelet隨後透過CRI執行時服務API來呼叫Cri-containerd,在pod內部,使用拉取下來的容器映象,建立並且啟動應用程式容器;
-
Cri-containerd最終呼叫containerd創建出應用程式容器,將其放入pod的cgroup和名稱空間裡,並且啟動pod的全新的應用程式容器。
這些步驟之後,一個pod及其對應的應用程式容器就被建立了出來,並執行著了。
Cri-containerd v1.0.0-alpha.0在2017年9月25號釋出。
所有CRI驗證測試都已經透過了。(CRI驗證是驗證某一CRI實現是否滿足Kubernetes所需的所有要求的測試框架)
所有常規的節點e2e測試也都透過了。(Kubernetes測試框架用來測試Kubernetes節點級別的功能的,比如管理pod,mount捲等等。)
要想瞭解v1.0.0-alpha.0版本的更多資訊,請檢視專案repository[2]。
多節點叢集安裝器,以及使用ansible和kubeadm搭建步驟,檢視repo連結[4]。
在Google Cloud上從頭建立一個叢集,請看Kubernetes the Hard Way[5]。
在本地VM上使用LinuxKit安裝,請看repo連結[7]。
計劃在2017年末釋出v1.0.0-beta.0版本。
Cri-containerd是Kubernetes的孵化專案,位於https://github.com/kubernetes-incubator/cri-containerd。歡迎貢獻任何想法,問題,或者解決方案。想要貢獻的人可以從開發者開始指南[8]開始。
-
https://github.com/kubernetes-incubator/cri-containerd
-
https://github.com/kubernetes-incubator/cri-containerd/releases/tag/v1.0.0-alpha.0
-
https://github.com/kubernetes-incubator/cri-containerd
-
https://github.com/kubernetes-incubator/cri-containerd/blob/master/contrib/ansible/README.md
-
https://github.com/kelseyhightower/kubernetes-the-hard-way
-
https://github.com/kubernetes-incubator/cri-containerd/blob/master/docs/installation.md
-
https://github.com/linuxkit/linuxkit/tree/master/projects/kubernetes
-
https://github.com/kubernetes-incubator/cri-containerd#getting-started-for-developers
原文連結:http://blog.kubernetes.io/2017/11/containerd-container-runtime-options-kubernetes.html
本次培訓內容包括:Docker容器的原理與基本操作;容器網路與儲存解析;Kubernetes的架構與設計理念詳解;Kubernetes的資源物件使用說明;Kubernetes 中的開放介面CRI、CNI、CSI解析;Kubernetes監控、網路、日誌管理;容器應用的開發流程詳解等,點選識別下方二維碼加微信好友瞭解具體培訓內容。
長按二維碼向我轉賬
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。