K8S 中的 CRI、OCI、CRI shim、containerd

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

引言
本文作者分享了学习 Kubernetes (K8S) 的心得,主要围绕容器运行时的相关概念,包括 CRI、OCI、CRI shim、containerd 等,并解释了它们的作用及相互关系。
前半部分:容器运行时接口 (CRI)
在 K8S 中,容器的创建由 kubelet 控制,其通过 CRI(容器运行时接口)与容器运行时进行交互,而非直接调用 Docker API。CRI 的设计源于对多种容器运行时兼容性的需求,避免 kubelet 针对不同容器运行时做过多适配。CRI 分为两部分:RuntimeService(负责容器操作)和 ImageService(负责镜像管理)。
适配器层:CRI shim
由于不同容器运行时需要适配 CRI 接口,CRI shim 起到了“翻译”的作用。它将 kubelet 的 CRI 请求转化为具体容器运行时能够识别的操作。例如,dockershim 是 Docker 的 CRI shim,负责将 CRI 请求转化为 Docker API 调用。
后半部分:容器创建流程
在 Docker 中,容器的创建由 containerd 完成,而 containerd 进一步调用 containerd-shim 来处理容器相关任务。containerd-shim 通过调用符合 OCI 标准的 runc 来启动容器,并负责维护容器的状态,避免因父进程挂掉导致容器退出。OCI 标准定义了容器镜像结构及操作指令,是容器技术的核心规范。
K8S 与 containerd 的关系
从 K8S 1.20 版本开始,K8S 宣布弃用 Docker,推荐使用 containerd 作为容器运行时。使用 containerd 提升了系统的简洁性,同时也避免了对 Docker 上层功能的依赖。此外,K8S 社区还开发了专门用于 K8S 的容器运行时 CRI-O,它直接兼容 CRI 和 OCI 标准。
总结
本文通过分析 K8S 容器创建的流程,详细阐述了 CRI、CRI shim、OCI 和 containerd 的角色及其相互关系。这些组件的设计不仅提高了容器运行时的灵活性,也推动了容器技术的标准化和生态发展。
想要了解更多内容?



白皮书上线