Fluid支持ASK集群的数据访问加速,您可以将Fluid的全部组件,包括Fluid控制器、缓存系统组件和您的应用程序全部运行于ASK环境。本文介绍如何在ASK集群上加速Job应用数据访问。

前提条件

部署Fluid控制面组件

  1. 部署Fluid控制面组件。
    1. 登录容器服务管理控制台,在左侧导航栏中选择集群
    2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择应用 > Helm
    3. Helm页面,单击创建
    4. 基本信息配置向导,配置相关参数,然后单击下一步
      部分参数说明如下:
      参数 说明
      来源 选择应用市场
      Chart 搜索并选中ack-fluid
      说明 Chart默认的发布名称为ack-fluid、命名空间为fluid-system。单击 下一步时,若发布名称或命名空间与Chart默认值不同,则会弹出 请确认的提示框,提示您采用Chart默认的发布名称或命名空间,建议您在提示框中单击
    5. 参数配置配置向导,单击确定
  2. 执行以下命令,查看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才会按需扩容。

ASK数据访问加速示例

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

  1. 创建一个2 GB的测试文件,本文以test为例。
  2. 将测试文件上传到阿里云OSS对应的Bucket。
    您可以通过OSS提供的客户端工具ossutil上传数据。具体操作,请参见 下载和安装

步骤二:开启Sidecar注入模式

  1. 执行以下命令,为目标命名空间开启Webhook机制,支持Sidecar注入模式。
    kubectl label namespace default fluid.io/enable-injection=true
  2. 执行以下命令,查看命名空间的标签。
    kubectl get namespace default --show-labels
    预期输出:
    NAME      STATUS   AGE     LABELS
    default   Active   5h28m   fluid.io/enable-injection=true
    由预期输出得到,default命名空间的 LABELSfluid.io/enable-injection=true,表示Sidecar注入模式开启成功。

步骤三:创建Fluid Dataset和Runtime资源

数据准备和上传后,即可在Fluid中声明上述待访问的数据。您需要提交一个Dataset CR和一个Runtime CR。
  • Dataset CR:描述数据在外部存储系统中的URL位置。
  • Runtime CR:描述缓存系统及其具体配置。
  1. 执行以下命令,创建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>
  2. 使用以下内容,创建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:
            # 选择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 表示缓存类型。

    创建JindoRuntime模板样例时,JindoFS目前只支持HDDSSDMEM三者中的某一种缓存类型。

    tieredstore.levels.path 表示缓存路径,目前只支持单个路径。
    tieredstore.levels.quota 表示缓存最大容量。例如100 Gi表示最大可用100 GiB。
    tieredstore.levels.high 表示存储容量上限。
    tieredstore.levels.low 表示存储容量下限。
  3. 执行以下命令,创建Dataset和JindoRuntime资源。
    kubectl create -f dataset.yaml
  4. 执行以下命令,查看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,表示已成功部署。

(可选)步骤四:数据缓存预热

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

  1. 使用以下内容,创建dataload.yaml文件。
    apiVersion: data.fluid.io/v1alpha1
    kind: DataLoad
    metadata:
      name: data-warmup
    spec:
      dataset:
        name: demo-dataset
        namespace: default
      loadMetadata: true
  2. 执行以下命令,部署Dataload。
    kubectl create -f dataload.yaml
    预期输出:
    NAME          DATASET        PHASE      AGE   DURATION
    data-warmup   demo-dataset   Complete   99s   58s
    由预期输出得到,数据预热耗时约为 58s

步骤五:创建Job应用访问数据

您可以通过创建应用容器来使用JindoFS数据访问加速服务,或者提交机器学习作业来体验相关功能。本文以创建Job类型应用容器访问OSS为例进行说明。

  1. 使用以下内容,创建job.yaml,定义如下Job资源。
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: demo-app
    spec:
      template:
        metadata:
          labels:
            alibabacloud.com/fluid-sidecar-target: eci
          annotations:
            k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge
        spec:
          containers:
            - name: demo
              image: debian:buster
              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
  2. 执行以下命令,创建Job。
    kubectl create -f job.yaml
  3. 执行以下命令,查看Job Pod启动日志。
    kubectl logs demo-app-jwktf -c demo
    预期输出:
    1.2G    /data
    
    real    0m0.992s
    user    0m0.004s
    sys     0m0.674s
    由预期输出得到,文件拷贝时间 real仅为 0m0.992s

步骤六:环境清理

当您不再使用数据访问功能时,请及时清理环境。

  1. 执行以下命令,删除应用容器。
    kubectl delete job demo-app
  2. 执行以下命令,删除Dataset以及绑定的缓存系统组件。
    kubectl delete dataset demo-dataset
    重要 缓存系统组件的清理可能会需要约1分钟时间,请检查缓存系统各组件Pod被完整删除后,再执行后续清理操作。
  3. 执行以下命令,回收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