Fluid利用Kubernetes的命名空间(Namespace)资源隔离特性,确保了数据集在计算任务与数据访问层面的安全控制,有效满足了跨团队数据隔离的需求。更进一步,Fluid实现了跨命名空间的数据访问及缓存资源共享,这意味着公开数据集能够在多个团队间复用,实现了单次缓存、多团队共享的高效模式,增强了数据的利用效率与管理的灵活性,为研发团队间的协同作业提供了便利。本文介绍如何配置跨命名空间共享数据集。
实现原理
ThinRuntime作为Fluid提供的一种可扩展的通用存储系统实现,允许您以低代码方式接入各类存储系统,复用Fluid提供的数据编排管理、运行时平台访问接入核心能力。Fluid利用ThinRuntime,将源命名空间下的Dataset作为接入的存储系统,与目标命名空间的Dataset关联,使得同一份缓存运行时可以共享给不同命名空间的应用来使用。
前提条件
已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群。
重要ack-fluid组件暂不支持在ContainerOS操作系统上使用。
已安装云原生AI套件并部署ack-fluid组件。
重要若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群。
步骤一:上传测试数据到OSS Bucket
步骤二:创建共享的Dataset和缓存Runtime
使用JindoRuntime作为缓存运行时
创建
share
命名空间,用以创建共享的数据集和缓存Runtime。kubectl create ns share
执行以下命令,创建用于存储OSS的访问凭证的Secret。
kubectl apply -f-<<EOF apiVersion: v1 kind: Secret metadata: name: dataset-secret namespace: share stringData: fs.oss.accessKeyId: <YourAccessKey ID> fs.oss.accessKeySecret: <YourAccessKey Secret> EOF
其中,
fs.oss.accessKeyId
和fs.oss.accessKeySecret
是用来访问OSS的AccessKey ID(AK)和AccessKey Secret(SK)。关于如何获取AK和SK,请参见获取AccessKey。创建并拷贝以下内容到shared-dataset.yaml文件中,用于创建一个Dataset和一个JindoRuntime来提供缓存服务。关于Dataset及JindoRuntime的详细配置信息,请参见JindoFS加速OSS文件访问。
# 创建一个Dataset,描述远端存储数据集和UFS的信息。 apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: shared-dataset namespace: share spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> # 请替换为实际的OSS文件存储地址。 options: fs.oss.endpoint: <oss_endpoint> # 请替换为实际的OSS endpoint地址。 name: hadoop path: "/" encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: dataset-secret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: dataset-secret key: fs.oss.accessKeySecret --- # 创建一个JindoRuntime,启动一个JindoFS的集群来提供缓存服务。 apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: shared-dataset namespace: share spec: replicas: 1 tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 4Gi high: "0.95" low: "0.7"
执行以下命令,创建JindoRuntime和Dataset。
kubectl apply -f shared-dataset.yaml
预期输出:
dataset.data.fluid.io/shared-dataset created jindoruntime.data.fluid.io/shared-dataset created
输出结果表明Dataset资源和JindoRuntime资源已被成功创建。
等待一段时间,执行以下命令,检查Dataset和JindoRuntime资源的部署情况。
kubectl get dataset,jindoruntime -nshare
预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE dataset.data.fluid.io/shared-dataset 1.16GiB 0.00B 4.00GiB 0.0% Bound 4m1s NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE jindoruntime.data.fluid.io/shared-dataset Ready Ready Ready 15m
输出结果表明,Dataset已经与JindoRuntime绑定。
使用JuiceFSRuntime作为缓存运行时
创建
share
命名空间,用以创建共享的数据集和缓存Runtime。kubectl create ns share
执行以下命令,创建用于存储OSS的访问凭证的Secret。
kubectl apply -f-<<EOF apiVersion: v1 kind: Secret metadata: name: dataset-secret namespace: share type: Opaque stringData: token: <JUICEFS_VOLUME_TOKEN> access-key: <OSS_ACCESS_KEY> secret-key: <OSS_SECRET_KEY> EOF
其中,
access-key
和secret-key
是用来访问OSS的AccessKey ID(AK)和AccessKey Secret(SK)。关于如何获取AK和SK,请参见获取AccessKey。创建并拷贝以下内容到shared-dataset.yaml文件中,用于创建一个Dataset和一个JuiceFSRuntime来提供缓存服务。
# 创建一个Dataset,描述远端存储数据集和UFS的信息。 apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: shared-dataset namespace: share spec: accessModes: ["ReadOnlyMany"] sharedEncryptOptions: - name: access-key valueFrom: secretKeyRef: name: dataset-secret key: access-key - name: secret-key valueFrom: secretKeyRef: name: dataset-secret key: secret-key - name: token valueFrom: secretKeyRef: name: dataset-secret key: token mounts: - name: <JUICEFS_VOLUME_NAME> mountPoint: juicefs:/// # 文件系统的挂载点为juicefs:///。 options: bucket: https://<OSS_BUCKET_NAME>.oss-<REGION_ID>.aliyuncs.com # 请替换为Bucket实际的URL地址,例如https://mybucket.oss-cn-beijing-internal.aliyuncs.com --- # 创建一个JuiceFSRuntime,启动一个JuiceFS的集群来提供缓存服务。 apiVersion: data.fluid.io/v1alpha1 kind: JuiceFSRuntime metadata: name: shared-dataset namespace: share spec: replicas: 1 tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 1Gi high: "0.95" low: "0.7"
执行以下命令,创建JuiceFSRuntime和Dataset。
kubectl apply -f shared-dataset.yaml
预期输出:
dataset.data.fluid.io/shared-dataset created juicefsruntime.data.fluid.io/shared-dataset created
输出结果表明Dataset资源和JuiceFSRuntime资源已被成功创建。
等待一段时间,执行以下命令,检查Dataset和JuiceFSRuntime资源的部署情况。
kubectl get dataset,juicefsruntime -nshare
预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE dataset.data.fluid.io/shared-dataset 2.32GiB 0.00B 4.00GiB 0.0% Bound 3d16h NAME WORKER PHASE FUSE PHASE AGE juicefsruntime.data.fluid.io/shared-dataset 3m50s
步骤三:创建引用的Dataset和Pod
创建一个名为
ref
的命名空间,以创建引用的数据集ref-dataset
。kubectl create ns ref
创建并拷贝以下内容到ref-dataset.yaml文件中,实现在
ref
命名空间下的ref-dataset
里,就可以访问到存储在其他命名空间中(本示例为share
命名空间)的特定数据集。重要Fluid限制了数据集只能被挂载到唯一的一个指定路径下,且mountPoint格式必须为
dataset://
。如果mountPoint
为其它格式时,会导致Dataset创建失败,以及spec
中的字段无效。apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: ref-dataset namespace: ref spec: mounts: - mountPoint: dataset://share/shared-dataset
mountPoint
参数说明如下:dataset://
:是协议前缀,表明这是一个数据集的引用。share
:被引用数据集所在的命名空间名称,说明了数据集的来源位置为share
命名空间。shared-dataset
:是被引用的实际数据集的名称。
执行以下命令,将
ref-dataset.yaml
文件中的定义应用到集群中。kubectl apply -f ref-dataset.yaml
创建并拷贝以下内容到app.yaml文件中,以在
ref
命名空间下,创建Pod引用ref-dataset
。apiVersion: v1 kind: Pod metadata: name: nginx namespace: ref spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 command: - "bash" - "-c" - "sleep inf" volumeMounts: - mountPath: /data name: ref-data volumes: - name: ref-data persistentVolumeClaim: claimName: ref-dataset
执行以下命令,将
app.yaml
应用到集群中。kubectl apply -f app.yaml
执行以下命令,查看
ref
命名空间下Pod的状态。kubectl get pods -n ref -o wide
如果Pod已处于Running状态,说明Pod已正常运行。
步骤三:验证数据的共享和缓存效果
执行以下命令,查看
share
和ref
命名空间下的Pod信息。kubectl get pods -n share kubectl get pods -n ref
预期输出:
# share命名快哦空间下的Pod。 NAME READY STATUS RESTARTS AGE shared-dataset-jindofs-fuse-ftkb5 1/1 Running 0 44s shared-dataset-jindofs-master-0 1/1 Running 0 9m13s shared-dataset-jindofs-worker-0 1/1 Running 0 9m13s # ref命名空间下的Pod。 NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 118s
输出结果表明,在
share
命名空间中,有三个与数据集相关的Pod正在运行。而在ref
命名空间下,只有一个名为nginx
的Pod在运行,并不存在与数据集相关的Pod。验证共享缓存效果。
执行以下命令,进入到名为
nginx
的Pod中。kubectl exec nginx -n ref -it -- sh
共享缓存验证。
执行以下命令,列出
/data
目录下的内容。其中,/data
是ref
命名空间下的Dataset的路径。du -sh /data/wwm_uncased_L-24_H-1024_A-16.zip
预期输出:
1.3G /data/wwm_uncased_L-24_H-1024_A-16.zip
输出结果表明尽管
config.json
文件实际存储在share
命名空间的数据集中,但通过Fluid的机制,ref
命名空间下的Pod(例如nginx
)能够无障碍地访问到这些数据。测试缓存效果。
说明以下内容为本次的测试结果,具体读取文件时长,请以具体情况为准。
# 首次读取文件。 sh-4.4# time cat /data/wwm_uncased_L-24_H-1024_A-16.zip > /dev/null real 0m1.166s user 0m0.007s sys 0m1.154s # 再次读取文件,共享缓存生效 sh-4.4# time cat /data/wwm_uncased_L-24_H-1024_A-16.zip > /dev/null real 0m0.289s user 0m0.011s sys 0m0.274s
测试的输出结果显示,首次读取文件用了1.166s,再次读取文件用了0.289s,读取文件时长缩短了0.877s,表明共享缓存已生效。