写点什么

如何在 Anolis 8 上部署 Nydus 镜像加速方案?

  • 2022 年 8 月 12 日
    黑龙江
  • 本文字数:3681 字

    阅读完需:约 12 分钟

如何在 Anolis 8上部署 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.tgztar -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.tgztar -xzvf nydus-snapshotter-v0.2.4-x86_64.tgzmv 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-staticmv nydusd-fusedev nydusd
复制代码


  • 安装可执行文件。


sudo cp nydusd nydus-image /usr/binsudo cp nydusify containerd-nydus-grpc /usr/binsudo 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: defaultlog_directory: /tmplinux:  security_context:    namespace_options:      network: 2annotations:  "io.containerd.osfeature": "nydus.remoteimage.v1"
复制代码

5.2 编写容器 yaml 文件 nydus-container.yaml,指定使用的容器镜像

metadata:  name: nydus-containerimage:  image: cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6-x86_64-nyduscommand:  - /bin/sleepargs:  - 600log_path: container.1.log
复制代码


这里我们使用了龙蜥云原生镜像仓库中已经集成的 Anolis 8.6 的镜像作为测试镜像。

5.3 拉取镜像并启动容器

datecrictl pull cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6-x86_64-nyduspod=`crictl runp nydus-sandbox.yaml`container=`crictl create $pod nydus-container.yaml nydus-sandbox.yaml`crictl start $containercrictl psdate
复制代码



这里可以看到,采用 Nydus 镜像仅使用 2 秒便完成了容器镜像的拉取和容器启动的过程。在同等的条件下,我们创建一个 OCIv1 的镜像对比一下,使用的依然是 anolis 8.6 的镜像,镜像的内容与上述使用的 nydus 完全一致。yaml 文件编写如下:


metadata:  attempt: 1  name: normal-sandbox  namespace: defaultlog_directory: /tmplinux:  security_context:    namespace_options:      network: 2
复制代码


metadata:  name: normal-containerimage:  image: cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6command:  - /bin/sleepargs:  - 600log_path: container.1.log
复制代码


采用如下的命令:


datecrictl pull cloud-native-sig-registry.cn-hangzhou.cr.aliyuncs.com/openanolis/anolisos:8.6pod=`crictl runp normal-sandbox.yaml`container=`crictl create $pod normal-container.yaml normal-sandbox.yaml`crictl start $containercrictl psdate
复制代码



可以看到,同等环境下,使用 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 nerdctldnf 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


  1. Nydus 的更多技术细节:


https://developer.aliyun.com/article/971522


4.Nydus 更详细的部署说明:


https://github.com/dragonflyoss/image-service/blob/master/docs/containerd-env-setup.md


—— 完 ——

用户头像

还未添加个人签名 2021.07.20 加入

OpenAnolis龙蜥社区 由国内外头部企业联合建立的操作系统开源社区。加入我们,一起打造面向未来的开源操作系统。 社区官网:openanolis.cn|微信公众号:OpenAnolis龙蜥

评论

发布
暂无评论
如何在 Anolis 8上部署 Nydus 镜像加速方案?_Linux_OpenAnolis小助手_InfoQ写作社区