EFC提供了分布式緩衝等能力以提升Apsara File Storage NAS的訪問效能,同時支援高並發和大規模資料集的並行訪問,適用於資料密集型和高並發訪問的容器化應用情境(例如巨量資料分析、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分布式緩衝
如需使用EFC的分布式緩衝能力,需要先部署CNFS-EFC分布式快取區外掛程式。
在叢集中建立並部署csi-plugin的ConfigMap,用於部署CNFS-EFC分布式快取區外掛程式。
ConfigMap部署完成後,會根據已配置的ConfigMap自動部署緩衝的DaemonSet以及Service。
將以下內容儲存為csi-configmap.yaml。
以下YAML樣本用於部署分布式緩衝的DaemonSet,DaemonSet會在帶有
cache=true標籤的節點上建立Pod,每個Pod包含3個容器,掛載了15 GiB的tmpfs卷(基於記憶體)。您可以根據實際需求修改參數配置。apiVersion: v1 kind: ConfigMap metadata: name: csi-plugin namespace: kube-system data: nas-efc-cache: | enable=true container-number=3 volume-type=memory volume-size=15Gi node-selector: | cache=true參數
說明
nfs-efc-cacheenable配置為
true,開啟分布式緩衝。container-number緩衝的DaemonSet中每個Pod包含的容器數量,當緩衝出現效能瓶頸時,可以增加容器數量。
volume-type緩衝Pod掛載的EmptyDir卷所使用的儲存介質。
disk:磁碟。memory:記憶體。
重要使用磁碟或記憶體時,會使用節點的資料盤和記憶體資源,請確保不影響業務運行。
volume-size緩衝Pod中Volume的大小。單位:GiB。
node-selector緩衝的DaemonSet通過Label進行調度。如果不配置,則所有節點都會部署DaemonSet。
部署ConfigMap。
kubectl apply -f csi-configmap.yaml
確認分布式緩衝的DaemonSet是否啟動。
kubectl get ds/cnfs-cache-ds -n kube-system -o wide返回樣本如下,本樣本的叢集中有2個帶有
cache=true標籤的節點,對應DaemonSet中的2個Pod均處於可用狀態,說明分布式緩衝的DaemonSet已經啟動完成。NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR cnfs-cache-ds 2 2 2 2 2 cache=true 13m alinas-dadi-container,alinas-dadi-container1,alinas-dadi-container2 registry-cn-hangzhou.ack.aliyuncs.com/acs/nas-cache:20220420,registry-cn-hangzhou.ack.aliyuncs.com/acs/nas-cache:20220420,registry-cn-hangzhou.ack.aliyuncs.com/acs/nas-cache:20220420 app=cnfs-cache-ds確認分布式緩衝的Service是否實現服務發現。
kubectl get ep cnfs-cache-ds-service -n kube-system -o wide返回樣本如下,Service已經發現後端緩衝Pod對應的Endpoints。
NAME ENDPOINTS AGE cnfs-cache-ds-service 192.168.3.217:6500,192.168.5.247:6500,192.168.3.217:6502 + 3 more... 2d3h
配置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的內容樣本如下。如果叢集中已部署CNFS-EFC分布式緩衝,您可以通過
mountOptions配置EFC開啟緩衝和預讀能力;若未部署,請刪除樣本中的mountOptions配置。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 mountOptions: - g_tier_EnableClusterCache=true # 掛載時,分布式緩衝使用緩衝配置。 - g_tier_EnableClusterCachePrefetch=true # 掛載時,分布式緩衝開啟預讀功能。 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)