kubelet創建容器的流程分析

kubelet發起創建命令到真正創建容器並啓動容器的過程

image.png


流程內容分析

  1. kubelet通過gRPC調用dockershim發起創建容器,CRI即容器運行時接口(container runtime interface),目前dockershim的代碼內嵌在kubele中,所以接受創建容器的就是kubelet進程。

  2. dockershim把創建容器的命令轉換成docker daemon可以識別的命令,之後發送給docker daemon創建容器。

  3. docker daemon在1.12版本之後就會把創建容器的命令分發給另一個進程: comtainerd。

  4. containerd收到創建容器的命令後,創建另一個進程:containerd-shim進程,由該進程執行具體的創建命令,containerd進程做。爲父進程存在。

  5. 創建容器的時候需要namespace隔離容器啓動和創建需要的資源,cgroup限制容器可以使用資源的大小等操作,這些事情該怎麼做已經有看公開的規範OCI(open container initivtive 開放容器標準),它的一個參考實現叫做runc。於是containerd--shim在這一步需要調用runc命令,來啓動容器。

  6. runc啓動容器之後就直接退出,containerd-shim則會成爲容器進程的父進程,收集容器進程的狀態,上報給contanierd,並在容器種pid爲1的進程退出後接管容器中國的子進程進行清理,確保不會出現殭屍進程。


這其中有兩個名詞概念容易混淆

CRI:容器運行時接口 container runtime interface

其主要的作用:

1、針對容器操作的接口,包括容器的創建、啓動和停止等

2、針對鏡像的操作,拉去、刪除鏡像等

3、針對podsandbox(容器沙箱環境)


OCI:開放容器標準 open container initiative

主要作用,製作容器

  1. 容器鏡像製作內容,即imagespec

  2. 容器需要接收哪些指令,即runtimespec


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章