番外篇,简单讲讲容器镜像的存储驱动,为简单演示,以 overlay 存储驱动为例。

可以通过 Linux kennel 查看 Overlay Filesystem 的相关明细介绍,以下内容主要以演示为主,加深理解,且此内容的理解是对后续 ContainerdSnapshotter Service`` 和 DiffApplier Service` 必备的基础。

模拟
[1-1] 模拟已经存在一个 layer 包含单一文件 file_asnapshot

1
2
mkdir -p /tmp/a/1/fs
touch /tmp/a/1/fs/file_a

[1-2] 如若这个时候接收到再创建 layer 的请求,具体内容如下:

1
2
mkdir -p /tmp/a/2/fs
mkdir -p /tmp/a/2/workdir

[1-3] 此时存储驱动 overlay 将进行如下处理,且将最终序列化好的 mount 进行返回,表意如下:

1
2
3
4
5
6
Type: Overlay
Source: Overlay
Options:
lowerdir=/tmp/a/1/fs <-- list of all parents
uperdir=/tmp/a/2/fs <-- fs dir we just created
workdir=/tmp/a/2/workdir <-- work dir we just created

[1-1…1-3]逻辑处理在 containerd 服务中,通过 Snapshotter Service 处理。

[2-1] mount 挂载模拟

1
2
mkdir /tmp/mount
mount -t overlay -o lowerdir=/tmp/a/1/fs,upperdir=/tmp/a/2/fs,workdir=/tmp/a/2/workdir overlay /tmp/mount

查看挂载点 mount

1
2
3
4
5
[root@k8s-slave tmp]# tree mount/
mount/
└── file_a

0 directories, 1 file

[2-2] 添加测试文件 file_b

1
touch /mount/file_b

由于 upperdir 配置为 /tmp/a/2/fs ,验证 file_b 的位置:

1
2
3
4
5
6
[root@k8s-slave tmp]# ls -al a/2/fs/
总用量 8
drwxr-xr-x 2 root root 4096 4月 23 11:00 .
drwxr-xr-x 4 root root 4096 4月 23 10:37 ..
c--------- 1 root root 0, 0 4月 23 11:00 file_a
-rw-r--r-- 1 root root 0 4月 23 11:00 file_b

同时请注意关于 file_a 的描述,其实这代表着对于上一层的 COMMIT

[2-1…2-2] 逻辑处理在 containerd 服务中,通过 DiffAplier Service 处理。

[3-1] 对 mount 进行挂载点的卸载,看看 file_b 文件的真实添加位置。

1
2
3
4
5
6
7
8
9
umount overlay
[root@k8s-slave fs]# pwd
/tmp/a/2/fs
[root@k8s-slave fs]# tree
.
├── file_a
└── file_b

0 directories, 2 files

在 overlay mount如果再加一层 layer的话,该如何处理,感兴趣的可以自己模拟下看看最终表现。