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的自动配置将不会生效,您必须使用手动配置进行数据访问挂载点检查。