全部產品
Search
文件中心

Container Service for Kubernetes:跨命名空間共用資料集

更新時間:Oct 25, 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,表明共用快取已生效。