EFC支持高并发和大规模数据集的并行访问,适用于数据密集型和高并发访问的容器化应用场景(例如大数据分析、AI训练与推理等)。相比使用默认的NFS协议挂载NAS,使用EFC挂载NAS可以加速文件访问,提升读写性能。本文介绍如何通过CNFS使用EFC客户端挂载NAS文件系统。
EFC介绍
EFC弹性文件客户端(Elastic File Client)是阿里云提供的基于FUSE的用户态POSIX客户端。它可以替代传统的内核态NFS客户端,提供多链接访问、元数据缓存等加速能力,并结合阿里云Prometheus监控提供端侧性能监控能力。
相比于内核态NFS客户端和其他基于开源FUSE的客户端,EFC客户端具有以下优势:
数据一致性保证:通过强一致的分布式锁机制实现文件和目录的强一致;文件写入可以立即被其他客户端读取;新文件创建出来后,就可以立即让所有的其他客户端同步访问到,便于您在多节点间管理数据。
单节点读写缓存能力:优化了FUSE的缓存逻辑,利用计算节点上的少量内存缓存数据,提供了更好的小文件读写性能。相比于传统的NFS客户端,性能提升了50%以上。
小文件预取能力:可以自动识别并预取热目录和热文件,节省拉取数据的开销。
热升级和Failover能力:客户端版本更新无需重启应用,客户端异常时支持自动切换,业务无感知。
前提条件
集群中已安装cnfs-nas-daemon组件,并在csi-plugin组件的FeatureGate中增加
AlinasMountProxy=true以启用cnfs-nas-daemon。具体操作,请参见管理cnfs-nas-daemon组件。节点操作系统为Alibaba Cloud Linux 3或ContainerOS,内核版本为5.10.134-17.2及以上。
重要当节点操作系统或内核版本不满足要求时,系统将自动切换为NFS协议进行挂载。
配置CNFS使用EFC客户端挂载NAS
创建CNFS,指定使用EFC客户端。
将以下内容保存为cnfs-efc.yaml。
说明示例以使用CNFS配置已有NAS文件系统为例,演示如何开启EFC客户端。如果使用CNFS新建NAS文件系统,也可以通过在ContainerNetworkFileSystem资源的
parameters添加useClient: EFCClient的方式来开启EFC客户端。关于如何使用CNFS创建NAS文件系统,请参见通过CNFS管理NAS文件系统。apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-efc-test spec: description: "cnfs" type: nas reclaimPolicy: Retain parameters: server: 17f7e4****-h****.cn-beijing.nas.aliyuncs.com useClient: EFCClient参数
说明
description文件系统的描述。
type需要创建的存储卷类型。
reclaimPolicy回收策略,目前仅支持
Retain策略,删除CNFS时并不会删除NAS文件系统。parametersserverNAS挂载点的地址。挂载点需满足以下要求:
挂载点的VPC必须和集群中Pod使用的VPC一致,否则会导致挂载失败。
挂载点的交换机建议和集群中Pod使用的交换机一致,性能相对更优。
挂载点的状态为可用。
如果已有挂载点不满足要求,可创建新的挂载点。更多信息,请参见管理挂载点。
useClient配置为
EFCClient,表示开启EFC客户端。创建CNFS。
kubectl create -f cnfs-efc.yaml
使用CNFS创建对应的存储卷。
kubectl create -f cnfs-pv-pvc.yamlcnfs-pv-pvc.yaml的内容示例如下。
apiVersion: v1 kind: PersistentVolume metadata: name: efc-pv spec: accessModes: - ReadWriteMany capacity: storage: 50Gi claimRef: name: efc-pvc namespace: default csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: containerNetworkFileSystem: cnfs-efc-test path: / volumeHandle: efc-pv volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: efc-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: "" volumeMode: Filesystem volumeName: efc-pv
创建工作负载并挂载NAS
创建Deployment并挂载NAS。
kubectl create -f cnfs-deployment.yamlcnfs-deployment.yaml的内容示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: efc-test namespace: default spec: replicas: 1 selector: matchLabels: app: efc-test template: metadata: labels: app: efc-test spec: containers: - command: - sh - -c - | sleep infinity image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest name: test volumeMounts: - mountPath: /mnt name: pvc volumes: - name: pvc persistentVolumeClaim: claimName: efc-pvc查看Deployment中Pod的部署情况。
kubectl get pod -l app=efc-test预期返回:
NAME READY STATUS RESTARTS AGE efc-test-f545b86d6-spr7p 1/1 Running 0 29m等待Pod Running后,在Pod中查看EFC挂载点。
kubectl exec <pod-name> -- mount -t fuse.aliyun-alinas-efc预期返回:
bindroot-3889a-8TzEY5mc:3d2804****-w****.cn-shanghai.nas.aliyuncs.com:/ on /mnt type fuse.aliyun-alinas-efc (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=1048576)