如何在 Anolis 8上部署 Nydus 镜像加速方案?
在上一篇文章中详细介绍 Anolis OS 是首个原生支持镜像加速 Linux 内核,Nydus 镜像加速服务重新优化了现有的 OCIv1 容器镜像格式,重新定义镜像的文件系统,数据与元数据分离,实现按需加载,本文作为使用 Nydus 的教程将详细介绍在 Anolis OS 上部署 Nydus 的过程,以帮助用户熟悉 Nydus 的基本使用方法。...
在上一篇文章中详细介绍 Anolis OS 是首个原生支持镜像加速 Linux 内核,Nydus 镜像加速服务重新优化了现有的 OCIv1 容器镜像格式,重新定义镜像的文件系统,数据与元数据分离,实现按需加载,本文作为使用 Nydus 的教程将详细介绍在 Anolis OS 上部署 Nydus 的过程,以帮助用户熟悉 Nydus 的基本使用方法。
一、部署环境
本教程中使用的是阿里云上购买的 EC2 虚拟机,您也可以在本地或其他云环境中部署 Nydus。
操作系统:Anolis OS 8.4 (ANCK 64位)
内核版本:Linux 4.19
CPU:2 vCPU@3.5GHz
内存:8GB
软件依赖:Nydus 当前仅支持 Containerd,因此在需要使用 containerd 作为容器引擎
龙蜥安装使用 containerd 的方法。
dnf --enablerepo Plus install -y containerd
二、安装 Nydus
龙蜥社区已经集成 Nydus 最新 Stable 稳定版本,推荐使用龙蜥集成的软件包安装 Nydus。如果需要安装指定版本的 Nydus,可以下载上游开源版本的代码包安装(以下两种安装方式任选一种即可)。
2.1 使用龙蜥集成的软件包
dnf --enablerepo Plus install -y nydus-rs nydus-snapshotter
2.2 使用上游开源版本
-
下载 Nydus 的可执行文件。
从发布页面(见文末链接1)获取最新的压缩包,并解压。
wget https://github.com/dragonflyoss/image-service/releases/download/v2.1.0-alpha.4/nydus-static-v2.1.0-alpha.4-linux-amd64.tgz
tar -xzvf nydus-static-v2.1.0-alpha.4-linux-amd64.tgz
-
下载 Nydus Snapshotter 的可执行文件。
从发布页面(见文末链接2)获取最新的压缩包,并解压。
wget https://github.com/containerd/nydus-snapshotter/releases/download/v0.2.4/nydus-snapshotter-v0.2.4-x86_64.tgz
tar -xzvf nydus-snapshotter-v0.2.4-x86_64.tgz
mv nydus-snapshotter/containerd-nydus-grpc nydus-static/containerd-nydus-grpc
-
选择 Nydus 运行模式。
Nydus 加速框架支持了三种运行模式,以支持不同场景下的镜像按需加载:
-
通过 FUSE 提供给 RunC 这类容器运行时的按需加载能力,也是 Nydus 目前最常用的模式;
-
通过 VirtioFS 承载 FUSE 协议,支持基于 VM 的容器运行时,例如 Kata 等,为 VM Guest 里的容器提供 RootFS 按需加载能力;
-
通过内核态的 EROFS 只读文件系统提供 RootFS,目前 Nydus 的 EROFS 格式支持已经进入了 Linux 5.16 主线,其内核态缓存方案 erofs over fscache 也已经合入 Linux 5.19-rc1 主线,内核态方案可以减少上下文切换及内存拷贝开销,在性能有极致要求的情况下可以用这种模式。
由于第一种模式的环境依赖最少,比较适合演示。因此在这里我们选择 fuse 模式,将 nydusd 二进制文件中的 nydusd-fusedev 重命名为 nydusd。
cd nydus-static
mv nydusd-fusedev nydusd
-
安装可执行文件。
sudo cp nydusd nydus-image /usr/bin
sudo cp nydusify containerd-nydus-grpc /usr/bin
sudo cp ctr-remote nydus-overlayfs /usr/
cd ..
三、启动 Nydus Snapshotter
3.1 写入配置文件
Nydus 提供了一个容器化的远程快照管理器 containerd-nydus-grpc 来准备容器 rootfs 与 nydus 格式的镜像。要启动它,首先将 nydusd 配置保存到 /etc/nydusd-config.json:
sudo tee /etc/nydusd-config.json > /dev/null << EOF
{
"device": {
"backend": {
"type": "registry",
"config": {
"scheme": "https",
"skip_verify": false,
"timeout": 5,
"connect_timeout": 5,
"retry_limit": 2
}
},
"cache": {
"type": "blobcache",
"config": {
"work_dir": "cache"
}
}
},
"mode": "direct",
"digest_validate": false,
"iostats_files": false,
"enable_xattr": true,
"fs_prefetch": {
"enable": true,
"threads_count": 4
}
}
EOF
3.2 启动远程快照管理器
新开一个终端运行 containerd-nydus-grpc。
sudo /usr/bin/containerd-nydus-grpc \
--config-path /etc/nydusd-config.json \
--shared-daemon \
--log-level info \
--root /var/lib/containerd/io.containerd.snapshotter.v1.nydus \
--cache-dir /var/lib/nydus/cache \
--address /run/containerd/containerd-nydus-grpc.sock \
--nydusd-path /usr/bin/nydusd \
--nydusimg-path /usr/bin/nydus-image \
--log-to-stdout
cache-dir参数表示本地 blob 缓存根目录,如果未设置,会默认为root+ "/cache"。它会覆盖 nydusd-config.json 中的 device.cache.config.work_dir。
四、配置 Containerd
4.1 将以下内容添加到 containerd 配置中(默认为/etc/containerd/config.toml):
[proxy_plugins]
[proxy_plugins.nydus]
type = "snapshot"
address = "/run/containerd/containerd-nydus-grpc.sock"
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "nydus"
disable_snapshot_annotations = false
4.2 重新启动 Contained。
配置更新后需要重启 Contained 服务。
systemctl restart containerd
五、启动 Nydus 镜像格式的容器
这里展示如何使用 crictl 启动一个 Nydus 镜像格式的容器。
5.1 编写 sandbox yaml 文件 nydus-sandbox.yaml,往 POD 中传递 Nydus annotation。
metadata:
attempt: 1
name: nydus-sandbox
namespace: default
log_directory: /tmp
linux:
security_context:
namespace_options:
network: 2
annotations:
"io.containerd.osfeature": "nydus.remoteimage.v1"
5.2 编写容器 yaml 文件 nydus-container.yaml,指定使用的容器镜像。
metadata:
name: nydus-container
image:
image: cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6-x86_64-nydus
command:
- /bin/sleep
args:
- 600
log_path: container.1.log
这里我们使用了龙蜥云原生镜像仓库中已经集成的 Anolis 8.6 的镜像作为测试镜像。
5.3 拉取镜像并启动容器。
date
crictl pull cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6-x86_64-nydus
pod=`crictl runp nydus-sandbox.yaml`
container=`crictl create $pod nydus-container.yaml nydus-sandbox.yaml`
crictl start $container
crictl ps
date
这里可以看到,采用 Nydus 镜像仅使用 2 秒便完成了容器镜像的拉取和容器启动的过程。在同等的条件下,我们创建一个 OCIv1 的镜像对比一下,使用的依然是 anolis 8.6 的镜像,镜像的内容与上述使用的 nydus 完全一致。yaml 文件编写如下:
metadata:
attempt: 1
name: normal-sandbox
namespace: default
log_directory: /tmp
linux:
security_context:
namespace_options:
network: 2
metadata:
name: normal-container
image:
image: cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6
command:
- /bin/sleep
args:
- 600
log_path: container.1.log
采用如下的命令:
date
crictl pull cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6
pod=`crictl runp normal-sandbox.yaml`
container=`crictl create $pod normal-container.yaml normal-sandbox.yaml`
crictl start $container
crictl ps
date
可以看到,同等环境下,使用 OCIv1 镜像格式启动 Anolis 8.6 的版本需要10 秒,是 Nydus 的 5 倍。
六、转换并启动 Nydus 镜像
这里展示转换 Nydus 镜像并推送到您的镜像仓库中去,为了能够登录镜像仓库,我们采用 nerdctl 工具进行配置
6.1 安装 Nerdctl 和 CNI plugin。
Nerdctl 是一种与 docker 兼容的命令行,但是由于它能够支持启动 Nydus 镜像,因此我们在这里选择使用 Nerdctl。由于容器在运行中可能需要依赖一些插件,所以我们同时安装 CNI plugin。
dnf update -y anolis-repos && yum install -y anolis-experimental-release && yum install -y nerdctl
dnf install -y containernetworking-plugins
使用 nerdctl login 进行登录,用于仓库认证,当然,您可以采用 docker login 方式登录。
nerdctl login --username ${your username} --password xxx
6.2 将镜像转换为 Nydus 格式,并推送至远程镜像仓库。
nydusify convert --nydus-image /usr/bin/nydus-image --source ${your image} --target ${your registry address}/${image name}:${tag}
按照操作完成以上步骤,恭喜,您已经成功在 Anolis OS 上完成了 Nydus 镜像加速方案的部署!如果后续还有疑问,请扫描下方二维码或搜索钉钉群号(44701621)入群交流。
参考链接:
1. Nydus软件包发布页面:
https://github.com/dragonflyoss/image-service/releases/latest
2.containerd 下 nydus snapshotter 发布页面:
https://github.com/containerd/nydus-snapshotter/releases/tag/v0.2.4
3. Nydus 的更多技术细节:
https://developer.aliyun.com/article/971522
4.Nydus 更详细的部署说明:
https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md
—— 完 ——
更多推荐
所有评论(0)