什么是Kubernetes容器运行时CRI

描述

一、CRI标准

起初,Docker是事实上的容器技术标准,Kubernetes v1.5之前的代码中直接调用Docker API,实现容器运行时的相关操作。

后来,为了标准化下层容器运行时的差异(docker\\rkt\\kata containers),2016年,Kubernetes提出了CRI(Container Runtime Interface,容器运行时接口)标准,制定了Kubernetes kubelet与容器运行时的交互接口。容器运行时如果想要集成到Kubernetes平台,就需要实现这套接口。如图所示,CRI shim负责实现CRI接口,并将CRI请求转换为容器运行时的请求。

容器

CRI接口包括RuntimeService和ImageService两个服务,前者提供管理Pod和容器生命周期的gRPC接口,后者提供提取、检查和删除镜像的gRPC接口。

service RuntimeService {
//容器操作rpc
 CreateContainer (...) returns (...) {}
 rpc ListContainers  (...) returns (...) {}
 rpc RemoveContainer (...) returns (...) {}
 rpc StartContainer  (...) returns (...) {}
 rpc StopContainer (...) returns (...) {}
 //Pod沙箱操作,可能对应多个容器
 rpc ListPodSandbox (...) returns (...) {}
 rpc RemovePodSandbox(...) returns (...) {}
 rpc RunPodSandbox (...) returns (...) {}
 rpc StopPodSandbox (...) returns (...) {}
 }

二、CRI实现方案

1. Dockershim

标准提出之后,Docker并未实现CRI接口(如日中天,不合作),Kubernetes将CRI接口转换为Docker API,以支持Docker容器。这部分适配工作由shim(垫片)来完成,称为dockershim,并内置在kubelet模块中(kubernetes原生支持)。

此时的调用关系为:

Kubelet-->dockershim-->dockerd(daemon)-->containerd-->containerd-shim-->runc。

不难看出,这个调用链很长,可以直接调用containerd来实现相关功能。

2020年,Kubernetes计划移除dockershim。

2022年,Kubernetes v1.24版本,将dockershim移除(不再提供原生支持)。

需要注意到dockershim也调用了CNI接口。

容器

更为具体的CNI接口调用为:

容器

2. CRI-containerd/containerd

containerd提供了容器的生命周期管理、镜像管理等功能。在Docker 1.11中引入,containerd会为每个容器创建一个containerd-shim,以用来管理相应容器的生命周期。2016年12月,Docker公司将其拆分为独立组件,并于2017年3月捐赠给CNCF。

容器

由dockershim部分可知,kubernetes CRI接口调用过长,可采用直接调用containerd的方式。

容器

kubernetes分两个版本进行了实现:containerd1.0版本中,通过CRI-containerd进行CRI的适配。

容器

containerd 1.1版本直接将把适配逻辑写到了containerd进程中,完成CRI Services到Meta services、Runtime service、Storage service的适配。

容器

这里的containerd提供了CRI shim的能力:将CRI请求转换成3个服务的调用,创建出runc容器。

3. CRI-O

CRI-O也就是Container Runtime Interface和Open Container Initiative的组合,源于Kubernetes孵化器项目Open Container Initiative Daemon(OCID)。

作为Kubernetes CRI的一种实现方案,本质上是封装了OCI接口,对外提供CRI 服务。功能包括容器运行时的管理和镜像的管理。

三、小结

容器

四、参考资料

https://github.com/containerd/containerd/blob/main/docs/getting-started.mdhttps://github.com/containerd/containerd/blob/main/docs/historical/cri/proposal.mdhttps://cri-o.io/https://github.com/cri-o/cri-ohttps://developer.aliyun.com/article/1010319https://mp.weixin.qq.com/s/--t74RuFGMmTGl2IT-TFrghttps://iximiuz.com/en/posts/journey-from-containerization-to-orchestration-and-beyon
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分