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)