Kubelet 创建一个容器时需要的步骤

Posted dqz_nihao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubelet 创建一个容器时需要的步骤相关的知识,希望对你有一定的参考价值。

Kubelet 创建一个容器时需要的步骤:

Kubelet 想要创建一个容器时,它需要以下几个步骤:

  1. Kubelet 通过 CRI(容器运行时接口,Container Runtime Interface) 接口(相当于gRPC)调用 dockershim,请求创建一个容器。 在这一步中 , Kubelet 可以视作一个简单的 CRI Client,而 dockershim 就是接收请求的 Server。目前 dockershim 的代码其实是内嵌在 Kubelet 中的,所以接收调用的就是 Kubelet 进程;
  2. dockershim 收到请求后,它会转化成 Docker Daemon 能听懂的请求,发到 Docker Daemon 上,并请求创建一个容器;
  3. Docker Daemon 早在 1.12 版本中就已经将针对容器的操作移到另一个守护进程 containerd 中了。因此 Docker Daemon 仍然不能帮人们创建容器,而是需要请求 containerd 创建一个容器;
  4. containerd 收到请求后,并不会自己直接去操作容器,而是创建一个叫做 containerd-shim 的进程,让 containerd-shim 去操作容器。 这是因为容器进程需要一个父进程来做诸如收集状态、维持 stdin 等 fd 打开工作。假如这个父进程就是 containerd,那每次 containerd 挂掉或升级后,整个宿主机上所有的容器都需要退出,但是引入了 containerd-shim 就规避了这个问题(containerd 和 shim 并不是父子进程关系);
  5. 创建容器是需要做一些设置 namespace 和 Cgroups、挂载 root filesystem 的操作。这些事已经有了公开的规范 OCI(Open Container Initiative,开放容器标准)。它的一个参考实现叫做 runc。containerd-shim 在这一步需要调用 runc 这个命令行工具,来启动容器;
  6. runc 启动完容器后,它会直接退出,containerd-shim 则会成为容器进程的父进程,负责收集容器进程的状态,上报给 containerd。并在容器中 pid 为 1 的进程退出后接管容器中的子进程,然后进行清理,确保不会出现僵尸进程。

最后说一下shim的作用:一个 shim 的职责就是作为 Adapter 将各种容器运行时本身的接口适配到 Kubernetes 的 CRI 接口上。

以上是关于Kubelet 创建一个容器时需要的步骤的主要内容,如果未能解决你的问题,请参考以下文章

Kubelet 创建一个容器时需要的步骤

kubelet工作原理

kubelet和CRI设计

k8s 网络三

#yyds干货盘点# Kubernetes 带你剖析容器运行时以及 CRI 原理(24)

基于portmap CNI插件来实现端口映射