加速Argo任务数据访问

Fluid支持在Serverless场景下,通过JindoRuntime优化对象存储的访问,该访问支持缓存模式和无缓存模式。本文介绍如何使用缓存模式加速Argo任务数据访问。

前提条件

  • 已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群

    重要

    ack-fluid组件暂不支持在ContainerOS操作系统上使用。

  • 已安装云原生AI套件并部署ack-fluid组件。

    重要
    • 若您已安装开源Fluid,请卸载后再部署ack-fluid组件。

    • 由于云原生AI套件中组件ack-ai-pipelineack-workflow存在功能冲突,如果您想使用加速Argo任务数据访问功能,需要您在部署云原生AI套件时取消勾选Kubeflow Pipelines组件。

  • 已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群

  • 已开通阿里云对象存储(OSS)服务和存储空间(Bucket)。具体操作,请参见开通OSS服务控制台创建存储空间

使用限制

本功能与ACK弹性调度功能冲突,暂不支持同时使用。关于弹性调度功能的更多信息,请参见自定义弹性资源优先级调度

步骤一:上传测试数据到OSS Bucket

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

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

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

步骤二:创建Dataset和JindoRuntime

当K8s和OSS环境配置完毕后,您只需要耗费几分钟即可完成Dataset和JindoRuntime环境的部署。

  1. 使用以下内容,创建secret.yaml文件。

    在创建Dataset之前,您可以创建如下YAML文件,保存OSS的fs.oss.accessKeyIdfs.oss.accessKeySecret

    apiVersion: v1
    kind: Secret
    metadata:
      name: access-key
    stringData:
      fs.oss.accessKeyId: ****
      fs.oss.accessKeySecret: ****
  2. 执行以下命令,部署Secret。

    kubectl create -f secret.yaml
  3. 使用以下内容,创建dataset.yaml文件。

    YAML文件中包含以下两部分信息:

    • Dataset:描述远端存储数据集和UFS的信息。

    • JindoRuntime:启动一个JindoFS的集群来提供缓存服务。

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: serverless-data
    spec:
      mounts:
      - mountPoint: oss://<oss_bucket>/<bucket_dir>
        name: demo
        path: /
        options:
          fs.oss.endpoint: <oss_endpoint>
        encryptOptions:
          - name: fs.oss.accessKeyId
            valueFrom:
              secretKeyRef:
                name: access-key
                key: fs.oss.accessKeyId
          - name: fs.oss.accessKeySecret
            valueFrom:
              secretKeyRef:
                name: access-key
                key: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: serverless-data
    spec:
      replicas: 1
      tieredstore:
        levels:
          - mediumtype: MEM
            volumeType: emptyDir
            path: /dev/shm
            quota: 5Gi
            high: "0.95"
            low: "0.7"

    部分参数说明如下:

    参数

    说明

    mountPoint

    表示挂载UFS的路径,路径格式为oss://<oss_bucket>/<bucket_dir>。路径中不需要包含Endpoint信息。例如:oss://mybucket/path/to/dir

    如果您使用单挂载点,可以将path设置为/

    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的数量。

    mediumtype

    缓存类型。仅支持HDD(机械硬盘)、SSD(固态硬盘)和MEM(内存)三种类型。

    关于mediumtype的推荐配置,请参见策略二:选择缓存介质

    volumeType

    缓存介质存储卷类型。仅支持emptyDir和hostPath两种类型,默认为hostPath类型。

    • 如果使用内存或本地存储的系统盘作为缓存介质,推荐选择emptyDir类型,避免节点上缓存数据残留,进而影响节点可用性。

    • 如果使用本地存储的数据盘作为缓存介质,可使用hostPath类型,并配置path指定为宿主机上数据盘的挂载路径。

    关于volumeType的推荐配置,请参见策略二:选择缓存介质

    path

    表示缓存路径,目前只支持单个路径。

    quota

    表示缓存最大容量。例如100 Gi表示最大可用100 GiB。

    high

    表示存储容量上限。

    low

    表示存储容量下限。

    重要

    数据访问模式默认为只读模式,如果您想使用读写模式,请参考配置数据集访问模式

  4. 执行以下命令,部署JindoRuntime和Dataset。

    kubectl create -f dataset.yaml
  5. 执行以下命令,查看Dataset的部署情况。

    kubectl get dataset serverless-data

    预期输出:

    NAME              UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    serverless-data   1.16GiB          0.00B    5.00GiB          0.0%                Bound   2m8s

    由预期输出得到,PHASEBound,表示Dataset部署成功。

  6. 执行以下命令,查看JindoRuntime的部署情况。

    kubectl get jindo serverless-data

    预期输出:

    NAME              MASTER PHASE   WORKER PHASE   FUSE PHASE   AGE
    serverless-data   Ready          Ready          Ready        2m51s

    由预期输出得到,FUSEReady,表示JindoRuntime部署成功。

