Kubelet 创建一个容器时需要的步骤
Posted dqz_nihao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubelet 创建一个容器时需要的步骤相关的知识,希望对你有一定的参考价值。
Kubelet 创建一个容器时需要的步骤:
Kubelet 想要创建一个容器时,它需要以下几个步骤:
- Kubelet 通过 CRI(容器运行时接口,Container Runtime Interface) 接口(相当于gRPC)调用 dockershim,请求创建一个容器。 在这一步中 , Kubelet 可以视作一个简单的 CRI Client,而 dockershim 就是接收请求的 Server。目前 dockershim 的代码其实是内嵌在 Kubelet 中的,所以接收调用的就是 Kubelet 进程;
- dockershim 收到请求后,它会转化成 Docker Daemon 能听懂的请求,发到 Docker Daemon 上,并请求创建一个容器;
- Docker Daemon 早在 1.12 版本中就已经将针对容器的操作移到另一个守护进程 containerd 中了。因此 Docker Daemon 仍然不能帮人们创建容器,而是需要请求 containerd 创建一个容器;
- containerd 收到请求后,并不会自己直接去操作容器,而是创建一个叫做 containerd-shim 的进程,让 containerd-shim 去操作容器。 这是因为容器进程需要一个父进程来做诸如收集状态、维持 stdin 等 fd 打开工作。假如这个父进程就是 containerd,那每次 containerd 挂掉或升级后,整个宿主机上所有的容器都需要退出,但是引入了 containerd-shim 就规避了这个问题(containerd 和 shim 并不是父子进程关系);
- 创建容器是需要做一些设置 namespace 和 Cgroups、挂载 root filesystem 的操作。这些事已经有了公开的规范 OCI(Open Container Initiative,开放容器标准)。它的一个参考实现叫做 runc。containerd-shim 在这一步需要调用 runc 这个命令行工具,来启动容器;
- runc 启动完容器后,它会直接退出,containerd-shim 则会成为容器进程的父进程,负责收集容器进程的状态,上报给 containerd。并在容器中 pid 为 1 的进程退出后接管容器中的子进程,然后进行清理,确保不会出现僵尸进程。
最后说一下shim的作用:一个 shim 的职责就是作为 Adapter 将各种容器运行时本身的接口适配到 Kubernetes 的 CRI 接口上。
以上是关于Kubelet 创建一个容器时需要的步骤的主要内容,如果未能解决你的问题,请参考以下文章