containerd 与 runC 相比如何

How containerd compares to runC

这两个比较如何?据我了解,运行C 是容器的 运行time 环境。这意味着该组件为 运行 容器提供了必要的环境。那么containerd在这里的作用是什么?如果它完成其余的工作(网络、卷管理等),那么 Docker 引擎的作用是什么?那么 containerd-shim 呢?基本上,我试图了解每个组件的作用。

我将给出一个高层次的概述来帮助您入门:

  • containerd 是一个容器 运行time,它可以管理一个完整的容器生命周期——从镜像 transfer/storage 到容器执行、监督和联网。
  • container-shim 处理无头容器,这意味着一旦 运行c 初始化容器,它就会退出,将容器移交给充当中间人的 container-shim。
  • runc是轻量级通用运行时间容器,遵守OCI规范。根据 OCI 规范,运行c 被 containerd 用于生成和 运行ning 容器。也是对libcontainer的重新打包。
  • grpc用于containerd和docker-engine之间的通信。
  • OCI 维护 运行 时间和图像的 OCI 规范。当前 docker 版本支持 OCI 图像和 运行 时间规范。

更多链接:

runccontainerd 的组件之一,处理 运行 容器的内核级交互。在早期版本中,containerd 本质上是围绕 runc 的高级抽象,但现在远不止于此。来自 container.io:

runc is a component of containerd, the executor for containers. containerd has a wider scope than just executing containers: downloading container images, managing storage and network interfaces, calling runc with the right parameters to run containers.

来自同一来源的

This image 很好地描述了这一点。

Docker 引擎是使用 containerd 作为主要组件并实现不属于 containerd 范围的其他功能的最终用户产品。

注意Docker将containerd抽取出来作为一个单独的组件,所以它也可以被其他产品使用和开发。

[编辑] 我写了更多关于这个术语的文章 here

Docker 引擎就是全部,它是一个使用户能够使用 运行 容器的整体。然后它被分解成单独的组件。它被分解为: - docker 引擎 - 集装箱 - 运行c

运行C是实现OCI接口的最低层组件。它与内核交互并执行 "runs" 容器

containerd 负责设置网络、映像 transfer/storage 等 - 它负责整个容器 运行 时间(这意味着,它管理 运行 并让 运行 的生活变得轻松 运行C,即实际集装箱运行时间)。与 Docker 守护程序不同,它具有精简的功能集;例如不支持图片下载。

Docker 引擎本身只是做一些高级的事情,比如接受用户命令,从 docker 注册表下载图像等。它将很多它卸载到 containerd。

"the Docker daemon prepares the image as an Open Container Image (OCI) bundle and makes an API call to containerd to start the OCI bundle. containerd then starts the container using runC."

注意,运行times 必须符合 OCI,(就像 运行C 一样),也就是说,他们必须向像 containerd 这样的管理器公开一个固定的 API 所以他们(containerd)可以让他们的生活更轻松(运行C)(并要求他们 stop/start 容器)

rkt是另一个容器运行time,目前还不支持OCI,但是支持appc规范。但它是一个成熟的解决方案,它管理并使自己的生活变得轻松,所以它不需要像爸爸那样的容器。

所以,就是这样。现在让我们添加另一个组件(和另一个接口)- Kubernetes

Kubernetes 可以 运行 任何满足 CRI - 容器 运行 时间接口的东西。

可以运行使用k8s进行rkt,因为rkt满足CRI-容器运行时间接口。 Kubernetes 不要求任何其他东西,它只需要 CRI,它不会给出关于你如何 运行 你的容器,OCI 与否的 FF。

containerd 不支持 CRI,但 cri-containerd 是一个围绕 containerd 的垫片。所以,如果你想 运行 与 Kubernetes 一起使用 containerd,你必须使用 cri-containerd(这也是 Kubernetes 的默认 运行time)。 cri-containerd 最近更名为 CRI 插件。

如果您也想加入 docker 引擎,可以这样做。使用 dockershim,它将 CRI shim 添加到 docker 引擎。

现在,就像 containerd 可以管理和简化 运行C(容器 运行 时间)一样,它可以管理和简化其他容器 运行 次好吧 - 事实上,对于支持 OCI 的每个容器 运行time - 就像 Kata 容器 运行time (称为 ~kata-运行time~ - https://github.com/kata-containers/runtime.) - 这运行s kata 容器,Clear Container 运行time(英特尔)。

现在我们知道 rkt 满足 CRI,cri-containerd(又名 CRI 插件)也满足。

注意 containerd 在这里做什么。它不是 运行 时间,它是 运行C 的管理器,它是容器 运行 时间。它只是管理图像下载、存储等。哎呀,它甚至不满足 CRI。

这就是我们拥有 CRI-O 的原因。它就像 containerd,但它实现了 CRI。 CRI-O 需要容器 运行 时间来 运行 图像。它将管理 运行 时间并让生活变得轻松,但它需要 运行 时间。它将花费任何符合 OCI 的 运行 时间。所以,很自然地,~kata-运行time~ 是 CRI-O 兼容的,运行C 是 CRI-O 兼容的。

与Kubernetes一起使用很简单,将Kubernetes指向CRI-O作为容器运行时间。 (是的,是的,CRI-O,但是 CRI-O 和实际的容器 运行time 是。Kubernetes 在说容器 运行time 时指的是那对幸福的夫妻)。

就像 containerd docker 使其真正可用,并管理和简化 containerd 的生活一样,CRI-O 需要有人来管理图像 - 它有 buildah、umochi 等

c运行 是另一个 运行time,它符合 OCI 并用 C 语言编写。它由 RedHat 开发。

我们已经讨论过,kata-运行time 是另一个符合 OCI 的 运行time。因此,我们可以像我们讨论的那样将 kata-运行time 与 CRI-O 一起使用。

请注意,这里 kubelet 正在通过 CRI 与 CRI-O 通信。 CRI-O 正在与 cc-运行time 通信(这是英特尔透明容器的另一个 运行time,是的,符合 OCI 标准),但也可能是 kata-运行time。

不要忘记 containerd,它可以管理所有 OCI 投诉并让生活变得轻松 运行times - 运行C 当然,还有 kata-运行time,cc -运行时间

这里,注意只是 运行 时间从 运行C 移动到 kata-运行 时间。 为此,在 containerd 配置中,只需将 运行time 更改为 "kata"

不用说,它可以通过 CRI-O 或 cri-containerd(又名 CRI 插件)在 Kubernetes 上 运行。

这真的很酷:top:

Kubernetes,这里由它的大使 Kubelet 先生代表 运行 任何满足 CRI 的东西。 现在,我们有几个候选人可以。 - Cri-containerd 让 containerd 做到这一点。 - CRI-O 本地执行。 - Dockershim 让 docker 引擎做到这一点。

现在,上面的所有 3 个人都可以管理并让所有 OCI 兼容 运行times 的生活变得轻松 - 运行C,kata-运行time,cc-运行次.

我们还有 frakti,它像 rkt 一样满足 CRI,但不满足 OCI,并且捆绑了它自己的容器 运行time。

在这里,我们有 CRI-O 在管理和简化符合 OCI 的 kata-运行time 和 运行C both

我们还有更多运行次:

  • railcar - 符合 OCI,用 rust 编写
  • Pouch - 阿里巴巴改造运行C
  • nvidia 运行time - nvidia 的 运行C
  • 分支

参考:https://github.com/darshanime/notes/blob/master/kubernetes.org#notes