Serverless场景Fluid进阶配置

Fluid支持在Serverless场景下,通过JindoRuntime优化对象存储的数据访问。本文介绍如何在Serverless场景下使用Fluid的进阶配置,包括设置应用Pod退出延迟和应用容器数据访问挂载点检查。

前提条件

设置应用Pod退出延迟

Fluid采用Sidecar容器注入的方式,为Pod中的应用容器提供Serverless场景下的对象存储的数据访问支持。在默认配置下,从应用容器退出到Pod优雅退出存在约30秒的延迟时间。为减少成本,您可以通过terminationGracePeriodSeconds字段控制Pod优雅退出时长,从而缩短上述延迟时间。

说明

terminationGracePeriodSeconds字段的配置会影响到应用容器的优雅退出时长,请您根据实际场景设置相对合理的时长。

示例一:Job类型应用

设置最小terminationGracePeriodSeconds的Job类型应用的YAML示例如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-app
spec:
  terminationGracePeriodSeconds: 0
  template:
    metadata:
      labels:
        alibabacloud.com/fluid-sidecar-target: eci
        alibabacloud.com/eci: "true"
    spec:
      containers:
        - name: demo
          image: debian:buster
          args:
            - -c
            - time cp -r /data/ /tmp
          command:
            - /bin/bash
          volumeMounts:
            - mountPath: /data
              name: demo
      restartPolicy: Never
      volumes:
        - name: demo
          persistentVolumeClaim:
            claimName: serverless-data
  backoffLimit: 4

上述YAML中,spec.terminationGracePeriodSeconds: 0表示Job Pod的退出延时为0秒。

示例二:Argo类型应用

设置最小terminationGracePeriodSeconds的Argo类型应用的YAML示例如下:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: serverless-workflow-
spec:
  podSpecPatch: '{"terminationGracePeriodSeconds": 0}'
  entrypoint: serverless-workflow-example
  volumes:
  # Pass serverless-data as an argument to the serverless-workflow-example template
  # Same syntax as k8s Pod spec
  - 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.s6-c1m2.xlarge
    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.s6-c1m2.xlarge
    container:
      image: debian:buster
      command: [bash, -c]
      args: ["du -sh /data; md5sum /data/*"]
      volumeMounts:
      - name: datadir
        mountPath: /data

上述YAML中,spec.podSpecPatch: '{"terminationGracePeriodSeconds": 0}'表示Argo Pod的退出延时为0秒。

设置应用容器数据访问挂载点检查

Fluid以Sidecar容器注入的方式,为Pod中的应用容器提供Serverless场景下的对象存储的数据访问支持。

如果您希望在Sidecar容器创建的数据访问挂载点就绪后,进行符合预期的数据访问。Fluid为这种场景提供了数据访问挂载点检查脚本,并将该脚本自动注入到您的应用Pod中,挂载于应用容器的/check-dataset-ready.sh文件路径下。您可以手动修改或通过Fluid自动配置容器的lifecycle.postStart的方式,确保应用容器数据访问的正确性。

重要

Fluid所提供的数据访问挂载点检查脚本依赖于Bash,在使用该脚本前请确保应用容器镜像中已经预安装了Bash程序。

方式一:手动配置

设置应用容器数据访问挂载点检查的Job类型应用的YAML示例如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-app
spec:
  template:
    metadata:
      labels:
        alibabacloud.com/fluid-sidecar-target: eci
        alibabacloud.com/eci: "true"
    spec:
      containers:
        - name: demo
          image: debian:buster
          lifecycle:
            postStart:
              exec:
                command:
                - /check-dataset-ready.sh
                - "jindo"
                - "/data"
          args:
            - -c
            - time cp -r /data/ /tmp
          command:
            - /bin/bash
          volumeMounts:
            - mountPath: /data
              name: demo
      restartPolicy: Never
      volumes:
        - name: demo
          persistentVolumeClaim:
            claimName: serverless-data
  backoffLimit: 4

