Docker?Rkt?Lxd?細說K8S容器進行時的又一選項Containerd
器運行時是執行容器並在節點上管理容器鏡像的軟體,目前,最廣為人知的容器運行時是Docker,但在生態系統中還有其他容器運行時軟體,比如Rkt、Containerd和Lxd。Docker是現在於Kubernetes環境中使用的最常見的容器運行時,今天數人云給大家推薦一個Docker的組件——Containerd,它可能是更好的選擇。
本文是由谷歌的軟體工程師Lantao Liu和IBM的開源開發者Mike Brown基於自身相關實踐,共同編寫。
Kubernetes 1.5引入了一個名為容器運行時介面(CRI)的內部插件API,以方便地訪問不同的容器運行時,CRI允許Kubernetes使用各種容器運行時,而不需要重新編譯。從理論上說,Kubernetes可以使用任何實現CRI的容器運行時管理容器和容器鏡像。
在過去的6個月中,來自Google、Docker、IBM、中興和ZJU的工程師們一直在努力為CRI For Containerd,這個項目被稱為cri-containerd,用戶可以使用容器作為底層運行時運行Kubernetes集群,並且無需安裝Docker。
Containerd
Containerd是一個兼容OCI的核心容器運行時,它被設計為嵌入到更大的系統當中,提供了在一個節點上執行容器和管理鏡像的最小功能集,它是由Docker公司發起,並於2017年3月加入了CNCF,Docker引擎本身是建立在早期版本的容器之上,並且很快將更新到最新版本。
與Docker相比,Containerd的規模要小得多,提供了Golang客戶端API,而且更專註於可嵌入,較小範圍會導致一個更小的代碼庫,隨著時間的推移,其更容器維護以及匹配Kubernetes的需求,如下圖所示:
綜上所述,從技術的角度來看,Containerd是Kubernetes的容器進行時比較好的選擇。
Cri-Containerd
Cri-Containerd是對於容器的一個實現,它在與Kubelet和 Containerd相同的節點上運行,在Kuberntes和Containerd之間的分層中,Cri-Containerd處理來自Kubelet的所有國際服務請求,並使用Containerd管理容器和容器鏡像,Cri-Containerd管理這些服務請求,在一定程度上是通過形成Containerd服務請求,同時添加足夠的附加功能來去支持CRI需求。
與當前的Docker CRI實現(Dockershim)相比,Cri-Containerd消除了棧中的額外跳轉,使堆棧更加穩定和高效。
體系結構
可以通過下面這個例子來演示當Kubele創建一個單一容器的時候,如何使用Cri-Containerd。
- Kubelet通過國際運行時服務API調用了Cri-Containerd,用以創建一個Pod;
- Cri-Containerd使用Containerd創建和啟動一個特殊的暫停容器(沙箱容器),並將該容器放在Pod的Cgroups和名稱空間中;
- Containerd使用CNI配置了Pod的網路名稱空間;
- Kubelet隨後通過國際服務API調用了「容器」,以拉出應用程序的容器的鏡像;
- 如果鏡像不存在於節點,則Cri-Containerd將進一步使用Containerd來拉出鏡像;
- 然後,Kubelet通過「CRI」服務API調了「Cri-Containerd」通過拉取容器的鏡像來創建和啟動應用程序容器;
- Cri-Containerd最終調用Containerd來創建應用程序容器,將其放入Pod的Cgroups和命名空間中,然後啟動該容器的新應用程序容器。
在這些步驟之後,將創建並運行一個Pod及其相應的應用程序容器。
現階段狀態
Cri-Containerd V1.0.0-alpha.0是在2017年9月25日發布的。
其功能完備,所有的Kubernetes的特性都得到了支持。
所有的CRI validation test(CRI validation test是一種測試框架,用於驗證是否符合Kubernetes的所有要求。地址:https://github.com/kubernetes/community/blob/master/contributors/devel/cri-validation.md)
所有的 Node e2e Test都已通過(用於測試Kubernetes節點級功能的測試框架如Managing Pods、Mounting Volumes等,地址:https://github.com/kubernetes/community/blob/master/contributors/devel/e2e-node-tests.md)。
若想了解更多關於V1.0-Alpha的相關內容,請前往:https://github.com/kubernetes-incubator/cri-containerd/releases/tag/v1.0.0-alpha.0
延伸閱讀
對於一個多節點集群安裝程序,並使用能應用和Kubeadm啟動步驟請參見:https://github.com/kubernetes-incubator/cri-containerd/blob/master/contrib/ansible/README.md
若想在Google雲端從頭創建一個集群,請參見:https://github.com/kelseyhightower/kubernetes-the-hard-way
對於一個自發布Tarball的自定義安裝,請參見:https://github.com/kubernetes-incubator/cri-containerd/blob/master/docs/installation.md
對於在本地VM上安裝LinuxKit,請參見:https://github.com/linuxkit/linuxkit/tree/master/projects/kubernetes
下一階段
Containerd承諾,在下一階段將主要改進穩定性和可用性方面的問題:
穩定性:
在Kubernetes的測試基礎設施上建立一套完整的Kubernetes集成測試,包括Ubuntu、COS(容器化的OS 地址:https://cloud.google.com/container-optimized-os/docs/)等等。
積極解決用戶報告的任何測試失敗和其他問題。
可用性:
提高Crictl(https://github.com/kubernetes-incubator/cri-tools/blob/master/docs/crictl.md)的用戶體驗,Crictl是所有的CRI容器運行時的可移植命令行工具,這裡的目標是使其易於用於調試和開發場景。
集成Kube-up.sh(https://kubernetes.io/docs/getting-started-guides/gce/)幫助用戶使用Cri-Containerd來提高Kubernetes集群的生產質量。
改進文檔。
預計在2017年底發布V1.0-Beta。
提供建議
Cri-Containerd是一個Kubernetes的孵化器項目,地址:ttps://http://github.com/kubernetes-incubator/cri-containerd。歡迎提供任何具有建設性的意見和建議,具體的使用入門指南請參見:https://github.com/kubernetes-incubator/cri-containerd#getting-started-for-developers
社區
Cri-Containerd是由Kubernetes Signode社區開發和維護的,如有相關的建議,可以加入社區:
Sig-Node社區網站:https://github.com/kubernetes/community/tree/master/sig-node
Slack:Kubernetes(kubernet.slack.com)的sig-節點通道:https://kubernetes.slack.com/
原文作者:Kubernetes 原文鏈接:http://blog.kubernetes.io/2017/11/containerd-container-runtime-options-kubernetes.html?utm_source=tuicool&utm_medium=referral
推薦閱讀:
※容器編排之Kubernetes安裝與配置
※基於 Docker for MAC 的 Kubernetes 本地環境搭建與應用部署
※PPT收藏|KubeCon北美峰會幹貨直播培訓課
※[資料分享]kubernetes實踐指南
※Kubernetes v1.7新特性解析-CustomResourceDefinition
TAG:Docker | Kubernetes |