Fluid支援ACK Serverless叢集的資料訪問加速,您可以將Fluid的全部組件,包括Fluid控制器、緩衝系統組件和您的應用程式全部運行於ACK Serverless環境。本文介紹如何在ACK Serverless叢集上加速Job應用資料訪問。
前提條件
已建立ACK Serverless叢集,叢集的Kubernetes版本≥1.18且已安裝了CoreDNS組件。具體操作,請參見建立叢集。
已通過kubectl串連Kubernetes叢集。具體操作,請參見通過kubectl串連Kubernetes叢集。
已開通阿里雲Object Storage Service服務和儲存空間(Bucket)。具體操作,請參見開通OSS服務和控制台建立儲存空間。
使用限制
本功能與ACK Serverless叢集的虛擬節點調度功能衝突,暫不支援同時使用。關於虛擬節點調度功能的更多資訊,請參見開啟叢集虛擬節點調度策略。
部署Fluid控制面組件
若您已安裝開源Fluid,請卸載後再部署ack-fluid組件。
部署Fluid控制面組件。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在Helm頁面,單擊建立。
在基本資料設定精靈,配置相關參數,然後單擊下一步。
部分參數說明如下:
參數
說明
來源
選擇應用市場。
Chart
搜尋並選中ack-fluid。
說明Chart預設的發布名稱為ack-fluid、命名空間為fluid-system。單擊下一步時,若發布名稱或命名空間與Chart預設值不同,則會彈出請確認的提示框,提示您採用Chart預設的發布名稱或命名空間,建議您在提示框中單擊是。
在參數配置設定精靈,單擊確定。
執行以下命令,查看Fluid是否部署成功。
kubectl get pod -n fluid-system
預期輸出:
NAME READY STATUS RESTARTS AGE dataset-controller-d99998f79-dgkmh 1/1 Running 0 2m48s fluid-webhook-55c6d9d497-dmrzb 1/1 Running 0 2m49s
顯示類似輸出結果,說明Fluid部署成功。組件說明如下:
Dataset Controller:負責維護Fluid所引入的各個Dataset CRs(自訂資源)的完整生命週期。
Fluid Webhook:負責對使用者需要訪問資料的應用Pod進行Sidecar容器注入,無感知地協助使用者實現Serverless情境的資料訪問功能。
說明除了上述描述的兩個組件外,Fluid的控制面仍然包含了一些與管理緩衝系統(例如JindoFS、JuiceFS、Alluxio等)生命週期的控制器組件,這些組件在初始部署狀態下不會建立,僅當使用者指定需要使用某種緩衝系統時,與其相關的緩衝系統控制器組件Pod才會按需擴容。
ACK Serverless叢集資料訪問加速樣本
步驟一:上傳測試資料到OSS Bucket
步驟二:建立Fluid Dataset和Runtime資源
資料準備和上傳後,即可在Fluid中聲明上述待訪問的資料。您需要提交一個Dataset CR和一個Runtime CR。
Dataset CR:描述資料在外部儲存系統中的URL位置。
Runtime CR:描述緩衝系統及其具體配置。
執行以下命令,建立Secret資源,將訪問OSS Bucket所需的身份憑證資訊儲存於Secret中。
kubectl create secret generic oss-access-key \ --from-literal=fs.oss.accessKeyId=<access_key_id> \ --from-literal=fs.oss.accessKeySecret=<access_key_secret>
使用以下內容,建立dataset.yaml檔案,定義如下Dataset CR和Runtime CR。
本文選擇JindoFS作為緩衝系統後端(即對應JindoRuntime)。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo-dataset spec: mounts: - mountPoint: oss://<bucket_name>/<bucket_path> name: demo path: / options: fs.oss.endpoint: oss-<region>.aliyuncs.com # OSS Bucket訪問端點。 encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: oss-access-key key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: oss-access-key key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: demo-dataset spec: # 緩衝Worker節點數量。 replicas: 2 worker: podMetadata: annotations: # 禁用虛擬節點調度功能。 alibabacloud.com/burst-resource: eci_only # 選擇JindoFS Pod使用的執行個體規格。 k8s.aliyun.com/eci-use-specs: <eci_instance_spec> # 啟用執行個體鏡像緩衝,加速Pod啟動過程。 k8s.aliyun.com/eci-image-cache: "true" tieredstore: levels: # 以10 GiB的記憶體作為每個緩衝Worker節點的緩衝介質。 - mediumtype: MEM volumeType: emptyDir path: /dev/shm quota: 10Gi high: "0.99" low: "0.99"
部分參數說明如下:
參數
說明
mountPoint
表示掛載UFS的路徑,路徑格式為
oss://<oss_bucket>/<bucket_dir>
。路徑中不需要包含Endpoint資訊。如果您使用單掛載點,可以將
path
設定為/
。options
設定了OSS Bucket的訪問端點,可以配置為經典VPC內網訪問端點或外網訪問端點。
fs.oss.endpoint
表示OSS Bucket的Endpoint資訊,配置您的公網或私網地址。
配置私網地址可以提高資料訪問效能,但是需要您的K8s叢集所在地區和OSS地區相同。例如您的Bucket在杭州Region,則公網地址為
oss-cn-hangzhou.aliyuncs.com
,私網地址為oss-cn-hangzhou-internal.aliyuncs.com
。fs.oss.accessKeyId
表示OSS Bucket的AK ID資訊,有許可權訪問Bucket。
fs.oss.accessKeySecret
表示OSS Bucket的AK ID密鑰資訊,有許可權訪問Bucket。
replicas
表示建立JindoRuntime緩衝Worker Pod的數量,該數量將會影響分布式緩衝系統的最大緩衝可用容量。
worker.podMetadata.annotations
可以指定與ECI執行個體規格和ECI執行個體鏡像緩衝相關的資訊。
tieredstore.levels
可以通過
quota
欄位指定每個緩衝Worker Pod可提供的最大緩衝容量。tieredstore.levels.mediumtype
緩衝類型。僅支援HDD(機械硬碟)、SSD(固態硬碟)和MEM(記憶體)三種類型。
關於mediumtype的推薦配置,請參見策略二:選擇緩衝介質。
tieredstore.levels.volumeType
緩衝介質儲存卷類型。僅支援emptyDir和hostPath兩種類型,預設為hostPath類型。
如果使用記憶體或本機存放區的系統硬碟作為緩衝介質,推薦選擇emptyDir類型,避免節點上快取資料殘留,進而影響節點可用性。
如果使用本機存放區的資料盤作為緩衝介質,可使用hostPath類型,並配置path指定為宿主機上資料盤的掛載路徑。
關於volumeType的推薦配置,請參見策略二:選擇緩衝介質。
tieredstore.levels.path
表示緩衝路徑,目前只支援單個路徑。
tieredstore.levels.quota
表示緩衝的最大容量。例如100 Gi表示最大可用100 GiB。
tieredstore.levels.high
表示儲存容量上限。
tieredstore.levels.low
表示儲存容量下限。
執行以下命令,建立Dataset和JindoRuntime資源。
kubectl create -f dataset.yaml
執行以下命令,查看Dataset部署狀態。
Dataset CR和JindoRuntime CR建立約1~2分鐘後,緩衝系統將部署完畢,之後您可以查看到與緩衝系統以及後端儲存系統中資料的相關資訊。
kubectl get dataset demo-dataset
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE demo-dataset 1.16GiB 0.00B 20.00GiB 0.0% Bound 2m58s
輸出結果中顯示了Fluid Dataset的相關資訊,部分輸出項說明如下:
輸出項
說明
UFS TOTAL SIZE
OSS中資料集總大小。
CACHED
當前緩衝量。
CACHE CAPACITY
緩衝系統容量。
CACHED PERCENTAGE
資料集緩衝百分比。
PHASE
Dataset狀態。參數值為Bound,表示已成功部署。
(可選)步驟三:資料緩衝預熱
預先加熱資料可以提升首次資料的訪問效能。如果您希望在首次訪問資料時得到更好的效能體驗,建議您使用該功能。
使用以下內容,建立dataload.yaml檔案。
apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: data-warmup spec: dataset: name: demo-dataset namespace: default loadMetadata: true
執行以下命令,部署Dataload。
kubectl create -f dataload.yaml
預期輸出:
NAME DATASET PHASE AGE DURATION data-warmup demo-dataset Complete 99s 58s
由預期輸出得到,資料預熱耗時約為
58s
。
步驟四:建立Job應用訪問資料
您可以通過建立應用程式容器來使用JindoFS資料訪問加速服務,或者提交機器學習作業來體驗相關功能。本文以建立Job類型應用程式容器訪問OSS為例進行說明。
使用以下內容,建立job.yaml,定義如下Job資源。
apiVersion: batch/v1 kind: Job metadata: name: demo-app spec: template: metadata: labels: alibabacloud.com/fluid-sidecar-target: eci annotations: # 禁用虛擬節點調度功能。 alibabacloud.com/burst-resource: eci_only # 選擇應用Pod使用的執行個體規格。 k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 args: - -c - du -sh /data && time cp -r /data/ /tmp command: - /bin/bash volumeMounts: - mountPath: /data name: demo restartPolicy: Never volumes: - name: demo persistentVolumeClaim: claimName: demo-dataset backoffLimit: 4
執行以下命令,建立Job。
kubectl create -f job.yaml
執行以下命令,查看Job Pod開機記錄。
kubectl logs demo-app-jwktf -c demo
預期輸出:
1.2G /data real 0m0.992s user 0m0.004s sys 0m0.674s
由預期輸出得到,檔案拷貝時間
real
僅為0m0.992s
。
步驟五:環境清理
當您不再使用資料訪問功能時,請及時清理環境。
執行以下命令,刪除應用程式容器。
kubectl delete job demo-app
執行以下命令,刪除Dataset以及綁定的緩衝系統組件。
kubectl delete dataset demo-dataset
重要緩衝系統組件的清理可能會需要約1分鐘時間,請檢查緩衝系統各組件Pod被完整刪除後,再執行後續清理操作。
執行以下命令,回收Fluid控制面組件。
kubectl get deployments.apps -n fluid-system | awk 'NR>1 {print $1}' | xargs kubectl scale deployments -n fluid-system --replicas=0
當您再次使用資料訪問功能時,在建立Fluid Dataset和Runtime資源前,您需要先執行以下命令,建立Fluid控制面組件。
kubectl scale -n fluid-system deployment dataset-controller --replicas=1 kubectl scale -n fluid-system deployment fluid-webhook --replicas=1