加速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. 使用以下内容,创建resource.yaml文件。

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

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

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

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: serverless-data
    spec:
      mounts:
      - mountPoint: oss://large-model-sh/
        name: demo
        path: /
        options:
          fs.oss.endpoint: oss-cn-shanghai.aliyuncs.com
        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
      accessModes:
        - ReadWriteMany
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: serverless-data
    spec:
      master:
        disabled: true
      worker:
        disabled: true

    部分参数说明如下:

    参数

    说明

    mountPoint

    表示挂载UFS的路径,路径格式为oss://<oss_bucket>/<bucket_dir>

    路径中不需要包含Endpoint信息。如果您直接访问Bucket,可以不配置<bucket_dir>

    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。

    accessModes

    表示支持的读写模式。读写模式包括ReadWriteOnceReadOnlyManyReadWriteManyReadWriteOncePod,默认为ReadOnlyMany

    disabled

    Master和Worker都配置为true,表示开启无缓存模式。

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

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

    kubectl get dataset serverless-data

    预期输出:

    NAME              UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    serverless-data                                                                  Bound   1d

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

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

    kubectl get jindo serverless-data

    预期输出:

    NAME              MASTER PHASE   WORKER PHASE   FUSE PHASE   AGE
    serverless-data                                 Ready        3m41s

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

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

您可以通过创建应用容器来使用JindoFS加速服务,或者提交机器学习作业来体验相关功能。本文以创建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-85sbr-4093682611

    预期输出:

    real    0m24.966s
    user    0m0.009s
    sys     0m0.677s

    由预期输出得到,文件的拷贝时间real0m24.966s。拷贝时间取决于网络延时和带宽,如果您希望加速数据访问,请参见使用缓存模式加速Argo任务数据访问

  4. 检查通过Fluid读取的文件和本地文件是否一致。

    1. 执行以下命令,查看通过Fluid读取的文件MD5校验值。

      kubectl logs serverless-workflow-85sbr-1882013783

      预期输出:

      1.2G    /data
      871734851bf7d8d2d1193dc5f1f692e6  /data/wwm_uncased_L-24_H-1024_A-16.zip
    2. 执行以下命令,查看本地文件MD5校验值。

      md5sum ./wwm_uncased_L-24_H-1024_A-16.zip

      预期输出:

      871734851bf7d8d2d1193dc5f1f692e6  ./wwm_uncased_L-24_H-1024_A-16.zip

      由预期输出得到,MD5校验值一致,表示通过Fluid读取的文件和本地文件一致。

步骤四:清理环境

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

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

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

    kubectl delete dataset serverless-data