近期,Fluid 支持了阿里云 ECI 应用,并将 JuiceFS Runtime Controller 设置为默认安装;JuiceFS 也就此功能与 Fluid 完成了集成和测试工作。 用户可以在 ECI 环境中使用JuiceFS, 体验计算与存储的双重极致弹性。
(还不了解 JuiceFS Runtime Controller 的小伙伴,推荐先阅读:在 Kubernetes 集群玩转 Fluid + JuiceFS ,这个功能可以让用户更好地在 Kubernetes 环境中使用 JuiceFS 缓存管理能力)
ECI(Elastic Container Instance)阿里云弹性容器实例,是阿里云 Serverless 和容器化的弹性计算服务。用户无需购买和管理底层 ECS 服务器,只需要提供打包好的镜像,即可运行容器,用户仅需要为容器实际运行消耗的资源付费。
如果说云原生就是使资源池化,那么 Serverless 的演进才使得基础设施水电煤化成为可能。Serverless 的核心是快速交付、智能弹性、更低成本。数据智能应用的 Serverless 化已经成为了一种趋势,尤其是对于计算密集型任务的 AI 训练场景来说,长期维护大量 ECS 服务器,成本相当高。对于这类场景,ECI 是最理想的选择,用户只需要为任务运行时的资源付费,即用即停,不需要长期维护 ECS 服务器,是降本增效的最优选择。
目前,在ECI 环境,JuiceFS 用户可以借助 Fluid 来使用 JuiceFS,亦可借助 Fluid 的 Dataload 功能更方便地使用 JuiceFS 的缓存预热功能,进一步提升云上 AI 应用的数据访问效率。
Fluid 如何支持 ECI 应用
Fluid 通过自动识别用户应用中使用的 Fluid PVC(PersistentVolumeClaim),将不同缓存 Runtime 的 FUSE 客户端以 Sidecar 的形式注入到 Serverless Pod 中。JuiceFS 客户端以 Sidecar 容器的方式单独为应用容器提供挂载服务,且与应用容器同生命周期,用户只需要为应用运行时的资源付费即可。
同时,为了提高数据加速能力,独立缓存集群可以长时间运行,只需单独开几台 ECS 节点用以运行各 Runtime 的缓存集群,为 Sidecar 提供分布式缓存服务。
整体架构如下图。
Why JuiceFS in AI
AI 训练场景会产生大量的小文件,同时 AI 作业管线(Pipeline)纷繁复杂、流程长,ML/DL 框架、MPI 框架、科学计算库、大数据计算引擎等不同组件需要对接不同的数据访问接口;当在 Kubernetes 平台上,尤其是 Serverless 环境使用传统文件系统也面临可靠性、访问性能等一系列问题。
JuiceFS 是一款为云上环境设计的分布式存储引擎,采用「数据」与「元数据」分离存储的架构,元数据引擎可以横向扩展,轻松支持百亿小文件存储;并且 JuiceFS 云服务版具备分布式缓存能力,对于机器学习中需要对同一个数据集反复训练等场景,可以大幅提升数据访问的性能。
JuiceFS 如何在 Fluid 中工作
通过 Fluid 我们可以快速搭建 JuiceFS 的环境,构建出 JuiceFS 独立缓存集群,缓存集群以 StatefulSet 的形式运行在 ECS 节点中,提供分布式缓存服务,而 FUSE 客户端以 Sidecar 的方式运行在业务 Pod 中,业务 Pod 则运行在 ECI 节点上。
使用流程
具体操作可参考官网 JuiceFS 文档。
准备环境
目前 Fluid on ECI 还处于公测阶段,默认没有开启,但我们可以申请 AI 套件免费体验席位。
申请完毕后,我们需要创建一个 ACK 版集群,集群的 Kubernetes 版本不低于1.18。在 ACK 集群中可以直接通过云原生 AI 套件,安装 Fluid。
使用 JuiceFS
JuiceFS 采用元数据和数据分开存储的设计,元数据会被存储在元数据服务引擎中,数据会被存储在对象存储中,对象存储需要用户自己提供。由于目前只有云服务版 JuiceFS 提供分布式缓存服务,本文以云服务版 JuiceFS 为例。
1.创建 Secret 第一步在 ACK 集群中创建保密字典,填入需要密文存储的 token(JuiceFS 控制台管理的 volume token)和对象存储的 accesskey 和 secretkey。
2.创建 JuiceFSRuntime 和 Dataset 在 JuiceFSRuntime 中指定副本数及缓存地址等信息;在 Dataset 的 options 中填入对象存储的 bucket,在 encryptOptions 中填入引用 Secret 的值。
创建好后,可以在容器组页面看到有 Worker Pod 创建出来:
这 5 个 Worker 就组成了一个 JuiceFS 独立缓存集群,运行在 ECS 节点上,为客户端提供缓存服务。
3.缓存加速 缓存集群创建好后,我们可以先进行缓存预热,创建 Dataload,指定上一步创建的 Dataset。「任务」页面的 jfs-load-loader-job 显示完成,即代表缓存集群预热完成。
4.创建应用
最后我们可以创建应用了,在应用的数据卷中指定与 Dataset 同名的存储卷,这里我们创建一个 Job,启动命令为统计拷贝数据的时间。同时需要给 Pod 设置以下两个 Label:
alibabacloud.com/fluid-sidecar-target: eci
alibabacloud.com/eci: "true
应用创建好后,我们就可以看到 Pod 中有 Webhook 注入的 fluid-fuse 容器,且运行在虚拟节点上:
此时该 Pod 已经运行在 ECI 环境中了。该 Pod 运行完,日志中就会显示其拷贝数据的时间:
根据上面的步骤,可以看出,在有缓存加速的时候,拷贝数据的时间为 1m11.16s。为了与有缓存的情况做个对比,我们遵循上述过程,在不做缓存加速的情况下,测试拷贝数据的时间。过程为 创建 JuiceFSRuntime -> 创建 Dataset -> 创建应用。
可以看到,在没有分布式缓存的情况下,拷贝相同的数据时间为 19m 6.45s。对于有分布式缓存的时候,拷贝时间缩短到了 1m11.16s,速度提升了 19 倍。
总结
本文介绍了在ECI 环境中,用户如何借助 Fluid 使用 JuiceFS,并使用 JuiceFS 的分布式缓存能力,来提升云上应用的数据访问速率。未来,JuiceFS 亦会在 CSI 中通过 Sidecar 的方式支持 Serverless 场景,用户可以通过更加原生的方式在 ECI 中使用 JuiceFS。