kubelet创建容器的步骤
1、Kubelet 通過 CRI 接口(gRPC)調用 dockershim,請求創建一個容器。CRI 即容器運行時接口,目前 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就規避了這個問題;
5、我們知道創建容器需要進行設置 namespaces 和 cgroups,掛載 root filesystem等操作,而這些事該怎么做已經有了公開的規范了,那就是開放容器標準OCI,OCI的一個參考實現就是?runC。于是containerd-shim 需要調用 runC 這個命令行工具,來進行設置 namespaces 和 cgroups,掛載 root filesystem等操作進而啟動容器;
6、runC 啟動完容器后本身會直接退出,containerd-shim 則會成為容器進程的父進程,負責收集容器進程的狀態,上報給containerd,并在容器中pid為1的進程退出后對容器中的子進程進行清理,確保不會出現僵尸進程。
備注:shim墊片其實就是適配器Adapter,用于將各種容器運行時本身的接口適配到 Kubernetes 的 CRI 接口上。
?
總結
以上是生活随笔為你收集整理的kubelet创建容器的步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s创建pod的步骤
- 下一篇: 这才是JAVA中打印日志的正确姿势