4

我用 minikube 设置了 2 个 k8s 环境。一个带--container-runtime=docker国旗,一个带--container-runtime=containerd国旗。这是我看到的差异。

当我设置container-runtime=docker时,这些事情就会发生

  1. 有一个dockerd服务正在运行
  2. dockerd服务containerd作为自己的孩子产生
  3. /usr/bin/containerd-shim-runc-v2运行实际容器的进程,每个进程的父进程都是containerd-shim-runc-v2系统上的 PID 1。

当我设置container-runtime=containerd时,这些事情就会发生

  1. 没有dockerd服务,没有歧义。
  2. 有一个containerd进程,它由 PID 1 拥有。同样,这并不奇怪
  3. containerd-shim运行实际容器的进程,每个进程的父containerd-shim进程是containerd

所以这是我的问题

  1. containerd-shim和 和有什么区别containerd-shim-runc-v2?他们似乎大多采用相似的标志等。
  2. 为什么在场景 1 中,垫片是 PID 1 的子代,而在场景 2 中,垫片是 containerd 的子代

编辑:只是想到了一个编辑。在 ubuntu 20 机器上,如果我安装 docker,dockerd 是一个独立进程,其父进程为 PID 1,containerd 是一个独立进程,其父进程为 PID 1,所有容器都是 PID 为 1 的 container-shim-runc-v2 的子进程?!?!为什么containerd不是孩子dockerd呢?这是在哪里配置的?

4

1 回答 1

7

我已经深入研究了这个话题,并得出了以下结论和来源。

1. containerd-shim 和 containerd-shim-runc-v2 有什么区别?他们似乎大多采用相似的标志等。

这些只是不同containerd-shim-runc-v2的版本,是containerd-shim. 请参阅此处的源代码。

看起来那个 docker 仍然使用containerd-shim而不是containerd-shim-runc-v2. 基本功能仍然是 shim 的相同功能,即 shim 监视 runc 容器以告诉 containerd runc 何时完成运行时间。

如果您担心 API 的差异,请参考源代码。但在功能上,它们只是 shim API 的不同版本。


2. 为什么在场景 1 中 shims 是 PID 1 的子代,而场景 2 中,shims 是 containerd 的子代?

最终,它们都是 PID 1 的子代,其中垫片是 containerd 的子代,而 containerd 是 PID 1 的子代。

这篇博文很好地概述了 k8s 和工作节点上的运行时。特别是,关于 Docker、containerd 和 shims 的部分将为您的问题提供更多视角。

The shim sits between the container manager and a runtime to facilitate communication and prevent integration problems that may arise. It allows for daemon-less containers. It basically sits as the parent of the container’s processes to facilitate communications, and eliminates the long running runtime processes for containers. The processes of the shim and the container are bound tightly; however, they are totally separated from the process of the container manager.

Here is a more thorough resource into containerd, shims, and how they interact with linux.

And this resource dives into runc, containerd and their PIDs in linux.

于 2021-05-25T09:21:51.173 回答