Skip to main content

阿里云 ECI 环境通过 Fluid 使用 JuiceFS

Fluid 是一款 Kubernetes 原生的分布式数据集编排和加速引擎,v0.8 版本支持 ECI 应用,并将 JuiceFS Runtime Controller 设置为默认安装,用户可以更加方便地通过 Fluid 在 ECI 环境中使用 JuiceFS。

Fluid 如何支持 ECI 应用

Fluid 通过自动识别用户应用中使用的 Fluid PVC(PersistentVolumeClaim),将不同缓存 Runtime 的 FUSE 客户端以 Sidecar 的形式注入到 Serverless Pod 中。JuiceFS 客户端以 Sidecar 容器的方式单独为应用容器提供挂载服务,且与应用容器同生命周期,用户只需要为应用运行时的资源付费即可。

同时,为了提高数据缓存能力,独立缓存集群可以长时间运行,只需单独开几台 ECS 节点用以运行 worker pod,为 Sidecar 提供分布式缓存服务。

整体架构如下图。

JuiceFS 如何在 Fluid 中工作

通过 Fluid 我们可以快速搭建 JuiceFS 的环境,构建出 JuiceFS 独立缓存集群,缓存集群以 StatefulSet 的形式运行在 ECS 节点中,提供分布式缓存服务,而 FUSE 客户端以 Sidecar 的方式运行在业务 Pod 中,业务 Pod 则运行在 ECI 节点上。

使用流程

准备环境

申请启用 Fluid on ECI

目前 Fluid on ECI 还处于公测阶段,默认没有开启,但我们可以申请 AI 套件免费体验席位:https://survey.aliyun.com/apps/zhiliao/DNgsKoIo1

申请完毕后,就可以进入下一步流程了。

安装 ACK 集群

首先需要创建一个 ACK 版集群,且集群的 Kubernetes 版本不低于1.18。具体操作步骤,请参见该文档:https://help.aliyun.com/document_detail/176833.htm#task-skz-qwk-qfb

安装 Fluid

在 ACK 集群中选择应用 -> 云原生 AI 套件,点击一键部署安装云原生 AI 套件。

安装时选择 fluid 数据加速:

安装虚拟节点

在 Kubernetes 集群中,ECI 应用会被调度到一个虚拟节点,实际运行在一个临时的 ECS 上。这一步我们需要安装虚拟节点,在集群的组件管理中,安装 “ACK Virtual Node” :

开启 Sidecar 注入模式

给对应的 namespace 打上标签:fluid.io/enable-injection=true,以开启 Fluid 的 Sidecar 注入功能:

使用 JuiceFS

JuiceFS 采用元数据和数据分开存储的设计,元数据会被存储在元数据服务引擎中,数据会被存储在对象存储中,对象存储需要用户自己提供。由于目前只有云服务版 JuiceFS 提供分布式缓存服务,本文以云服务版 JuiceFS 为例。

创建 Secret

第一步在 ACK 集群中创建保密字典,将需要密文存储的 token(JuiceFS 控制台管理的 volume token)和对象存储的 accesskey 和 secretkey 填入。

创建 JuiceFSRuntime

第二步在自定义资源界面,使用 yaml 创建 JuiceFSRuntime,并指定副本数及缓存地址等信息。

创建 Dataset

第三步创建 Dataset,在 options 中填入对象存储的 bucket,在 encryptOptions 中填入引用 secret 的值:

创建好后,可以在容器组页面看到有 worker pod 创建出来:

这 5 个 worker 就组成了一个 JuiceFS 独立缓存集群,运行在 ECS 节点上,为客户端提供缓存服务。

缓存加速

在本文的示例中,已提前在 JuiceFS 中准备好 11G 的文件。缓存集群创建好后,我们可以先进行缓存预热,创建 Dataload,指定上一步创建的 Dataset:

「任务」页面的 jfs-load-loader-job 显示完成,即代表缓存集群预热完成。

创建应用

最后我们可以创建应用了,在应用的数据卷中指定与 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 倍。