すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:CNFS を使用した EFC クライアント経由で NAS をマウントする

最終更新日:Jul 29, 2025

Elastic File Client (EFC) は、分散キャッシュを活用してアクセスを高速化することにより、File Storage NAS (Network Attached Storage) のパフォーマンスを向上させます。 高並列性と大規模な並列データアクセスをサポートしているため、ビッグデータ分析、AI トレーニング、推論ワークロードなどのデータ集約型のコンテナ化アプリケーションに最適です。 従来のネットワーク ファイル システム (NFS) プロトコルと比較して、EFC は大幅に改善された I/O パフォーマンスと低いレイテンシを実現します。 このトピックでは、Container Network File System (CNFS) を介して EFC クライアントを使用して NAS ファイルシステムをマウントする方法について説明します。

EFC の概要

EFC は、Filesystem in Userspace (FUSE) 上に構築された Alibaba Cloud のユーザー空間 POSIX 準拠クライアントです。 従来のカーネルモード NFS クライアントに取って代わり、パフォーマンス、信頼性、および運用効率を向上させます。 主な機能は次のとおりです。

  • マルチ接続アクセス

  • メタデータとデータのキャッシュ

  • 分散読み取り専用キャッシュ

  • Managed Service for Prometheus を介した統合監視

カーネルモード NFS クライアントやその他のオープンソース FUSE クライアントと比較して、EFC クライアントには次の利点があります。

  • 強力なデータ整合性

    強力な整合性のある分散ロックメカニズムを介してファイルとディレクトリに実装されます。 以下を保証します。

    • 書き込まれたファイルの他のクライアントへの即時可視性

    • 新しく作成されたファイルのすべてのクライアント間でのインスタント同期

    • 簡素化されたマルチノード データ管理

  • 単一ノードの読み取りおよび書き込みキャッシュ

    少量の計算ノードメモリを使用してデータをキャッシュすることにより、FUSE キャッシュロジックを最適化し、以下を実現します。

    • 小規模ファイルのスループットの向上

    • 従来の NFS クライアントと比較して 50% 以上 I/O パフォーマンス

  • 分散読み取り専用キャッシュ

    複数のノードにわたるメモリを使用して、自動スケーリング、O&M 不要の分散キャッシュプールを構築します。

  • 小規模ファイルのプリフェッチ

    ホットディレクトリとファイルを自動的に識別してプリフェッチし、データプルのオーバーヘッドを削減します。

  • ホットアップグレードとフェールオーバー

    • アプリケーションを再起動せずにクライアントを更新

    • クライアント障害時のサービス中断のない自動フェールオーバー

前提条件

EFC を使用する前に、以下を確認してください。

  • cnfs-nas-daemon アドオンがクラスターにインストールされていること。 AlinasMountProxy=true フラグが csi-plugin の [FeatureGate] に追加されていること。 詳細については、「cnfs-nas-daemon を管理する」をご参照ください。

  • ノードの OS は 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 と関連付けられたサービスを自動的にプロビジョニングします。

    1. 次の YAML テンプレートを csi-configmap.yaml として保存します。

      DaemonSet は、cache=true ラベルが付いたノードにポッドを作成します。 各ポッドには 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 ポッドあたりのコンテナー数。 キャッシュパフォーマンスのボトルネックが発生した場合は、このパラメーターを増やします。

      volume-type

      キャッシュポッドにマウントされた EmptyDir ボリュームで使用される記憶媒体。

      • disk

      • memory

      重要

      ノードのリソース使用量が本番ワークロードに影響を与えないようにしてください。

      volume-size

      キャッシュポッドごとに割り当てられるボリュームのサイズ (単位: GiB)。

      node-selector

      キャッシュ DaemonSet をスケジュールするために使用されるラベル。 設定されていない場合、DaemonSet はすべてのノードで実行されます。

    2. 次のコマンドを実行して、ConfigMap をデプロイします。

      kubectl apply -f csi-configmap.yaml
  2. 分散キャッシュ DaemonSet のステータスを確認します。

    kubectl get ds/cnfs-cache-ds -n kube-system -o wide

    期待される出力:

    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

    この出力例では、クラスターには cache=true ラベルが付いた 2 つのノードがあり、DaemonSet 内の 2 つのポッドはどちらもレディ状態です。これは、分散キャッシュ DaemonSet が開始されたことを示しています。

  3. 分散キャッシュ サービスのサービスディスカバリを確認します。

    kubectl get ep cnfs-cache-ds-service  -n kube-system -o wide

    期待される出力:

    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

    出力例は、サービスがバックエンドキャッシュポッドエンドポイントを検出したことを示しています。

EFC クライアントを使用して NAS をマウントするように CNFS を構成する

  1. CNFS を作成し、EFC クライアントの使用を指定します。

    1. 次の YAML テンプレートを cnfs-efc.yaml として保存します。

      この例では、CNFS 経由で既存の NAS ファイルシステムを構成する際に EFC クライアントを有効にする方法を示しています。 CNFS 経由で新しく作成された NAS ファイルシステムの場合は、ContainerNetworkFileSystem リソースの parameters セクションに useClient: EFCClient を追加して、EFC クライアントを有効にします。 詳細については、「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

      マウントポイントアドレス。 マウントポイントは次の要件を満たしている必要があります。

      • マウントポイントの VPC は、ポッドで使用される VPC と同じである必要があります。 そうでない場合、マウントは失敗します。

      • 最適なパフォーマンスを得るには、マウントポイントとポッドに同じ vSwitch を使用することをお勧めします。

      • マウントポイントのステータスは、[Ready] である必要があります。

      既存のマウントポイントがこれらの要件を満たしていない場合は、新しいマウントポイントを作成してください。

      useClient

      このパラメーターを EFCClient に設定すると、EFC クライアントが有効になります。

    2. 次のコマンドを実行して、CNFS を作成します。

      kubectl create -f cnfs-efc.yaml
  2. CNFS を使用してボリュームを作成します。

    kubectl create -f cnfs-pv-pvc.yaml

    次の 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

    次の 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 内のポッドのステータスを確認します。

    kubectl get pod -l app=efc-test

    期待される出力:

    NAME                       READY   STATUS    RESTARTS   AGE
    efc-test-f545b86d6-spr7p   1/1     Running   0          29m
  3. ポッドが [Running] 状態になったら、ポッド内の 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)