全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:跨命名空间共享数据集

更新时间:Oct 16, 2024

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

  1. 创建一个2 GB的测试文件,本文以test为例。

  2. 将测试文件上传到阿里云OSS对应的Bucket。

    您可以通过OSS提供的客户端工具ossutil上传数据。具体操作,请参见安装ossutil

步骤二:创建共享的Dataset和缓存Runtime

使用JindoRuntime作为缓存运行时

  1. 创建share命名空间,用以创建共享的数据集和缓存Runtime。

    kubectl create ns share
  2. 执行以下命令,创建用于存储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.accessKeyIdfs.oss.accessKeySecret是用来访问OSS的AccessKey ID(AK)和AccessKey Secret(SK)。关于如何获取AK和SK,请参见获取AccessKey

  3. 创建并拷贝以下内容到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"
  4. 执行以下命令,创建JindoRuntime和Dataset。

    kubectl apply -f shared-dataset.yaml

    预期输出:

    dataset.data.fluid.io/shared-dataset created
    jindoruntime.data.fluid.io/shared-dataset created

    输出结果表明Dataset资源和JindoRuntime资源已被成功创建。

  5. 等待一段时间,执行以下命令,检查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作为缓存运行时

  1. 创建share命名空间,用以创建共享的数据集和缓存Runtime。

    kubectl create ns share
  2. 执行以下命令,创建用于存储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-keysecret-key是用来访问OSS的AccessKey ID(AK)和AccessKey Secret(SK)。关于如何获取AK和SK,请参见获取AccessKey

  3. 创建并拷贝以下内容到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"
  4. 执行以下命令,创建JuiceFSRuntime和Dataset。

    kubectl apply -f shared-dataset.yaml

    预期输出:

    dataset.data.fluid.io/shared-dataset created
    juicefsruntime.data.fluid.io/shared-dataset created

    输出结果表明Dataset资源和JuiceFSRuntime资源已被成功创建。

  5. 等待一段时间,执行以下命令,检查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

  1. 创建一个名为ref的命名空间,以创建引用的数据集ref-dataset

    kubectl create ns ref
  2. 创建并拷贝以下内容到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:是被引用的实际数据集的名称。

  3. 执行以下命令,将ref-dataset.yaml文件中的定义应用到集群中。

    kubectl apply -f ref-dataset.yaml        
  4. 创建并拷贝以下内容到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
  5. 执行以下命令,将app.yaml应用到集群中。

    kubectl apply -f app.yaml
  6. 执行以下命令,查看ref命名空间下Pod的状态。

    kubectl get pods -n ref -o wide

    如果Pod已处于Running状态,说明Pod已正常运行。

步骤三:验证数据的共享和缓存效果

  1. 执行以下命令,查看shareref命名空间下的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。

  2. 验证共享缓存效果。

    1. 执行以下命令,进入到名为nginx的Pod中。

      kubectl exec nginx -n ref -it -- sh
    2. 共享缓存验证。

      执行以下命令,列出/data目录下的内容。其中,/dataref命名空间下的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)能够无障碍地访问到这些数据。

    3. 测试缓存效果。

      说明

      以下内容为本次的测试结果,具体读取文件时长,请以具体情况为准。

      # 首次读取文件。
      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,表明共享缓存已生效。