美文网首页
Containerd Snapshot Demo

Containerd Snapshot Demo

作者: Xiao_Yang | 来源:发表于2021-06-28 19:37 被阅读0次

Containerd 的一个重要的组件服务就是 snapshot ,主要的功能就是为容器准备 rootfs 文件系统,为了更好的理解 snapshot 服务的应用逻辑,通过ctr 工具来做一个 snapshot 实验。

实验目标:

  1. 理解 snapshot 的 prepare、mount 和 commit 功能用途,对看 snapshot 服务源码的理解上将大有裨益;
  2. 理解镜像层和层的父子关系,每一层都是对变更内容的快照,可将 committed 层作为父内容创建新的层;
  3. 理解容器 rootfs 文件系统(扩展学习一下关于本人的 oci image spec )

环境准备

// 本实验 containerd 版本为v1.5.2

// 准备挂载点
$# mkdir /var/lib/containerd/custom_dir  

snapshot 操作

// 第一次提交 (根)
$# ctr snapshot prepare activeLayer0                                                  // prepare 创建一个工作状态的层
$# ctr snapshot mount /var/lib/containerd/custom_dir activeLayer0  | xargs sudo       // snapshot 文件系统挂载(此挂载类型overlayfs)
$# echo “1" > ./custom_dir/add01                                                      // 增加一次变更文件 
$# umount /var/lib/containerd/custom_dir                                              // 卸载点
$# ctr snapshot commit commit_add01 activeLayer0                                      // 提交 committed,变更snapshot状态,保存Layer
                  
// 第二次提交,以第一次 layer 为 parent
$# ctr snapshot prepare activeLayer0 commit_add01
$# ctr snapshot mount /var/lib/containerd/custom_dir activeLayer0 | xargs sudo
$# echo "2" > /var/lib/containerd/custom_dir/add02
$# umount /var/lib/containerd/custom_dir
$# ctr snapshot commit commit_add02 activeLayer0

查看 snapshot 的过程状态记录 ctr snapshot ls

// 第一次 snapshot prepare
$# ctr snapshot ls
KEY                                PARENT                                           KIND
activeLayer0                                                                       Active

// 第一次 snapshot commit
$# ctr snapshot ls
KEY                                PARENT                                           KIND
commit_add01                                                                       Committed

// 第二次 snapshot prepare
$# ctr snapshot ls
KEY                                PARENT                                            KIND
activeLayer0                       commit_add01                                     Active
commit_add01                                                                        Committed

// 第二次 snapshot commit
$# ctr snapshot ls
KEY                                PARENT                                             KIND
commit_add01                                                                        Committed
commit_add02                      commit_add01                                      Committed

查看系统的挂载信息(linux默认snapshotter:overlayfs)

//第二次挂载后
$# mount   
overlay on /var/lib/containerd/custom_dir type overlay (rw,relatime,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/26/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/27/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/27/work)

查看 snapshot layer 父子关系

// 第二次 prepare 后查看 tree
$# ctr snapshot tree
 commit_add01
  \_ activeLayer0

实验后清理工作

删除层需”先子后父"
$# ctr snapshot rm commit_add01
ctr: failed to remove "commit_add01": cannot remove snapshot with child: failed precondition

$# ctr snapshot rm commit_add02
$# ctr snapshot rm commit_add01

扩展学习: overlayfs 特性介绍

创建(文件/目录)
-在Upper层直接进行创建
修改(文件/目录)
-若指定文件存在于Upper,则直接修改访文件
-若指定文件仅存在于Lower, 则会先从Lower拷贝文件到Upper(copy_up操作),然后再修改
删除(文件)
-若指定文件仅存在于Upper,则直接删除该文件
-若指定文件存在于Lower,则在Upper层创建同名的字符设备
删除(目录)
-若指定目录仅存在于Upper,则直接删除该目录。
-若指定目录存在于Lower,则在Upper层创建同名的字符设备。
-若在删除后再次创建同名目录,且同名目录存在于Lower,此时新的目录成为opaque目录,通过将xattr的“trusted.overlay.opaque”设置为“y”实现标记,此时Upper层的该目录就会完全覆盖Lower中的目录,而非原先的合并。

相关文章

网友评论

      本文标题:Containerd Snapshot Demo

      本文链接:https://www.haomeiwen.com/subject/qphcultx.html