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組件。
未安裝雲原生AI套件:安裝時開啟Fluid資料加速。具體操作,請參見安裝雲原生AI套件。
已安裝雲原生AI套件:在Container Service管理主控台的雲原生AI套件頁面部署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,表明共用快取已生效。