2 个版本 (1 个稳定版)

2.2.0 2023年3月2日
2.1.0-alpha22022年6月19日

#299 in Unix APIs

每月 26 次下载

Apache-2.0 OR BSD-3-Clause

3.5MB
49K SLoC

Nydus:Dragonfly 容器镜像服务

Release Version License

Smoke Test Image Conversion Release Test Daily Twitter Nydus Stars

简介

nydus 项目在 RAFS 格式之上实现了一个内容可寻址文件系统,改进了当前 OCI 镜像规范,在容器启动速度、镜像空间和网络带宽效率以及数据完整性方面。

以下基准测试结果显示了与 containerd 上的 OCI 镜像相比,容器冷启动时间的性能提升。随着 OCI 镜像大小的增加,使用 Nydus 镜像的容器启动时间仍然非常短。

Container Cold Startup

Nydus 的关键特性包括

  • 容器镜像可以按需分块下载,以实现懒惰拉取,从而加速容器启动
  • 基于分块的内容可寻址数据去重,以最小化存储、传输和内存占用
  • 合并文件系统树,以便可选地删除所有中间层
  • 内核 EROFS 或 FUSE 文件系统与 overlayfs 结合,以提供完整的 POSIX 兼容性
  • 端到端镜像数据完整性检查。因此,可以避免和检测运行时的供应链攻击等问题
  • 兼容 OCI 艺术品规范和分发规范,因此 Nydus 镜像可以存储在常规容器注册表中
  • 原生 eStargz 镜像支持,带有 containerd 运行时的远程快照器插件 nydus-snapshotter
  • 支持各种容器镜像存储后端。例如,注册表、NAS、阿里云/OSS、S3。
  • 与 CNCF 孵化项目 Dragonfly 集成,以 P2P 方式分发容器镜像,并减轻容器注册表的负担
  • 能够在用户 I/O 击中数据块之前预取数据块,从而减少读取延迟
  • 在运行时记录文件访问模式,收集访问跟踪/日志,从而轻松捕获用户的异常行为
  • 基于访问跟踪的预取表
  • 用户I/O放大以减少对存储后端的少量请求。

目前Nydus包括以下工具

工具 描述
nydusd Nydus用户空间守护进程,它处理内核中的所有fscache/FUSE消息,并解析Nydus镜像以满足这些请求
nydus-image 将OCI格式容器镜像的单层转换为Nydus格式容器镜像,分别生成元数据文件和数据文件
nydusify 它拉取OCI镜像并解包它,调用nydus-image create来转换镜像,然后将转换后的镜像推回注册表和数据存储
nydusctl Nydusd CLI客户端(nydus-image inspect),查询守护进程的工作状态/指标并对其进行配置
ctr-remote 增强的containerd CLI工具,通过containerd ctr启用对Nydus的支持
nydus-docker-graphdriver [实验性] 作为docker远程图驱动程序,控制镜像和容器的存储和管理方式
nydus-overlayfs Containerd挂载助手,调用overlayfs挂载并稍微调整挂载选项。因此,可以将Nydus前提条件传递到基于虚拟机的运行时
nydus-backend-proxy 一个简单的HTTP服务器,将本地目录作为Nydusd的blob后端提供服务

目前Nydus在容器生态系统中支持以下平台

类型 平台 描述 状态
存储 注册表/OSS/S3/NAS 支持与Docker Hub、Harbor、Github GHCR、阿里云ACR、NAS和类似阿里云OSS的对象存储服务兼容的分发实现
存储/构建 Harbor 为Harbor提供通用服务,支持基于Nydus和eStargz等各种加速器的图像转换加速
分发 Dragonfly 使用Dragonfly P2P数据分发系统进一步提高Nydus镜像的运行时性能
构建 Buildkit 提供从Dockerfile直接构建和导出Nydus镜像的能力
运行时 Kubernetes 使用CRI接口运行Nydus镜像
运行时 Containerd Nydus快照器,一个containerd远程插件,用于运行Nydus镜像
运行时 CRI-O / Podman 使用CRI-O或Podman运行Nydus镜像 🚧
运行时 Docker / Moby 在Docker容器中使用containerd和nydus-snapshotter运行Nydus镜像
构建/运行 Nerdctl containerd客户端,用于构建或运行(需要nydus快照器)Nydus镜像
运行时 KataContainers 作为原生解决方案在KataContainers中运行Nydus镜像
运行时 EROFS 在内核中直接运行Nydus镜像,以实现更大的性能提升

