全部產品
Search
文件中心

Container Service for Kubernetes:通過CNFS使用EFC用戶端掛載NAS

更新時間:Jun 14, 2025

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分布式快取區外掛程式。

  1. 在叢集中建立並部署csi-plugin的ConfigMap,用於部署CNFS-EFC分布式快取區外掛程式。

    ConfigMap部署完成後,會根據已配置的ConfigMap自動部署緩衝的DaemonSet以及Service。

    1. 將以下內容儲存為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-cache

      enable

      配置為true,開啟分布式緩衝。

      container-number

      緩衝的DaemonSet中每個Pod包含的容器數量,當緩衝出現效能瓶頸時,可以增加容器數量。

      volume-type

      緩衝Pod掛載的EmptyDir卷所使用的儲存介質。

      • disk:磁碟。

      • memory:記憶體。

      重要

      使用磁碟或記憶體時,會使用節點的資料盤和記憶體資源,請確保不影響業務運行。

      volume-size

      緩衝Pod中Volume的大小。單位:GiB。

      node-selector

      緩衝的DaemonSet通過Label進行調度。如果不配置,則所有節點都會部署DaemonSet。

    2. 部署ConfigMap。

      kubectl apply -f csi-configmap.yaml
  2. 確認分布式緩衝的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
  3. 確認分布式緩衝的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

  1. 建立CNFS,指定使用EFC用戶端。

    1. 將以下內容儲存為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檔案系統。

      parameters

      server

      NAS掛載點的地址。掛載點需滿足以下要求:

      • 掛載點的VPC必須和叢集中Pod使用的VPC一致,否則會導致掛載失敗。

      • 掛載點的交換器建議和叢集中Pod使用的交換器一致,效能相對更優。

      • 掛載點的狀態為可用

      如果已有掛載點不滿足要求,可建立新的掛載點。更多資訊,請參見管理掛載點

      useClient

      配置為EFCClient,表示開啟EFC用戶端。

    2. 建立CNFS。

      kubectl create -f cnfs-efc.yaml
  2. 使用CNFS建立對應的儲存卷。

    kubectl create -f cnfs-pv-pvc.yaml

    cnfs-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

  1. 建立Deployment並掛載NAS。

    kubectl create -f cnfs-deployment.yaml

    cnfs-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
  2. 查看Deployment中Pod的部署情況。

    kubectl get pod -l app=efc-test

    預期返回:

    NAME                       READY   STATUS    RESTARTS   AGE
    efc-test-f545b86d6-spr7p   1/1     Running   0          29m
  3. 等待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)