2 个版本 (1 个稳定版)
2.2.0 | 2023年3月2日 |
---|---|
2.1.0-alpha2 | 2022年6月19日 |
#299 in Unix APIs
每月 26 次下载
3.5MB
49K SLoC
Nydus:Dragonfly 容器镜像服务
简介
nydus 项目在 RAFS 格式之上实现了一个内容可寻址文件系统,改进了当前 OCI 镜像规范,在容器启动速度、镜像空间和网络带宽效率以及数据完整性方面。
以下基准测试结果显示了与 containerd 上的 OCI 镜像相比,容器冷启动时间的性能提升。随着 OCI 镜像大小的增加,使用 Nydus 镜像的容器启动时间仍然非常短。
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镜像服务
- 将原始OCI镜像转换为Nydus镜像并存储在Docker/Registry、NAS、阿里云/OSS或S3等位置。这可以通过
nydusify
直接完成。普通用户不需要涉及nydus-image
。 - 在本地安装并正确配置
nydus-snapshotter
(containerd-nydus-grpc
)。或者安装nydus-docker-graphdriver
插件。 - 使用传统方法操作容器。例如,使用
docker
、nerdctl
、crictl
和ctr
。
构建二进制文件
# 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镜像:使用Nydusify,Acceld或Nerdctl。
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和/或钉钉联系我们/加入我们。
-
Slack:Nydus工作空间
-
Twitter:@dragonfly_oss
-
钉钉:34971767

- 技术会议:每周三06:00 UTC(北京、上海14:00),请查看我们的HackMD页面以获取更多信息。
依赖项
~27–49MB
~841K SLoC