3 个不稳定版本

0.2.0 2023年1月31日
0.1.1 2022年11月8日
0.1.0 2022年6月18日

#7#content-addressable

Download history 51/week @ 2024-03-11 10/week @ 2024-03-18 65/week @ 2024-04-01 7/week @ 2024-05-20

4,278 每月下载量
2 个 crate 中使用(通过 dbs-virtio-devices

Apache-2.0 OR BSD-3-Clause

1.5MB
30K SLoC

[⬇️ 下载] [📖 网站] [☸ 快速入门 (Kubernetes)] [🤓 快速入门 (nerdctl)] [❓ 常见问题 & 故障排除]

Nydus:Dragonfly 容器镜像服务

Release Version License Twitter Nydus Stars

Smoke Test Image Conversion Release Test Daily Benchmark Coverage

简介

Nydus 在 RAFS 格式上实现内容可寻址文件系统,通过提高容器启动速度、镜像空间和网络带宽效率以及数据完整性来增强当前的 OCI 图像规范。

以下基准测试结果表明,Nydus 图像在 Containerd 上的容器冷启动耗时方面显著优于 OCI 图像,尤其是在 OCI 图像大小增加时。

Container Cold Startup

原则

提供快速、安全且易于访问的数据分发

  • 性能:二级容器启动速度,毫秒级功能计算代码包加载速度。
  • 低成本:用内存安全语言 Rust 编写,众多优化有助于提高内存、CPU 和网络消耗。
  • 灵活:支持运行时如 runCKata,并提供 Confidential Containers 和漏洞扫描功能
  • 安全:端到端数据完整性检查,运行时可以检测并避免供应链攻击。

主要功能

  • 按需加载:容器镜像/包以块为单位按需下载,以提高启动速度。
  • 块级去重:在跨层或跨图像级别进行块级数据去重,以减少存储、传输和内存成本。
  • 兼容生态系统:存储后端支持与注册表、对象存储服务(OSS)、网络附加存储(NAS)、共享磁盘以及P2P服务。兼容OCI镜像,并提供原生的eStargz镜像支持。
  • 数据可分析性:记录访问、数据布局优化、预取、I/O放大、异常行为检测。
  • POSIX兼容性:内核中的EROFS或FUSE文件系统与overlayfs结合提供完整的POSIX兼容性。
  • I/O优化:使用合并的文件系统树、数据预取和用户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后端提供服务

支持的平台

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

构建

构建二进制文件

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

构建Nydus镜像

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

直接从Dockerfile构建Nydus镜像:Buildkit

从各种来源构建Nydus层:Nydus Image Builder

镜像预取优化

为了进一步减少容器启动时间,可以使用 NRI 插件(containerd >=1.7)构建带有预取列表的 nydus 镜像:容器镜像优化器

运行

快速入门

有关如何在 Kubernetes 节点或本地使用 nydus-snapshotter 和 nydus 镜像懒惰地启动容器以及不使用 CRI 的详细信息,请参阅 Nydus 设置

运行 Nydus Snapshotter

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

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

运行 Nydusd 守护进程

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

运行 Nydusd 守护进程以提供 Nydus 镜像:Nydusd

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

从 Linux 5.16 开始,内核 EROFS 已完全兼容 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 集成

如果您想通过 Helm 同时部署 Dragonfly 和 Nydus,请参阅 快速入门

直接使用 Nydus 运行 OCI 镜像

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

使用 Docker(Moby) 运行

Nydus 提供了多种方法来支持在 docker(Moby) 上运行,请参阅 Nydus 在 Docker(Moby) 环境中的设置

在 macOS 上运行

Nydus 还可以使用 macfuse(也称为 osxfuse)运行。有关更多详细信息,请阅读 Nydus 在 macOS 上的运行

运行 eStargz 镜像(带有懒惰拉取)

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

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

运行Nydus服务

在您的项目中直接使用nydus的键特性,无需故意准备和调用nydusdnydus-service帮助复用nydus的核心服务。

文档

请访问Wiki,或docs

社区

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

我们非常乐意在任何时候了解您的用例。请随时通过Slack或钉钉联系我们。

依赖项

~18–37MB
~593K SLoC