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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 手把手教你在 Anolis OS 上部署 Nydus!

vcg_VCG211273465786_RF.jpg

在上一篇文章中详细介绍 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

640.png

这里可以看到,采用 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

640 (4).png 可以看到,同等环境下,使用 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

 

—— 完 ——

加入社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!

640 (5).png

关于龙蜥社区 


龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、个人等在自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、开放的Linux 上游发行版社区及创新平台。

龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。

目前,Anolis OS 8.6 已发布,更多龙蜥自研特性,支持 X86_64 、RISC-V、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。

欢迎下载:

https://openanolis.cn/download

加入我们,一起打造面向未来的开源操作系统!

https://openanolis.cn

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
网络协议 数据安全/隐私保护 Docker
Docker 镜像库国内加速的几种方法
Docker 镜像库国内加速的几种方法
|
存储 Cloud Native 数据库
云原生之使用docker部署ZPan个人网盘系统
云原生之使用docker部署ZPan个人网盘系统
324 2
云原生之使用docker部署ZPan个人网盘系统
|
存储 Dragonfly 缓存
Nydus:开源的下一代容器镜像加速服务
让更多的容器用户能够体验到容器快速启动和安全加载方面的能力。
7057 0
Nydus:开源的下一代容器镜像加速服务
|
6月前
|
存储 监控 Cloud Native
云原生之使用Docker部署webos私有云盘
通过以上步骤,你可以在云原生环境中使用Docker部署webOS私有云盘,实现高可用、弹性扩展和简化部署等优势。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
113 4
|
存储 Dragonfly 缓存
带你读《2022龙蜥社区全景白皮书》——5.6.3 容器镜像大规模分发技术Nydus
带你读《2022龙蜥社区全景白皮书》——5.6.3 容器镜像大规模分发技术Nydus
176 7
|
Dragonfly Cloud Native 应用服务中间件
如何在 Anolis 8 上构建基于 Nydus 和 Dragonfly 的镜像加速解决方案
Nydus+Dragonfly 组合减少容器启动过程中镜像的拉取时间,提升集群间的镜像分发效率。
如何在 Anolis 8 上构建基于 Nydus 和 Dragonfly 的镜像加速解决方案
|
存储 SQL 分布式计算
Docker容器化急速部署ClickHouse
Docker容器化急速部署ClickHouse
|
存储 Dragonfly JSON
Nydus 在约苗平台的容器镜像加速实践
本文是来自向申同学的分享,介绍了其在 K8s 生产环境集群部署 Nydus 的相关实践。
Nydus 在约苗平台的容器镜像加速实践
|
Cloud Native 安全 关系型数据库
|
JSON 前端开发 Cloud Native
Nerdctl 原生支持 Nydus 加速镜像
OSPP 开源之夏是由中科院软件研究所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动。旨在鼓励在校学生积极参与开源软件的开发维护、促进优秀开源软件社区的蓬勃发展、培养和发掘更多优秀的开发者。 这是去年(2022)的开源活动中,李楠同学参加 Nydus 容器开源生态集成课题的相关工作。
Nerdctl 原生支持 Nydus 加速镜像