(可选)步骤三:数据预热

预先加热数据可以提升首次数据的访问性能。如果您希望在首次访问数据时得到更好的性能体验,建议您使用该功能。

  1. 使用以下内容,创建dataload.yaml文件。

    apiVersion: data.fluid.io/v1alpha1
    kind: DataLoad
    metadata:
      name: serverless-data-warmup
    spec:
      dataset:
        name: serverless-data
        namespace: default
      loadMetadata: true
  2. 执行以下命令,部署Dataload。

    kubectl create -f dataload.yaml
  3. 执行以下命令,查看数据预热的进度。

    kubectl get dataload

    预期输出:

    NAME                     DATASET           PHASE      AGE     DURATION
    serverless-data-warmup   serverless-data   Complete   2m49s   45s

    由预期输出得到,数据预热耗时为45s

  4. 执行以下命令,查看缓存结果。

    kubectl get dataset

    预期输出:

    NAME              UFS TOTAL SIZE   CACHED    CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    serverless-data   1.16GiB          1.16GiB   5.00GiB          100.0%              Bound   5m20s

    由预期输出得到,未进行数据预热时,CACHED0.0%,数据预热后,CACHED100.0%

步骤四:创建Argo类型任务访问OSS

  1. 使用以下内容,创建workflow.yaml文件。

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: serverless-workflow-
    spec:
      entrypoint: serverless-workflow-example
      volumes:
      - name: datadir
        persistentVolumeClaim:
          claimName: serverless-data
    
      templates:
      - name: serverless-workflow-example
        steps:
        - - name: copy
            template: copy-files
        - - name: check
            template: check-files
    
      - name: copy-files
        metadata:
          labels:
            alibabacloud.com/fluid-sidecar-target: eci
            alibabacloud.com/eci: "true"
          annotations:
             k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge
        container:
          image: debian:buster
          command: [bash, -c]
          args: ["time cp -r /data/ /tmp"]
          volumeMounts:
          - name: datadir
            mountPath: /data
    
      - name: check-files
        metadata:
          labels:
            alibabacloud.com/fluid-sidecar-target: eci
            alibabacloud.com/eci: "true"
          annotations:
             k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge
        container:
          image: debian:buster
          command: [bash, -c]
          args: ["du -sh /data; md5sum /data/*"]
          volumeMounts:
          - name: datadir
            mountPath: /data
  2. 执行以下命令,创建工作流。

    kubectl create -f workflow.yaml
  3. 执行以下命令,查看启动日志。

    kubectl logs serverless-workflow-g5knn-3271897614

    预期输出:

    real    0m1.948s
    user    0m0.000s
    sys     0m0.668s

    由预期输出得到,文件拷贝时间real0m1.948s。使用无缓存模式加速Argo任务数据访问,文件拷贝时间为0m24.966s。缓存模式相比无缓存模式,速度提升了约13倍。

步骤五:清理环境

当您不再使用数据访问功能时,请及时清理环境。具体操作如下:

  1. 执行以下命令,删除应用容器。

    kubectl delete workflow serverless-workflow-g5knn
  2. 执行以下命令,删除Dataset。

    kubectl delete dataset serverless-data