歡迎光臨
每天分享高質量文章

Containerd給Kubernetes帶來了更多容器執行時的可選方案

容器執行時是在某個節點上執行容器並且管理容器映象的軟體。如今,最廣為人知的容器執行時是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

Containerd是滿足OCI規範的核心容器執行時,從設計上就是為了嵌入大型系統的。它提供了要支援執行容器,並且在某個節點上管理映象所需功能的最小集合。它由Docker Inc公司啟動,並且在2017年3月份捐贈給了CNCF。Docker引擎本身是在containerd的早期版本上構建的,並將很快升級到最新版本。Containerd幾乎可以稱得上是功能完備且穩定的版本,目前可用的是1.0.0-beta.1。
Containerd的範圍比Docker小得多,它提供golang的客戶端API,更加關註於可嵌入化。更小的範圍意味著更小的程式碼基,更易於維護和支援,和Kubernetes的需求匹配見下表:

總的來說,從技術角度看,Containend是Kubernetes上很好的容器執行時的替代方案。


Cri-containerd

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是如何工作的:
  1. Kubelet呼叫Cri-containerd,透過CRI執行時服務API,來建立pod;

  2. Cri-containerd使用containerd建立並且啟動一個特定的pause容器(沙箱容器),並且將該容器放到pod的cgroup和名稱空間裡(簡化起見跳過這裡的詳細步驟);

  3. Cri-containerd使用CNI配置pod的網路名稱空間;

  4. Kubelet接下來透過CRI映象服務API呼叫Cri-containerd,來拉取應用程式容器映象;

  5. 如果該映象不在這個節點上,Cri-containerd就會使用containerd來拉取映象;

  6. Kubelet隨後透過CRI執行時服務API來呼叫Cri-containerd,在pod內部,使用拉取下來的容器映象,建立並且啟動應用程式容器;

  7. Cri-containerd最終呼叫containerd創建出應用程式容器,將其放入pod的cgroup和名稱空間裡,並且啟動pod的全新的應用程式容器。

這些步驟之後,一個pod及其對應的應用程式容器就被建立了出來,並執行著了。


狀態

Cri-containerd v1.0.0-alpha.0在2017年9月25號釋出。
它特性完備。支援所有Kubernetes特性。
所有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]。
自定義安裝,檢視repo連結[6]。
在本地VM上使用LinuxKit安裝,請看repo連結[7]。

下一步

接下來會關註於穩定性和可用性上的改進。
穩定性
  • 在多種OS發行版,比如Ubuntu,COS(容器最佳化OS)等上,在Kubernetes測試基礎架構上搭建完整的Kubernetes整合測試。

  • 積極解決所有測試失敗以及其他使用者彙報的問題。

可用性
  • 改進crictl的使用者體驗。Crictl是所有CRI容器執行時的便攜的命令列工具。這裡的標的是讓它更易於除錯和開發。

  • 將Cri-containerd和kuber-up.sh整合,幫助使用者使用Cri-containerd和containerd搭建滿足生產環境質量要求的Kubernetes叢集。

計劃在2017年末釋出v1.0.0-beta.0版本。


貢獻

Cri-containerd是Kubernetes的孵化專案,位於https://github.com/kubernetes-incubator/cri-containerd。歡迎貢獻任何想法,問題,或者解決方案。想要貢獻的人可以從開發者開始指南[8]開始。
相關連結:
  1. https://github.com/kubernetes-incubator/cri-containerd

  2. https://github.com/kubernetes-incubator/cri-containerd/releases/tag/v1.0.0-alpha.0

  3. https://github.com/kubernetes-incubator/cri-containerd

  4. https://github.com/kubernetes-incubator/cri-containerd/blob/master/contrib/ansible/README.md

  5. https://github.com/kelseyhightower/kubernetes-the-hard-way

  6. https://github.com/kubernetes-incubator/cri-containerd/blob/master/docs/installation.md

  7. https://github.com/linuxkit/linuxkit/tree/master/projects/kubernetes

  8. https://github.com/kubernetes-incubator/cri-containerd#getting-started-for-developers

原文連結:http://blog.kubernetes.io/2017/11/containerd-container-runtime-options-kubernetes.html

Kubernetes 實戰培訓

本次培訓內容包括:Docker容器的原理與基本操作;容器網路與儲存解析;Kubernetes的架構與設計理念詳解;Kubernetes的資源物件使用說明;Kubernetes 中的開放介面CRI、CNI、CSI解析;Kubernetes監控、網路、日誌管理;容器應用的開發流程詳解等,點選識別下方二維碼加微信好友瞭解具體培訓內容

3月23日開始上課,點選閱讀原文連結即可報名。
贊(0)

分享創造快樂