上述YAML中,lifecycle.postStart.exec.command中增加了/check-dataset-ready.sh jindo /data的挂载点检查脚本,其中:

  • 第一个参数(本示例为jindo)与Fluid Dataset所绑定的Runtime类型相关,Runtime类型及挂载点如下表所示:

    Runtime类型

    挂载点检查参数

    JindoRuntime

    jindo

    AlluxioRuntime

    alluxio

    JuiceFSRuntime

    juicefs

  • 第二个参数(本示例为/data)需指定Fluid Dataset对应PVC在容器内的挂载路径(volumeMounts字段)。

方式二:自动配置

本文以Job类型应用和Argo类型应用的自动配置为例进行说明。

示例一:Job类型应用

Fluid支持自动配置上述挂载点检查脚本。通过Fluid自动配置挂载点脚本的Job类型应用的YAML示例如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-app
spec:
  template:
    metadata:
      labels:
        alibabacloud.com/fluid-sidecar-target: eci
        alibabacloud.com/eci: "true"
        app.poststart.fluid.io/inject: "true"
    spec:
      containers:
        - name: demo
          image: debian:buster
          args:
            - -c
            - time cp -r /data/ /tmp
          command:
            - /bin/bash
          volumeMounts:
            - mountPath: /data
              name: demo
      restartPolicy: Never
      volumes:
        - name: demo
          persistentVolumeClaim:
            claimName: serverless-data
  backoffLimit: 4

labels中配置app.poststart.fluid.io/inject: "true",即可启用Fluid自动配置挂载点检查脚本的功能。

重要

如果您的应用容器中已经定义了lifecycle.postStart,Fluid的自动配置将不会生效,您必须使用手动配置进行数据访问挂载点检查。

示例二:Argo类型应用

Fluid支持自动配置上述挂载点检查脚本。通过Fluid自动配置挂载点脚本的Argo类型应用的YAML示例如下:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: serverless-workflow-
spec:
  entrypoint: serverless-workflow-example
  volumes:
  # Pass serverless-data as an argument to the serverless-workflow-example template
  # Same syntax as k8s Pod spec
  - 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"
       app.poststart.fluid.io/inject: "true"
      annotations:
         k8s.aliyun.com/eci-use-specs: ecs.s6-c1m2.xlarge
    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"
        app.poststart.fluid.io/inject: "true"
      annotations:
         k8s.aliyun.com/eci-use-specs: ecs.s6-c1m2.xlarge
    container:
      image: debian:buster
      command: [bash, -c]
      args: ["du -sh /data; md5sum /data/*"]
      volumeMounts:
      - name: datadir
        mountPath: /data

分别在Argo多个容器定义的labels中配置app.poststart.fluid.io/inject: "true",即可启用Fluid自动配置挂载点检查脚本的功能。

重要

如果您的应用容器中已经定义了lifecycle.postStart,Fluid的自动配置将不会生效,您必须使用手动配置进行数据访问挂载点检查。

设置在ECI上使用Fluid缓存

在ECI上使用Fluid缓存时,可使用内存、本地盘或ECI系统盘作为底层存储介质存放缓存数据,这三者存储介质按读取效率从高到低排序为:内存>本地盘(仅限支持本地盘的ECI实例规格)>ECI系统盘。

示例一:使用内存作为缓存数据存储介质

Fluid通过对spec.tieredstore.levels.mediumtype参数的设置来指定缓存介质的类型,通过对spec.tieredstore.levels.quota参数的设置来指定缓存的大小。

说明

Fluid使用ECI实例的内存作为缓存时,可以灵活调整其大小,不会受制于ECI实例内存一半大小的默认限制。

使用内存作为缓存数据存储介质的Fluid JindoRuntime自定义资源的YAML示例如下:

apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: demo-dataset
spec:
  # 缓存Worker节点数量。
  replicas: 1
  podMetadata:
    labels:
      alibabacloud.com/eci: "true"
  worker:
    podMetadata:
      annotations:
        # 选择JindoFS Pod使用的实例规格。
        k8s.aliyun.com/eci-use-specs: ecs.g5.xlarge
        # 启用实例镜像缓存,加速Pod启动过程。
        k8s.aliyun.com/eci-image-cache: "true"
  tieredstore:
    levels:
      - mediumtype: MEM # 使用内存作为缓存数据存储介质。
        volumeType: emptyDir
        path: /dev/shm
        quota: 10Gi
        high: "0.99"
        low: "0.99"

