Fluid支持ACK Serverless集群的数据访问加速,您可以将Fluid的全部组件,包括Fluid控制器、缓存系统组件和您的应用程序全部运行于ACK Serverless环境。本文介绍如何在ACK Serverless集群上加速Job应用数据访问。
前提条件
已创建ACK Serverless集群,集群的Kubernetes版本≥1.18且已安装了CoreDNS组件。具体操作,请参见创建集群。
已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl连接Kubernetes集群。
使用限制
本功能与ACK Serverless集群的虚拟节点调度功能冲突,暂不支持同时使用。关于虚拟节点调度功能的更多信息,请参见开启集群虚拟节点调度策略。
部署Fluid控制面组件
若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
部署Fluid控制面组件。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击创建。
在基本信息配置向导,配置相关参数,然后单击下一步。
部分参数说明如下:
参数
说明
来源
选择应用市场。
Chart
搜索并选中ack-fluid。
说明Chart默认的发布名称为ack-fluid、命名空间为fluid-system。单击下一步时,若发布名称或命名空间与Chart默认值不同,则会弹出请确认的提示框,提示您采用Chart默认的发布名称或命名空间,建议您在提示框中单击是。
在参数配置配置向导,单击确定。
执行以下命令,查看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才会按需扩容。
ACK Serverless集群数据访问加速示例
步骤一:上传测试数据到OSS Bucket
步骤二:创建Fluid Dataset和Runtime资源
数据准备和上传后,即可在Fluid中声明上述待访问的数据。您需要提交一个Dataset CR和一个Runtime CR。
Dataset CR:描述数据在外部存储系统中的URL位置。
Runtime CR:描述缓存系统及其具体配置。
执行以下命令,创建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>
使用以下内容,创建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: # 禁用虚拟节点调度功能。 alibabacloud.com/burst-resource: eci_only # 选择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
tieredstore.levels
可以通过
quota
字段指定每个缓存Worker Pod可提供的最大缓存容量。tieredstore.levels.mediumtype
缓存类型。仅支持HDD(机械硬盘)、SSD(固态硬盘)和MEM(内存)三种类型。
关于mediumtype的推荐配置,请参见策略二:选择缓存介质。
tieredstore.levels.volumeType
缓存介质存储卷类型。仅支持emptyDir和hostPath两种类型,默认为hostPath类型。
如果使用内存或本地存储的系统盘作为缓存介质,推荐选择emptyDir类型,避免节点上缓存数据残留,进而影响节点可用性。
如果使用本地存储的数据盘作为缓存介质,可使用hostPath类型,并配置path指定为宿主机上数据盘的挂载路径。
关于volumeType的推荐配置,请参见策略二:选择缓存介质。
tieredstore.levels.path
表示缓存路径,目前只支持单个路径。
tieredstore.levels.quota
表示缓存的最大容量。例如100 Gi表示最大可用100 GiB。
tieredstore.levels.high
表示存储容量上限。
tieredstore.levels.low
表示存储容量下限。
执行以下命令,创建Dataset和JindoRuntime资源。
kubectl create -f dataset.yaml
执行以下命令,查看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,表示已成功部署。
(可选)步骤三:数据缓存预热
预先加热数据可以提升首次数据的访问性能。如果您希望在首次访问数据时得到更好的性能体验,建议您使用该功能。
使用以下内容,创建dataload.yaml文件。
apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: data-warmup spec: dataset: name: demo-dataset namespace: default loadMetadata: true
执行以下命令,部署Dataload。
kubectl create -f dataload.yaml
预期输出:
NAME DATASET PHASE AGE DURATION data-warmup demo-dataset Complete 99s 58s
由预期输出得到,数据预热耗时约为
58s
。
步骤四:创建Job应用访问数据
您可以通过创建应用容器来使用JindoFS数据访问加速服务,或者提交机器学习作业来体验相关功能。本文以创建Job类型应用容器访问OSS为例进行说明。
使用以下内容,创建job.yaml,定义如下Job资源。
apiVersion: batch/v1 kind: Job metadata: name: demo-app spec: template: metadata: labels: alibabacloud.com/fluid-sidecar-target: eci annotations: # 禁用虚拟节点调度功能。 alibabacloud.com/burst-resource: eci_only # 选择应用Pod使用的实例规格。 k8s.aliyun.com/eci-use-specs: ecs.g7.4xlarge spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 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
执行以下命令,创建Job。
kubectl create -f job.yaml
执行以下命令,查看Job Pod启动日志。
kubectl logs demo-app-jwktf -c demo
预期输出:
1.2G /data real 0m0.992s user 0m0.004s sys 0m0.674s
由预期输出得到,文件拷贝时间
real
仅为0m0.992s
。
步骤五:环境清理
当您不再使用数据访问功能时,请及时清理环境。
执行以下命令,删除应用容器。
kubectl delete job demo-app
执行以下命令,删除Dataset以及绑定的缓存系统组件。
kubectl delete dataset demo-dataset
重要缓存系统组件的清理可能会需要约1分钟时间,请检查缓存系统各组件Pod被完整删除后,再执行后续清理操作。
执行以下命令,回收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