Kubernetes依賴于底層的容器運行時實現(xiàn)生命周期控制,例如Pull、創(chuàng)建、刪除等操作。運行時實現(xiàn)為實際的容器,從操作系統(tǒng)層面管理命名空間隔離和資源分配。早期,Docker和rkt是通過非公開的API緊密集成到Kubernetes源代碼中的。要添加其它的運行時需要修補源代碼,這是非常繁瑣的,并且穩(wěn)定性沒有保證。為改進這一問題,在Kubernetes 1.5中以公開發(fā)表測試特性的形式引入了CRI。CRI提供了將容器運行時插入Kubernetes系統(tǒng)的通用接口,使用戶可以運行kubernetes去編排并擴展他們的非Docker和非rkt架構(gòu)。運行時也可以是runv這樣的基于容器的Hypervisor。
開放容器聯(lián)盟(OCI,Open Container Initiative)是一個為標(biāo)準(zhǔn)化容器格式和運行時而組建的工業(yè)界聯(lián)盟,它發(fā)布了容器運行時標(biāo)準(zhǔn)“runtime-spec”。當(dāng)前該標(biāo)準(zhǔn)的實現(xiàn)包括runc、HyperHQ的runv 以及一種基于Intel Clear Containers的實現(xiàn)。CRI-O項目是由Project Atomic/RedHat所啟動的,還包括其它來自工業(yè)界的貢獻者。它使用OCI兼容的運行時實現(xiàn)Kubernetes CRI API,這意味著任何OCI兼容的運行時都可以通過Kubernetes的CRI API插入到Kubernetes中,而不必對每個運行時分別實現(xiàn)一個CRI適配器。
當(dāng)前,Kubernetes的CRI具有如下實現(xiàn):
CRI-O:符合OCI的運行時; rktlet:rkt容器運行時; Frakti:一種基于Hypervisor的容器運行時; Docker CRI shim:支持Docker直接充當(dāng)CRI適配器。圖片由http://blog.kubernetes.io/2016/12/container-runtime-interface-cri-in-kubernetes.html提供。
在Kubernetes部署中,Kubelet(在Kubernetes中稱為Minion)是在每臺主機上的本地代理,與容器運行時進行通信。使用CRI后,Kubelet可以通過gRPC(一種開源的RPC框架)與CRI墊片(Shim)通信,其前端調(diào)用實際的運行時。Pod是Kubernetes中的最小部署單元,其概念已經(jīng)擴展為一個具有類似語義的概念,稱為PodSandbox。對于基于Hypervisor的運行時,PodSandbox可理解成一個虛擬機。對于Docker等運行時,PodSandbox可理解為Linux命名空間。
查看英文原文:Alternative Container Runtimes in Kubernetes