上述示例通过将spec.tieredstore.levels.mediumtype参数的类型设置为MEM,spec.tieredstore.levels.quota的大小设置为10Gi,从而设置一个缓存Worker副本所提供的内存缓存大小为10 GiB。关于完整的Fluid Dataset和Runtime创建流程,请参见加速Job应用数据访问

示例二:使用本地盘作为缓存数据存储介质

Fluid通过spec.tieredstore.levels.mediumtype参数来指定缓存介质类型,通过spec.tieredstore.levels.quota参数来设置缓存大小。如果需要使用本地盘作为缓存数据存储介质,还需要额外设置spec.tieredstore.levels.volumeSource.emptyDir.medium=LocalRaid0,以挂载ECI实例的本地盘。

重要

使用本地盘作为缓存数据存储介质,指定的ECI实例规格必须为支持本地盘的ECS规格族。更多信息,请参见挂载本地盘

使用本地盘作为缓存数据存储介质的Fluid JindoRuntime自定义资源的YAML示例如下:

apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: demo-dataset
spec:
  replicas: 2
  podMetadata:
    annotations:
      k8s.aliyun.com/eci-use-specs: ecs.g6e.4xlarge
      k8s.aliyun.com/eci-image-cache: "true"
    labels:
      alibabacloud.com/eci: "true"
  worker:
    podMetadata:
      annotations:
        k8s.aliyun.com/eci-use-specs: ecs.i2g.2xlarge
  tieredstore:
    levels:
      - mediumtype: SSD
        volumeType: emptyDir
        volumeSource:
          emptyDir:
            medium: LocalRaid0
        path: /cache
        quota: 20Gi
        high: "0.99"
        low: "0.99"

上述示例通过将 spec.tieredstore.levels.quota的大小设置为20Gi,从而设置一个缓存Worker副本所提供的本地盘缓存大小为20 GiB。关于完整的Fluid Dataset和Runtime的创建流程,请参见加速Job应用数据访问

示例三:使用ECI系统盘作为缓存数据存储介质

Fluid通过spec.tieredstore.levels.mediumtype参数来指定缓存介质类型,通过spec.tieredstore.levels.quota参数来指定缓存大小。如果使用云盘作为缓存数据存储介质,需要额外申请ECI临时存储空间,这部分存储空间将根据大小和使用时长收取费用,更多信息,请参见临时存储空间计费

重要

如果使用系统盘作为缓存数据存储介质,缓存系统的带宽吞吐可能因系统盘可用带宽有限造成性能瓶颈,对于系统程序本身稳定性也会造成影响。如果希望获得更好的I/O性能和稳定性,推荐使用内存或本地盘作为缓存数据存储介质。

使用云盘作为缓存数据存储介质的Fluid JindoRuntime自定义资源YAML示例如下:

apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: demo-dataset
spec:
  # 缓存Worker节点数量。
  replicas: 1
  worker:
    podMetadata:
      annotations:
        # 选择JindoFS Pod使用的实例规格。
        k8s.aliyun.com/eci-use-specs: ecs.g5.xlarge
        # 启用实例镜像缓存,加速Pod启动过程。
        k8s.aliyun.com/eci-image-cache: "true"
        # 设置额外的50Gi的存储空间,与缓存需求量tieredstore.levels.quota一致
        k8s.aliyun.com/eci-extra-ephemeral-storage: "50Gi"
  tieredstore:
    levels:
      # 以50 GiB的SSD云盘作为每个缓存Worker节点的缓存介质。
      - mediumtype: SSD
        volumeType: emptyDir
        path: /cache
        quota: 50Gi
        high: "0.99"
        low: "0.99"

上述示例设置每个缓存Worker副本提供50GiB的缓存,缓存数据存储介质为云盘。因此,每个缓存Worker副本需要额外申请50GiB的额外存储空间。关于完整的Fluid Dataset和Runtime创建流程,请参见加速Job应用数据访问