containerd在架构上被设计为主要是协调bundles的创建和执行。bundles是指被Runtime使用的配置、元数据、rootfs数据。一个bundle就是一个运行时的容器在磁盘上的表现形式,简化为文件系统中的一个目录。
下图是containerd创建bundle的数据流图:
- 指示Distribution Controller去拉取一个具体的镜像,Distribution将镜像分层内容存储到内容存储中(content store),将镜像名和root manifest pointers注册到元数据存储中(metadata store)。
- 一旦镜像拉取完成,用户可以指示Bundle Controller将镜像分解包到一个bundle中。从内容存储中消费后,图像中的层被解压缩到快照组件中。
- 当容器的rootfs的快照准备好时,Bundle Controller控制器可以使用image manifest和配置来准备执行配置。其中一部分是将挂载从snapshot模块输入到执行配置中。
- 然后将准备好的bundle给Runtime子系统以执行, Runtime子系统将读取bundle配置来创建一个运行的容器。
以上对应containerd的数据根目录下的各个子目录:
ll /var/lib/containerd/
io.containerd.content.v1.content
io.containerd.grpc.v1.introspection
io.containerd.metadata.v1.bolt
io.containerd.runtime.v1.linux
io.containerd.runtime.v2.task
io.containerd.snapshotter.v1.btrfs
io.containerd.snapshotter.v1.native
io.containerd.snapshotter.v1.overlayfs
tmpmounts
content中保存是OCI标准tar和mainfest配置文件的,即保存的是镜像,解压后,可以mount给容器使用。 snapshotter的主要作用是通过mount各个层,为容器准备rootfs。