Fluid支持在Serverless场景下,通过JindoRuntime优化对象存储的数据访问。本文介绍如何在Serverless场景下使用Fluid的进阶配置,包括设置应用Pod退出延迟和应用容器数据访问挂载点检查。
前提条件
已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群。
重要ack-fluid组件暂不支持在ContainerOS操作系统上使用。
已安装云原生AI套件并部署ack-fluid组件。
重要若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
已部署ACK虚拟节点(Virtual Node)。具体操作,请参见通过部署ACK虚拟节点组件创建ECI Pod。
已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群。
设置应用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应用数据访问。