深究Containerd源碼-6-RuntimeV2Task Create流程分析
代碼基于v1.7.0-beta.0-89-g344da9edb?
繼續(xù)接上一章深究Containerd源碼-5-TaskService Create流程分析分析,分析RuntimeV2Task?Create流程
首先看RuntimeV2 Task Plugin類圖,TaskManager是其主對(duì)象,實(shí)現(xiàn)了PlatformRuntime接口,主要關(guān)聯(lián)為ShimManager對(duì)象,ShimManager管理containerd所有創(chuàng)建的shim進(jìn)程,通過shims NSMap[T]對(duì)象記錄,binary通過Cmd創(chuàng)建shim進(jìn)程,shim對(duì)應(yīng)次進(jìn)程的管理數(shù)據(jù),最終封裝成shimTask返回給containerd.Client調(diào)用,shimTask實(shí)現(xiàn)TaskService RPC Client方法,可與shim進(jìn)程進(jìn)程交互。containerStore sandboxStore和Exchange是Metadata和Event Plugin的南向調(diào)用接口。

Plugin依賴關(guān)系如下示意

再看TaskManager .Create主流程,首先調(diào)用ShimManager.Start啟動(dòng)shim進(jìn)程,然后通過shimTask.Create RPC調(diào)用shim進(jìn)程進(jìn)程Create,完成容器的創(chuàng)建。

ShimManager.Start中NewBundle函數(shù)會(huì)在主機(jī)上創(chuàng)建$state/$ns/$id,kubelet CRI調(diào)用時(shí)目錄為/var/run/containerd/io.containerd.runtime.v2.task/k8s.io/,ns 默認(rèn)是k8s.io,并非Linux的namespace,id為容器ID,例如
構(gòu)建work目標(biāo)指向 $root/$ns/$id,跟進(jìn)容器的spec生成config.json,完成NewBundle調(diào)用。
接著ShimManager根據(jù)是否Sandbox分成兩個(gè)邏輯,先看Sandbox情況,關(guān)鍵調(diào)用ShimManager.startShim生成shim進(jìn)程。
首先調(diào)用resovleRuntimePath根據(jù)runtime名稱,找到shim的binary
例如runc的shim為containerd-shim-runc-v2。后續(xù)containerd-shim-runc-v2下章繼續(xù)分析。
開源的東西,不需要說明出處,就說你自己寫的