containerd中文翻译系列(二十)快照器
快照器管理容器文件系统的快照。
可通过运行 ctr plugins ls
或 nerdctl info
查看可用的快照器。
核心快照器插件
通用:
- overlayfs`(默认): OverlayFS. 该驱动程序类似于 Docker/Moby 的 "overlay2 "存储驱动程序,但 containerd 的实现不叫 “overlay2”。
- native`: 本地文件复制驱动程序。类似于 Docker/Moby 的 "vfs "驱动程序。
基于块:
blockfile
: 为每个快照使用原始块文件的驱动程序。块文件从父文件或基础空块文件复制。挂载需要虚拟机或环回挂载支持。devmapper
: ext4/xfs 设备映射器。请参阅devmapper.md
。
特定于文件系统:
btrfs
: btrfs。需要将插件根目录(/var/lib/containerd/io.containerd.snapshotter.v1.btrfs
)挂载为 btrfs。zfs
: ZFS。需要将插件根目录(/var/lib/containerd/io.containerd.snapshotter.v1.zfs
)挂载为 ZFS。另请参见 https://github.com/containerd/zfs 。
已废弃:
aufs
: AUFS。自 containerd 1.5 起已弃用。已在 containerd 2.0 中移除。另请参见 https://github.com/containerd/aufs 。
非核心快照器插件
- fuse-overlayfs`: FUSE-OverlayFS快照器
nydus
: Nydus 快照程序overlaybd
: OverlayBD 快照程序stargz
: Stargz 快照程序
挂载目标
挂载可以选择性地指定一个目标,以描述容器的rootfs 中的子挂载。例如,如果快照器希望将挂载绑定到overlayfs子目录的顶部,他们可以返回以下挂载:
[
{
"type": "overlay",
"source": "overlay",
"options": [
"workdir=...",
"upperdir=...",
"lowerdir=..."
]
},
{
"type": "bind",
"source": "/path/on/host",
"target": "/path/inside/container",
"options": [
"ro",
"rbind"
]
}
]
挂载需要有挂载点 /path/inside/container
,因此之前的挂载之一必须负责在 rootfs 中提供该目录。在这种情况下,overlay 的下层目录中必须有一个目录来启用绑定挂载。
Devmapper 快照程序
devmapper 是一个 "containerd "快照器插件,可将快照存储在Device-mapper thin-pool的文件系统镜像中。Devmapper 插件利用了 Device-mapper 的功能,如 设备快照支持。
设置
要使用 devmapper snapshotter 插件,您需要提前准备一个 Device-mapper thin-pool
并更新 containerd 的配置文件。该文件通常位于 /etc/containerd/config.toml
。
下面是配置文件中的一个最小示例条目:
version = 2
[plugins]
...
[plugins."io.containerd.snapshotter.v1.devmapper"]
root_path = "/var/lib/containerd/devmapper"
pool_name = "containerd-pool"
base_image_size = "8192MB"
...
支持以下配置标志:
root_path
- 元数据所在的目录(如果为空
将使用containerd
插件的默认位置)pool_name
- Device-mapper 瘦池使用的名称。池名称
应与/dev/mapper/
目录中的名称相同base_image_size
- 定义从基础(池)设备创建瘦设备快照时分配的空间大小async_remove
- 使用快照 GC 的清理回调同步删除设备的标志(默认:`false)discard_blocks
- 删除设备时是否丢弃块。当使用环回设备时,这对将磁盘空间返回文件系统特别有用。(默认:false
)fs_type
- 定义快照设备挂载要使用的文件系统。有效值为ext4
和xfs
(默认:`"ext4)fs_options
- 可选定义文件系统选项。目前仅适用于ext4
文件系统。(默认:""
)
“root_path”、"pool_name "和 "base_image_size "是必需的快照器参数。
运行
使用以下命令试试看:
ctr images pull --snapshotter devmapper docker.io/library/hello-world:latest
ctr run --snapshotter devmapper docker.io/library/hello-world:latest test
要求
devicemapper snapshotter 要求在计算机上安装并可用 dmsetup
(>= 1.02.110) 命令行工具。在 Ubuntu 上,可使用 apt-get install dmsetup
命令安装。
如何设置Device-Mapper thin-pool
根据你的需求、磁盘配置和环境,有很多方法可以配置Device-Mapper thin-pool、
和环境。下面提供两种常见配置,一种适用于开发环境,另一种适用于生产环境。
生产环境。
1. 环回设备
在本地开发环境中,您可以使用环回设备。这种类型的配置很简单,非常适合开发和测试(请注意,这种配置速度较慢,不建议用于生产环境)。
运行以下脚本创建 thin-pool 设备及相关元数据和数据设备文件:
#!/bin/bash
set -ex
DATA_DIR=/var/lib/containerd/devmapper
POOL_NAME=devpool
sudo mkdir -p ${DATA_DIR}
# Create data file
sudo touch "${DATA_DIR}/data"
sudo truncate -s 100G "${DATA_DIR}/data"
# Create metadata file
sudo touch "${DATA_DIR}/meta"
sudo truncate -s 10G "${DATA_DIR}/meta"
# Allocate loop devices
DATA_DEV=$(sudo losetup --find --show "${DATA_DIR}/data")
META_DEV=$(sudo losetup --find --show "${DATA_DIR}/meta")
# Define thin-pool parameters.
# See https://www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt for details.
SECTOR_SIZE=512
DATA_SIZE="$(sudo blockdev --getsize64 -q ${DATA_DEV})"
LENGTH_IN_SECTORS=$(bc <<< "${DATA_SIZE}/${SECTOR_SIZE}")
DATA_BLOCK_SIZE=128
LOW_WATER_MARK=32768
# Create a thin-pool device
sudo dmsetup create "${POOL_NAME}" \
--table "0 ${LENGTH_IN_SECTORS} thin-pool ${META_DEV} ${DATA_DEV} ${DATA_BLOCK_SIZE} ${LOW_WATER_MARK}"
cat << EOF
#
# Add this to your config.toml configuration file and restart the containerd daemon
#
[plugins]
[plugins."io.containerd.snapshotter.v1.devmapper"]
pool_name = "${POOL_NAME}"
root_path = "${DATA_DIR}"
base_image_size = "10GB"
discard_blocks = true
EOF
使用 dmsetup
验证瘦池是否创建成功:
sudo dmsetup ls
devpool (253:0)
配置并重新启动 containerd
后,您将看到以下输出:
INFO[2020-03-17T20:24:45.532604888Z] loading plugin "io.containerd.snapshotter.v1.devmapper"... type=io.containerd.snapshotter.v1
INFO[2020-03-17T20:24:45.532672738Z] initializing pool device "devpool"
2. direct-lvm thin-pool
另一种设置thin-pool的方法是通过 container-storage-setup工具(以前称为 “docker-storage-setup”)。这是一个用于配置 CoW 文件系统(如 devicemapper)的脚本:
#!/bin/bash
set -ex
# Block device to use for devmapper thin-pool
BLOCK_DEV=/dev/sdf
POOL_NAME=devpool
VG_NAME=containerd
# Install container-storage-setup tool
git clone https://github.com/projectatomic/container-storage-setup.git
cd container-storage-setup/
sudo make install-core
echo "Using version $(container-storage-setup -v)"
# Create configuration file
# Refer to `man container-storage-setup` to see available options
sudo tee /etc/sysconfig/docker-storage-setup <<EOF
DEVS=${BLOCK_DEV}
VG=${VG_NAME}
CONTAINER_THINPOOL=${POOL_NAME}
EOF
# Run the script
sudo container-storage-setup
cat << EOF
#
# Add this to your config.toml configuration file and restart containerd daemon
#
[plugins]
[plugins.devmapper]
root_path = "/var/lib/containerd/devmapper"
pool_name = "${VG_NAME}-${POOL_NAME}"
base_image_size = "10GB"
EOF
如果成功,container-storage-setup
将输出:
+ echo VG=containerd
+ sudo container-storage-setup
INFO: Volume group backing root filesystem could not be determined
INFO: Writing zeros to first 4MB of device /dev/xvdf
4+0 records in
4+0 records out
4194304 bytes (4.2 MB) copied, 0.0162906 s, 257 MB/s
INFO: Device node /dev/xvdf1 exists.
Physical volume "/dev/xvdf1" successfully created.
Volume group "containerd" successfully created
Rounding up size to full physical extent 12.00 MiB
Thin pool volume with chunk size 512.00 KiB can address at most 126.50 TiB of data.
Logical volume "devpool" created.
Logical volume containerd/devpool changed.
...
而 dmsetup
将产生以下输出:
sudo dmsetup ls
containerd-devpool (253:2)
containerd-devpool_tdata (253:1)
containerd-devpool_tmeta (253:0)
另请参阅 Configure direct-lvm mode for production,了解有关生产 devmapper 设置的更多信息。
其他资源
有关 Device-mapper、精简配置等更多信息,可参考以下资源:
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/logical_volume_manager_administration/device_mapper
- https://en.wikipedia.org/wiki/Device_mapper
- https://docs.docker.com/storage/storagedriver/device-mapper-driver/
- https://www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt
- https://www.kernel.org/doc/Documentation/device-mapper/snapshot.txt