深究Containerd源码-6-RuntimeV2Task Create流程分析
代码基于v1.7.0-beta.0-89-g344da9edb
继续接上一章深究Containerd源码-5-TaskService Create流程分析分析,分析RuntimeV2Task Create流程
首先看RuntimeV2 Task Plugin类图,TaskManager是其主对象,实现了PlatformRuntime接口,主要关联为ShimManager对象,ShimManager管理containerd所有创建的shim进程,通过shims NSMap[T]对象记录,binary通过Cmd创建shim进程,shim对应次进程的管理数据,最终封装成shimTask返回给containerd.Client调用,shimTask实现TaskService RPC Client方法,可与shim进程进程交互。containerStore sandboxStore和Exchange是Metadata和Event Plugin的南向调用接口。

Plugin依赖关系如下示意

再看TaskManager .Create主流程,首先调用ShimManager.Start启动shim进程,然后通过shimTask.Create RPC调用shim进程进程Create,完成容器的创建。

ShimManager.Start中NewBundle函数会在主机上创建$state/$ns/$id,kubelet CRI调用时目录为/var/run/containerd/io.containerd.runtime.v2.task/k8s.io/,ns 默认是k8s.io,并非Linux的namespace,id为容器ID,例如
构建work目标指向 $root/$ns/$id,跟进容器的spec生成config.json,完成NewBundle调用。
接着ShimManager根据是否Sandbox分成两个逻辑,先看Sandbox情况,关键调用ShimManager.startShim生成shim进程。
首先调用resovleRuntimePath根据runtime名称,找到shim的binary
例如runc的shim为containerd-shim-runc-v2。后续containerd-shim-runc-v2下章继续分析。
开源的东西,不需要说明出处,就说你自己写的