JindoRuntime是基于阿里云EMR团队的JindoFS文件系统开发的Fluid运行时引擎。JindoFS基于C++实现,能够为Fluid提供Dataset数据管理和缓存功能。JindoRuntime支持对Kubernetes环境主机目录HostPath中的数据进行缓存,从而提升后续数据访问过程的效率。在混合云场景下,您可以将主机目录挂载到自建存储系统,从而实现自建存储系统的数据访问加速。本文介绍如何基于JindoRuntime加速主机目录数据访问。
前提条件
已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群。
重要ack-fluid组件暂不支持在ContainerOS操作系统上使用。
已安装云原生AI套件并部署ack-fluid组件,且ack-fluid版本为1.0.6以上。
重要若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
步骤一:准备主机目录挂载点
JindoRuntime利用分布式缓存来加速主机目录数据访问,因此,对于使用JindoFS分布式缓存系统的用户,需要在Master组件和Worker组件所运行的节点上提前准备好对应的主机目录。操作示例如下。
执行如下命令,在
/mnt
目录下创建一个新的子目录作为主机目录挂载点。$ mkdir /mnt/demo-remote-fs
执行如下命令,为
cn-beijing.192.168.1.45
和cn-beijing.192.168.2.234
两个节点创建相应的主机目录。# 此处两个节点为本文的示例节点,具体生产环境请替换成您自己的节点名称。 ssh cn-beijing.192.168.1.45 "mkdir -p /mnt/demo-remote-fs" ssh cn-beijing.192.168.2.234 "mkdir -p /mnt/demo-remote-fs"
执行如下命令,为
cn-beijing.192.168.1.45
和cn-beijing.192.168.2.234
节点打标签。标签demo-remote-fs=true
用于设置JindoRuntime的Master和Worker组件的节点调度约束条件。kubectl label node cn-beijing.192.168.1.45 demo-remote-fs=true kubectl label node cn-beijing.192.168.2.234 demo-remote-fs=true
步骤二:创建Fluid Dataset和JindoRuntime
使用如下YAML,创建
dataset.yaml
文件。下方
dataset.yaml
配置文件中包含两个待创建的Fluid资源对象,分别是Dataset和JindoRuntime。Dataset:所需挂载的主机目录信息。
JindoRuntime:待启动的JindoFS分布式缓存系统配置,包括缓存系统Worker组件副本数,以及每个Worker组件最大可用的缓存容量等。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: hostpath-demo-dataset spec: mounts: - mountPoint: local:///mnt/demo-remote-fs name: data path: / accessModes: - ReadOnlyMany --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: hostpath-demo-dataset spec: master: nodeSelector: demo-remote-fs: "true" worker: nodeSelector: demo-remote-fs: "true" fuse: nodeSelector: demo-remote-fs: "true" replicas: 2 tieredstore: levels: - mediumtype: MEM volumeType: emptyDir path: /dev/shm quota: 10Gi high: "0.99" low: "0.99"
配置文件中资源对象的详细参数说明如下。
参数
说明
mountPoint
需要挂载的数据源信息。主机目录作为数据源,挂载时支持
local://<path>
格式。path
为挂载的主机目录,需要设置为绝对路径。nodeSelector
设置JindoRuntime的Master组件、Worker组件、FUSE组件的节点调度约束条件,控制各个组件Pod仅在已准备好主机目录的节点上运行。
replicas
待启动的JindoFS缓存系统Worker组件副本数。可根据需要进行调整。
mediumtype
缓存类型。仅支持HDD(机械硬盘)、SSD(固态硬盘)和MEM(内存)三种类型。
关于mediumtype的推荐配置,请参见策略二:选择缓存介质。
volumeType
缓存介质存储卷类型。仅支持emptyDir和hostPath两种类型,默认为hostPath类型。
如果使用内存或本地存储的系统盘作为缓存介质,推荐选择emptyDir类型,避免节点上缓存数据残留,进而影响节点可用性。
如果使用本地存储的数据盘作为缓存介质,可使用hostPath类型,并配置path指定为宿主机上数据盘的挂载路径。
关于volumeType的推荐配置,请参见策略二:选择缓存介质。
path
JindoFS缓存系统Worker的缓存数据存储目录。为达到最优的数据访问性能,建议使用/
dev/shm
或其他挂载了内存文件系统的路径。quota
单个缓存Worker组件提供的最大缓存容量。可以根据需要进行调整。
执行如下命令,创建Dataset和JindoRuntime资源对象。
kubectl create -f dataset.yaml
执行如下命令,查看Dataset的部署情况。
kubectl get dataset hostpath-demo-dataset
预期输出:
说明初次启动JindoFS缓存系统时涉及镜像拉取过程,因为网络环境等因素的影响,可能需要耗时2~3分钟。
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hostpath-demo-dataset 1.98GiB 0.00B 20.00GiB 0.0% Bound 3m54s
Dataset处于Bound状态,表明JindoFS缓存系统已在集群内正常启动,应用Pod可正常访问Dataset中定义的数据。
(可选)步骤三:创建DataLoad执行缓存预热
由于首次访问无法命中数据缓存,可能导致应用Pod的数据访问效率较低。Fluid提供了DataLoad缓存预热操作提升首次数据访问的效率。
创建
dataload.yaml
文件,代码示例如下。apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: dataset-warmup spec: dataset: name: hostpath-demo-dataset namespace: default loadMetadata: true target: - path: / replicas: 1
上述资源对象的详细参数说明如下所示。
参数
说明
dataset.name
需要预热的Dataset对象名字。
dataset.namespace
需要预热的Dataset对象所在的命名空间。该命名空间需要与DataLoad对象所在命名空间一致。
loadMetadata
预热前是否进行元信息同步,对于JindoRuntime须设置为true。
target[*].path
需预热的存储目录或文件,路径为基于Dataset中声明的挂载点的相对路径。
例如,Dataset中挂载的数据源为
pvc://my-pvc/mydata
,那么设置path为/test
将会预热my-pvc
对应存储系统下的/mydata/test
目录。target[*].replicas
需预热的存储目录或文件的缓存数据副本数量。
执行如下命令,创建DataLoad对象。
kubectl create -f dataload.yaml
执行如下命令,查看DataLoad状态。
kubectl get dataload dataset-warmup
预期输出:
NAME DATASET PHASE AGE DURATION dataset-warmup pv-demo-dataset Complete 62s 9s
执行如下命令,查看数据缓存状态。
kubectl get dataset
预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hostpath-demo-dataset 1.98GiB 1.98GiB 20.00GiB 100.0% Bound 7m24s
DataLoad缓存预热操作完成后,数据集的已缓存数据量
CACHED
已更新为整个数据集的大小,代表整个数据集已被缓存,缓存百分比CACHED PERCENTAGE
为100.0%。
步骤四:创建应用容器,访问主机目录中数据
使用如下YAML,创建
pod.yaml
文件,并修改YAML文件中的claimName名称与步骤二已创建的Dataset名称相同。apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 command: - "bash" - "-c" - "sleep inf" volumeMounts: - mountPath: /data name: data-vol volumes: - name: data-vol persistentVolumeClaim: claimName: hostpath-demo-dataset # 名称需要与Dataset相同。
执行如下命令,创建应用Pod。
kubectl create -f pod.yaml
执行如下命令,登录Pod访问数据。
$ kubectl exec -it nginx bash
预期输出:
# Nginx Pod中,/data目录下有一个名为demo-file的文件,大小为2 GB。 $ ls -lh /data total 2.0G -rwxrwxr-x 1 root root 2.0G Jun 9 04:02 demo-file # 执行cat /data/demofile > /dev/null命令,将demofile文件中的内容读取并写入/dev/null设备中,用时2.061秒。 $ time cat /data/demofile > /dev/null real 0m2.061s user 0m0.015s sys 0m0.581s
由于数据集中的数据已经全部缓存在了JindoFS缓存系统中,读取数据时将会从缓存中读取,而不是从远程存储器中读取,从而减少了网络传输,提升了数据访问效率。