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 分散キャッシュプラグインをデプロイします。
csi-plugin 用の ConfigMap を作成して、CNFS-EFC 分散キャッシュプラグインをデプロイします。
ConfigMap がデプロイされると、システムは ConfigMap に基づいてキャッシュされた DaemonSet と関連付けられたサービスを自動的にプロビジョニングします。
次の 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-cacheenabletrueに設定すると、分散キャッシュが有効になります。container-numberキャッシュされた DaemonSet ポッドあたりのコンテナー数。 キャッシュパフォーマンスのボトルネックが発生した場合は、このパラメーターを増やします。
volume-typeキャッシュポッドにマウントされた EmptyDir ボリュームで使用される記憶媒体。
diskmemory
重要ノードのリソース使用量が本番ワークロードに影響を与えないようにしてください。
volume-sizeキャッシュポッドごとに割り当てられるボリュームのサイズ (単位: GiB)。
node-selectorキャッシュ DaemonSet をスケジュールするために使用されるラベル。 設定されていない場合、DaemonSet はすべてのノードで実行されます。
次のコマンドを実行して、ConfigMap をデプロイします。
kubectl apply -f csi-configmap.yaml
分散キャッシュ 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 が開始されたことを示しています。分散キャッシュ サービスのサービスディスカバリを確認します。
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 を構成する
CNFS を作成し、EFC クライアントの使用を指定します。
次の 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 ファイルシステムは削除されません。parametersserverマウントポイントアドレス。 マウントポイントは次の要件を満たしている必要があります。
マウントポイントの VPC は、ポッドで使用される VPC と同じである必要があります。 そうでない場合、マウントは失敗します。
最適なパフォーマンスを得るには、マウントポイントとポッドに同じ vSwitch を使用することをお勧めします。
マウントポイントのステータスは、[Ready] である必要があります。
既存のマウントポイントがこれらの要件を満たしていない場合は、新しいマウントポイントを作成してください。
useClientこのパラメーターを
EFCClientに設定すると、EFC クライアントが有効になります。次のコマンドを実行して、CNFS を作成します。
kubectl create -f cnfs-efc.yaml
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 をマウントする
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-pvcDeployment 内のポッドのステータスを確認します。
kubectl get pod -l app=efc-test期待される出力:
NAME READY STATUS RESTARTS AGE efc-test-f545b86d6-spr7p 1/1 Running 0 29mポッドが [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)