尝试Nydus镜像服务

  1. 将原始OCI镜像转换为Nydus镜像并存储在Docker/Registry、NAS、阿里云/OSS或S3等位置。这可以通过nydusify直接完成。普通用户不需要涉及nydus-image
  2. 在本地安装并正确配置nydus-snapshottercontainerd-nydus-grpc)。或者安装nydus-docker-graphdriver插件。
  3. 使用传统方法操作容器。例如,使用dockernerdctlcrictlctr

构建二进制文件

# build debug binary
make
# build release binary
make release
# build static binary with docker
make docker-static

使用Kubernetes和Containerd快速入门

有关如何在Kubernetes节点或本地使用nerdctl而不是CRI来懒加载容器以及Nydus镜像的更多详细信息,请参阅Nydus设置

构建Nydus镜像

从目录源构建Nydus镜像:Nydus镜像构建器

将OCIv1镜像转换为Nydus镜像:使用NydusifyAcceldNerdctl

Nydus快照器

Nydus-snapshotter是containerd的一个非核心子项目。

Nydus-snapshotter仓库查看其代码和教程。它作为一个containerd远程快照器,帮助设置带有Nydus镜像的容器根文件系统,在需要时处理Nydus镜像格式。在没有Nydus镜像运行时,它与containerd内建的overlayfs快照器相同。

运行Nydusd守护进程

通常,用户无需手动启动nydusd。当准备容器根文件系统时,由nydus-snapshotter启动。

运行Nydusd守护进程以服务Nydus镜像:Nydusd

使用内核EROS文件系统运行Nydus

从Linux 5.16开始,内核EROS与RAFS v6镜像格式完全兼容。换句话说,自那时起,未经压缩的RAFS v6镜像可以挂载到块设备上。

自Linux 5.19以来,EROS增加了一个新的基于文件的缓存(fscache)后端。这样,压缩的RAFS v6镜像可以直接使用fscache子系统挂载,即使这些镜像部分可用。estargz也可以实时转换并以此方式挂载。

关于在fscache中运行Nydus的指南:Nydus-fscache

使用Dragonfly P2P系统运行Nydus

Nydus与Dragonfly P2P系统深度集成,可以大大减少注册服务器的网络延迟和网络压力的单点。在生产环境中测试表明,使用Dragonfly可以将网络延迟降低80%以上。要了解性能测试数据以及如何配置Nydus以使用Dragonfly,请参阅文档

直接使用Nydus加速OCI镜像

Nydus可以从现有的OCI镜像中快速生成一个名为nydus zran的小型工件。这个工件可以用来加速容器启动时间,而无需进行完整的镜像转换。更多信息,请参阅文档

通过Harbor构建镜像

Nydus与Harbor社区合作开发acceleration-service,它为Harbor提供了一项通用服务,支持基于Nydus、eStargz等各种加速器的镜像加速。

与Docker一起运行

一个实验性插件可以帮助从Nydus镜像启动Docker容器。有关更详细的说明,请参阅Docker Nydus Graph Driver

在macOS上运行

Nydus也可以通过macfuse(也称为osxfuse)运行。更多详细信息,请阅读nydus with macOS

运行eStargz镜像(带懒加载)

containerd远程快照器插件nydus-snapshotter可以用来运行Nydus镜像,或者通过添加--enable-stargz命令行选项直接运行eStargz镜像。

在未来,zstd::chunked也可以这样工作。

文档

浏览文档以了解更多信息。以下是您可能感兴趣的一些主题:

  • 面向初学者的Nydus教程
  • Nydus设计文档
  • 我们在2020年Open Infra Summit上的演讲:[指向下一代容器镜像](https://drive.google.com/file/d/1LRfLUkNxShxxWU7SKjc_50U0N9ZnGIdV/view)(外部链接)
  • EROFS,我们现在为容器做了些什么?
  • [Nydus图像加速的演进](https://d7y.io/blog/2022/06/06/evolution-of-nydus/)(视频链接)
  • [内核EROFS上的Nydus图像服务介绍](https://static.sched.com/hosted_files/osseu2022/59/Introduction%20to%20Nydus%20Image%20Service%20on%20In-kernel%20EROFS.pdf)(视频链接)

社区

Nydus旨在为所有社区提供一个厂商中立的开源镜像分发解决方案。问题、错误报告、技术讨论、功能请求和贡献始终欢迎!

我们很高兴随时听到您的用例。请通过Slack和/或钉钉联系我们/加入我们。

  • 技术会议:每周三06:00 UTC(北京、上海14:00),请查看我们的HackMD页面以获取更多信息。

依赖项

~27–49MB
~841K SLoC