AI数据加速引擎插件
在处理AI和大数据任务时,Kubernetes面临计算存储分离导致的高延迟和带宽浪费、数据管理不足、存储接口碎片化,以及缺乏智能数据感知与调度等核心挑战。为此,CCE Standard/Turbo集群基于Fluid提供AI数据加速引擎插件。该插件提供数据集抽象、数据编排和应用编排等能力,旨在通过透明的数据管理和优化调度,帮助AI和大数据应用高效利用任何存储的数据,而无需修改现有应用。关于Fluid的更多信息请参见Fluid数据加速引擎概述。
前提条件
- 已创建一个CCE Standard/Turbo集群,且集群版本为v1.28及以上,具体操作请参见购买Standard/Turbo集群。
- 已开通对象存储服务OBS和分布式缓存服务DCS。
约束与限制
计费说明
- 安装插件时不涉及额外费用。
- 在使用示例中,需要购买Redis实例和OBS桶,涉及一定费用,具体请参见Redis价格计算器和OBS价格计算器。
安装插件
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在右侧找到AI数据加速引擎插件,单击“安装”。
- 在“插件安装”页面右下角单击“安装”。AI数据加速引擎插件状态变为“运行中”时,则说明安装成功。
组件说明
容器组件 |
说明 |
资源类型 |
---|---|---|
application-controller |
负责使用数据集的应用Pod的调度和运行。通过Runtime获取缓存信息,将使用数据集的Pod优先调度到具有数据缓存的节点。 |
Deployment |
csi-nodeplugin-fluid |
表示AI数据加速引擎插件的存储组件,以容器化方式启动,并与业务容器解耦,为集群中的存储资源提供可观测性。 |
DaemonSet |
dataset-controller |
负责数据集的生命周期管理,包括绑定缓存引擎。 |
Deployment |
fluid-crd-upgrader |
表示AI数据加速引擎插件的CRD升级组件,在插件升级场景中将根据版本更新CRD。 |
Job |
fluid-webhook |
在无法使用csi-plugin的环境中,Webhook负责将PVC替换为FUSE Sidecar,并确保FUSE容器先启动。 |
Deployment |
juicefsruntime-controller |
用于管理和调度与JuiceFS运行时环境相关的资源,包括计算任务和运行时所需的配置,例如根据负载情况自动扩展或缩减缓存节点。 |
Deployment |
使用示例
JuiceFS采用业务数据与元数据分离存储的架构。在本示例中,业务Pod使用的数据存储在OBS中,而JuiceFS生成的元数据则存放在Redis服务中。本示例将展示如何通过JuiceFS将存储在OBS中的数据抽象为数据集,并通过 JuiceFSRuntime 提供给工作负载使用。整体流程如下:
操作步骤 |
说明 |
---|---|
作为底层数据源,存储待Pod使用的业务数据。 |
|
用于存储JuiceFS生成的元数据。 |
|
作为JuiceFS访问OBS桶和Redis实例的身份凭证,以便读取和存放相关数据。 |
|
用来定义和管理数据的来源和访问策略,确保数据能够正确且高效地被集群中的工作负载使用。 Dataset资源创建完成后,系统将自动创建Worker Pod,用于初始化OBS数据,将其转化为JuiceFS的目录格式。 |
|
将JuiceFS存储卷以高效、可扩展的方式集成到集群中,并提供数据缓存、访问加速和自动化管理能力,确保应用程序能够高效地访问和使用存储在Dataset中的数据。 CCE仅支持CSIMode,因此Dataset中的数据通过FUSE Pod的形式进行缓存,且该FUSE Pod中存储的数据将以PVC的形式挂载在业务Pod中使用。正常情情况下,JuiceFSRuntime创建完成后,FUSE Pod、PV以及PVC应自动创建,但FUSE Pod默认为懒启动模式,将随业务Pod一同创建。 |
|
FUSE Pod将随业务Pod一同创建,其内部数据将通过PVC形式供业务Pod使用。 |
- 创建OBS桶,用于存储业务数据。
- 登录OBS管理控制台,在左侧导航栏中选择“对象存储”。
- 在页面右上角单击“创建桶”,请根据需求配置相关参数,具体示例如下。
图1 创建桶
表3 参数说明 参数
示例
说明
桶名称
juicefs-data
表示桶的名称,不能与已有桶的名称重复,包括其他用户创建的桶。桶创建成功后,桶名称不支持修改。
命名要求如下:
- 长度范围为3到63个字符,支持小写字母、数字、中划线(-)、英文句号(.)。
- 禁止两个英文句号(.)相邻,禁止英文句号(.)和中划线(-)相邻,禁止以英文句号(.)和中划线(-)开头或结尾。
- 禁止使用IP地址。
数据冗余存储策略
多AZ存储
表示桶的数据冗余存储策略,创建成功后不支持修改。
- 多AZ存储:数据冗余存储至多个可用区(AZ),可靠性更高。
- 单AZ存储:数据仅存储在单个可用区(AZ),成本更低。
多AZ和单AZ的性能对比请参见存储类别对比。
存储类别
标准存储
表示桶的存储类别。不同的存储类别可以满足客户业务对存储性能、成本的不同诉求。
- 标准存储:适用于有大量热点文件或小文件,且需要频繁访问(平均一个月多次)并快速获取数据的业务场景。
- 低频访问存储:适用于不频繁访问(平均一年少于12次),但需要快速获取数据的业务场景。
- 归档存储:适用于很少访问(平均一年一次),且对数据获取速率要求不高的业务场景。
- 深度归档存储:适用于很少访问,访问频率低于归档存储,且对数据获取速率要求不高的业务场景。
更多详情请参见存储类别。
桶策略
私有
表示桶的读写权限控制。
- 私有:除桶ACL授权外的其他用户无桶的访问权限。
- 公共读:任何用户都可以对桶内对象进行读操作。
- 公共读写:任何用户都可以对桶内对象进行读/写/删除操作。
- 复制桶策略:复制源桶的桶策略。当且仅当您选择了源桶时,该选项处于可选状态。
- 参数配置完成后,右下角单击“立即创建”。
- 桶创建完成后,在“桶列表”中单击新建的桶名称。在“概览”页的“域名信息”模块,您可以看到当前桶的“访问域名”。该访问域名后续将用于配置JuiceFS访问Secret。
图2 查看访问域名
- 创建Redis实例,用于存储JuiceFS产生的元数据,如文件/目录属性、数据块映射等信息。
- 进入购买缓存实例页面,切换至“快速购买”页签,请根据需求配置相关参数,具体示例如下。本示例仅提供必要参数说明,更多参数信息请参见购买Redis实例。
图3 创建Redis实例
表4 参数说明 参数
示例
说明
规格配置
基础版-16GB
包含产品类型-内存规格、版本号、实例类型等信息,请根据需求选择。各规格的具体区别,具体请参见购买Redis实例。
虚拟私有云
vpc-default
请选择与CCE集群相同的虚拟私有云。
子网
subnet-observe
请选择已创建的子网。
- 参数配置完成后,在右下角单击“立即购买”。规格确认无误后,右下角单击“提交”。当对应的Redis实例状态变为运行中时,则说明创建成功。
- 单击已创建的Redis实例名称,在“概览”页右侧的“连接信息”模块中,您可以看到其IP地址。该IP地址后续将用于配置JuiceFS的访问Secret。
图4 连接信息
- 进入购买缓存实例页面,切换至“快速购买”页签,请根据需求配置相关参数,具体示例如下。本示例仅提供必要参数说明,更多参数信息请参见购买Redis实例。
- 在已有的ECS中安装kubectl,并使用kubectl连接集群,具体操作请参见通过kubectl连接集群。
- 依次执行以下命令,创建JuiceFS访问OBS桶和Redis实例的Secret。
- 执行以下命令,创建Secret的YAML文件。
vim juicefs-secret.yaml
文件内容如下:
apiVersion: v1 kind: Secret metadata: name: juicefs-secret-test3 type: Opaque stringData: name: juicefs-obs-test3 metaurl: "redis://192.168.0.137:6379/0" storage: obs bucket: "https://<OBS桶访问地址>" access-key: <Access Key Id> secret-key: <Secret Access Key> envs: "{TZ: Asia/Shanghai}" # 设置Mount Pod时区,默认为UTC
表5 参数说明 参数
示例
说明
metaurl
"redis://192.168.0.137:6379/0"
用于指定元数据存储位置,Redis实例IP地址的获取方式请参见3。
storage
obs
用于指定文件系统要使用的存储类型,华为云场景固定为obs。
bucket
"https://<OBS桶访问地址>"
用于指定OBS桶的存储访问地址,具体请参见4。
access-key
<Access Key Id>
请填写IAM用户的Access Key Id,作为访问存储时的身份认证信息。
secret-key
<Secret Access Key>
请填写IAM用户的Secret Access Key,作为访问存储时的身份认证信息。
- 执行以下命令,创建上述Secret。
kubectl create -f juicefs-secret.yaml
回显结果如下,则说明创建成功。
secret/juicefs-secret-test3 created
- 执行以下命令,创建Secret的YAML文件。
- 依次执行以下命令,创建Dataset资源,用于定义数据来源。
- 执行以下命令,创建Dataset的YAML文件。
vim dataset.yaml
文件内容如下,本示例仅提供部分参数说明。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: jfsdemo spec: mounts: # 仅支持设置一个mount,若需使用多个,请创建多个Dataset资源一致对应 - name: juicefs-obs-test3 mountPoint: "juicefs:///demo" options: bucket: "https://OBS访问域名" storage: "obs" # 固定为"obs" encryptOptions: # 为Dataset配置存储访问凭证 - name: metaurl valueFrom: secretKeyRef: name: juicefs-secret-test3 key: metaurl - name: access-key valueFrom: secretKeyRef: name: juicefs-secret-test3 key: access-key - name: secret-key valueFrom: secretKeyRef: name: juicefs-secret-test3 key: secret-key
表6 Dataset参数说明 参数
示例
说明
mounts.name
juicefs-obs-test3
指定OBS桶内用于存储的该数据集的对象名。
mountPoint
"juicefs:///demo"
表示JuiceFS中的子目录,即用户在JuiceFS文件系统中存储数据的目录,以“juicefs://”开头,如“juicefs:///demo”为JuiceFS文件系统的“/demo”子目录,“juicefs:///”则表示JuiceFS文件系统的根目录。
encryptOptions
-
用于指定JuiceFS认证信息,需要与上一步创建的Secret中的key一致。
- 执行以下命令,创建上述Dataset。
kubectl create -f dataset.yaml
回显结果如下,则说明创建成功。
dataset.data.fluid.io/jfsdemo created
- Dataset资源创建完成后,AI数据加速引擎插件将自动创建Worker Pod,用于初始化OBS数据,将其转化为JuiceFS的目录格式。您可以执行以下命令,查看Worker Pod是否创建成功。
kubectl get pod
回显结果如下,Worker Pod已创建成功。
NAME READY STATUS RESTARTS AGE jfsdemo-worker-0 1/1 Running 0 15h
- 执行以下命令,创建Dataset的YAML文件。
- 依次执行以下命令,创建JuiceFSRuntime,确保应用程序能够高效地访问和使用存储在Dataset中的数据。JuiceFSRuntime和Dataset是一对一的关系,一个JuiceFSRuntime只能绑定一个Dataset,且二者通过同名来绑定。如果您需要使用多个底层数据源,则需要创建多个JuiceFSRuntime和Dataset。
- 执行以下命令,创建JuiceFSRuntime的YAML文件。
vim runtime.yaml
文件内容如下,本示例仅提供部分参数说明。
apiVersion: data.fluid.io/v1alpha1 kind: JuiceFSRuntime metadata: name: jfsdemo spec: replicas: 1 tieredstore: levels: - mediumtype: SSD path: /cache quota: 40960 low: "0.1"
表7 JuiceFSRuntime参数说明 参数
示例
说明
mediumtype
SSD
用于指定缓存目录所使用的存储设备类型,取值为MEM、SSD、HDD。
这个字段仅为一个“标记”,未必代表底层存储就是内存、SSD 或机械硬盘,实际物理存储介质取决于path的设置。
说明:如果取值MEM,则AI数据加速引擎插件会根据quota大小自动设置容器的内存资源声明,保证容器的memory requests。
path
/cache
表示本地缓存的存储路径,
多盘缓存时用“:”分隔多个目录,可设置为/dev/shm以使用内存设备。
quota
40960
每个Worker容器(也就是缓存集群成员节点)的最大缓存容量,单位为MiB,将该值乘以Replicas(容器数量),就能得到整个缓存集群的总体可用空间。
low
"0.1"
表示缓存盘的最小剩余空间占比,默认0.2。示例中的0.1表示最多可以使用缓存盘90%的空间。
- 执行以下命令,创建上述JuiceFSRuntime。
kubectl create -f runtime.yaml
回显结果如下,则说明创建成功。
juicefsruntime.data.fluid.io/jfsdemo created
- 执行以下命令,创建JuiceFSRuntime的YAML文件。
- 依次执行以下步骤,确认已创建的Dataset和JuiceFSRuntime是否正常。
- 执行以下命令,查看JuiceFSRuntime的状态。
kubectl get juicefs
回显结果如下,该JuiceFSRuntime的WORKER PHASE处于ready状态,则说明jfsdemo运行正常。
JuiceFs的FUSE Pod为懒启动模式,在Pod需要使用时才会创建。
NAME WORKER PHASE FUSE PHASE AGE jfsdemo Ready Ready 25h
- 执行以下命令,查看Dataset的状态。
kubectl get dataset
回显结果如下,该Dataset处于Bound状态,则说明可以正常使用。
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE jfsdemo 0.00B 0.00B 40.00KiB 0.0% Bound 25h
- 执行以下命令,查看JuiceFSRuntime的状态。
- 在Dataset和JuiceFSRuntime就绪后,AI数据加速引擎插件会自动为Dataset创建PV和PVC供负载使用,请执行以下命令查看相关信息。
- 执行以下命令,查看PVC信息。
kubectl get pvc
回显结果如下:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE jfsdemo Bound default-jfsdemo 100Pi RWX fluid <unset> 25h
- 执行以下命令,查看PV信息。
kubectl get pv
回显结果如下:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE default-jfsdemo 100Pi RWX Retain Bound default/jfsdemo fluid <unset> 25h
由上述回显可知,PVC和PV已自动绑定,可以直接挂载在Pod中使用。
- 执行以下命令,查看PVC信息。
- 依次执行以下命令,创建业务Pod,并直接使用上述PVC和PV。
- 执行以下命令,创建工作负载的YAML文件。
vim pod.yaml
文件内容如下:
apiVersion: v1 kind: Pod metadata: name: demo-app spec: containers: - name: demo image: nginx volumeMounts: - mountPath: /data name: demo # 待挂载的volume名称 volumes: - name: demo persistentVolumeClaim: claimName: jfsdemo # 已自动创建的PVC
- 执行以下命令,创建上述Pod。
kubectl create -f pod.yaml
回显结果如下,则说明创建成功。
pod/demo-app created
- 执行以下命令,创建工作负载的YAML文件。
- 执行以下命令,查看Pod以及FUSE Pod的状态。
kubectl get pod
回显结果如下,Pod以及FUSE Pod都已启动成功,此时PVC已正常挂载。
NAME READY STATUS RESTARTS AGE demo-app 1/1 Running 0 3s jfsdemo-fuse-twwdh 1/1 Running 0 3s jfsdemo-worker-0 1/1 Running 0 17h
相关文档
您可以通过Fluid数据加速引擎概述快速了解Fluid的基础知识。
版本记录
插件版本 |
支持的集群版本 |
更新特性 |
社区版本 |
---|---|---|---|
1.0.5 |
v1.28 v1.29 v1.30 v1.31 |
CCE Standard/Turbo集群支持使用AI数据加速引擎插件 |