Cloud Parallel File Storage (CPFS) for Lingjun は、エンドツーエンドのリモートダイレクトメモリアクセス (RDMA) ネットワークアクセラレーションをサポートし、高スループットと高い IOPS を実現します。これらの特徴により、人工知能生成コンテンツ (AIGC) や自動運転などのインテリジェントコンピューティングシナリオに最適です。静的にプロビジョニングされた永続ボリューム (PV) として、Alibaba Cloud Container Service for Kubernetes (ACK) のワークロードに CPFS for Lingjun ファイルシステムをマウントできます。
CPFS for Lingjun は現在招待プレビュー中であり、特定のリージョンとゾーンでのみ利用可能です。この機能を使用するには、アカウントマネージャーにお問い合わせください。
仕組み
Container Storage Interface (CSI) コンポーネントに基づいて、ACK は PV と永続ボリューム要求 (PVC) を使用して、ワークロードが静的にプロビジョニングされた CPFS for Lingjun ボリュームをマウントできるようにします。CSI コンポーネントは、Pod がスケジュールされるノードタイプに基づいて、最適なマウントメソッドを自動的に選択します。
Virtual Storage Channel (VSC) マウント: Lingjun ノード専用で使用されます。このメソッドでは、CPFS for Lingjun と Lingjun サービスの両方への許可リストアクセスが必要です。このメソッドを使用するには、チケットを送信してください。
Virtual Private Cloud (VPC) マウント: 他のすべてのノードタイプで使用されます。このメソッドでは、ファイルシステム用に VPC マウントポイントを作成する必要があり、同じ VPC 内の任意のノードがマウントしてアクセスできるようになります。
前提条件
CPFS for Lingjun の制限について精通していること。
クラスターが Kubernetes バージョン 1.26 以降を実行していること。必要に応じてクラスターをアップグレードしてください。
次のストレージコンポーネントがクラスターにインストールされており、最小バージョン要件を満たしていること。
クラスターの [アドオン] ページで、コンポーネントのバージョンを確認し、コンポーネントをインストールまたは更新できます。
CSI コンポーネント (csi-plugin および csi-provisioner): csi-plugin のバージョンが 1.33.1 以降であること。必要に応じて csi-plugin を更新してください。
cnfs-nas-daemon: バージョンが 0.1.2 以降であること。
説明cnfs-nas-daemon コンポーネントは Elastic Fabric Controller (EFC) プロセスを管理し、リソースを大量に消費する可能性があります。そのリソース消費量は、期待されるストレージパフォーマンスに直接関係します。次のガイドラインとワークロードのパフォーマンスおよび実際のメモリ消費量に基づいて、[アドオン] ページでこのコンポーネントのリソース割り当てを調整してください。
CPU: cnfs-nas-daemon Pod の CPU 要件は、ノードの合計ネットワーク帯域幅によって決まります。帯域幅 1 Gbps ごとに 0.5 CPU コアが必要で、メタデータ管理には 1 CPU コアが必要です。この数式に従って CPU リクエストと制限を構成します。
メモリ: CPFS for Lingjun は、データキャッシングとファイルメタデータにシステムメモリを使用する Filesystem in Userspace (FUSE) を介してアクセスされます。ノードの合計メモリの約 15% を cnfs-nas-daemon Pod に割り当てることをお勧めします。
cnfs-nas-daemon DaemonSet のデフォルトの更新戦略は
OnDeleteです。CPU またはメモリ構成への変更を適用するには、各ノード上の既存の cnfs-nas-daemon Pod を手動で削除する必要があります。その後、Kubernetes は新しいリソース設定でそれらを自動的に再作成します。
bmcpfs-csi: これには、bmcpfs-csi-controller (ACK によって管理されるコントロールプレーンコンポーネント) と bmcpfs-csi-node (クラスターに DaemonSet としてデプロイされるノード側コンポーネント) が含まれます。
重要な考慮事項
VSC マウントを使用する場合、Pod は CPFS for Lingjun ファイルシステムと同じ
hpn-zoneにある Lingjun ノードにスケジュールする必要があります。Lingjun ノードは、初期化中に CPFS for Lingjun ファイルシステムに関連付ける必要があります。そうしないと、CSI コンポーネントを使用してファイルシステムをマウントすることはできません。
障害のために Lingjun ノードをオフラインにする前に、まずノードから Pod をドレインする必要があります。これを行わないと、クラスターのメタデータに不整合が生じ、適切にガベージコレクションできない孤立した Pod リソースが残ってしまいます。
同じ CPFS ファイルシステムの複数のサブディレクトリを、単一の Pod 内で個別の PV としてマウントしないでください。基盤となるドライバーの制限により、Pod のマウントと起動が失敗します。代わりに、PV と PVC を 1 つだけ作成して、CPFS ボリューム全体を一度マウントします。次に、Pod の
volumeMounts構成で、subPathフィールドを使用して、必要なサブディレクトリを個別にマウントします。subPath機能は、軽量のbind mountメカニズムに基づいて実装されており、余分なパフォーマンスオーバーヘッドは発生しません。
ステップ 1: CPFS ファイルシステムを作成する
CPFS for Lingjun ファイルシステムを作成するの手順に従ってファイルシステムを作成します。ファイルシステム ID を記録します。
(オプション) 非 Lingjun ノードにファイルシステムをマウントするには、クラスターノードと同じ VPC に VPC マウントポイントを作成します。マウントポイントのドメインを記録します。ドメインフォーマットは
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.comです。Pod が Lingjun ノードにスケジュールされている場合は、このステップをスキップしてください。デフォルトで VSC マウントメソッドが使用されます。
ステップ 2: PV と PVC を作成する
次の内容で
bmcpfs-pv-pvc.yamlという名前のファイルを作成します。volumeHandleの値をファイルシステム ID に置き換えます。VPC マウントポイントを使用する場合は、
vpcMountTargetの値をマウントポイントドメインに置き換えます。Lingjun ノードのみを使用している場合は、このフィールドを省略します。
apiVersion: v1 kind: PersistentVolume metadata: name: bmcpfs spec: accessModes: - ReadWriteMany capacity: storage: 10Ti claimRef: name: bmcpfs namespace: default csi: driver: bmcpfsplugin.csi.alibabacloud.com volumeAttributes: # このフィールドは、Pod が非 Lingjun ノードにスケジュールされている場合に必要です。Lingjun のみのクラスターの場合は省略します。 vpcMountTarget: cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com # volumeHandle をファイルシステム ID に置き換えます。 volumeHandle: bmcpfs-***** mountOptions: [] --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Ti volumeMode: Filesystem volumeName: bmcpfsPV パラメータ
パラメーター
説明
accessModesPV のアクセスモード。
capacity.storageボリュームの宣言された容量。これは宣言のみであり、実際の容量には影響しません。
csi.driverドライバーのタイプ。CPFS for Lingjun ファイルシステムをマウントする場合は、これを
bmcpfsplugin.csi.alibabacloud.comに設定します。csi.volumeAttributes.vpcMountTargetCPFS ファイルシステムの VPC マウントポイントのドメイン名。空のままにすると、非 Lingjun ノードでのマウントが失敗します。
Pod が Lingjun ノードにスケジュールされている場合は、このパラメーターを省略します。
csi.volumeHandleCPFS ファイルシステムの ID。
mountOptionsマウントパラメータ。
PVC パラメータ
パラメータ
説明
accessModesPVC が PV に要求するアクセスモード。これは PV のアクセスモードと一致する必要があります。
resources.requests.storagePod に割り当てられるストレージ容量。これは PV の容量より大きくすることはできません。
volumeModeマウントモード。これを
Filesystemに設定します。volumeNamePVC がアタッチされる PV の名前。
マニフェストを適用して PV と PVC を作成します。
kubectl apply -f bmcpfs-pv-pvc.yamlPVC が PV にバインドされていることを確認します。
kubectl get pvc bmcpfs予期される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE bmcpfs Bound bmcpfs 10Ti RWX <unset> 51sSTATUSはBoundである必要があります。
ステップ 3: アプリケーションで CPFS ファイルシステムをマウントする
ユースケース 1: CPFS ファイルシステム全体をコンテナーにマウントする
CPFS ファイルシステム全体をマウントするサンプルアプリケーションをデプロイするために、
cpfs-test.yamlという名前のファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-test labels: app: cpfs-test spec: replicas: 2 selector: matchLabels: app: cpfs-test template: metadata: labels: app: cpfs-test spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: # ボリュームマウントの設定 - name: pvc-cpfs mountPath: /data volumes: # ボリュームの設定 - name: pvc-cpfs persistentVolumeClaim: claimName: bmcpfsDeployment を作成します。
kubectl create -f cpfs-test.yamlPod のデプロイメントステータスを確認します。
kubectl get pod -l app=cpfs-test予期される出力:
NAME READY STATUS RESTARTS AGE cpfs-test-76b77d64b5-2hw96 1/1 Running 0 42s cpfs-test-76b77d64b5-dnwdx 1/1 Running 0 42s任意の Pod にログオンして、静的にプロビジョニングされた CPFS for Lingjun ボリュームがマウントされていることを確認します。
kubectl exec -it <pod-name> -- mount | grep /data期待される出力:
bindroot-f0a5c-******:cpfs-*******-vpc-****.cn-shanghai.cpfs.aliyuncs.com:/ on /data type fuse.aliyun-alinas-efc (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=1048576)
ユースケース 2: CPFS ファイルシステムのサブディレクトリをマウントする
共有ストレージシナリオでは、マルチテナンシーまたはマルチタスクのデータ隔離のために volumeMounts.subPath を使用します。これにより、複数のアプリケーション Pod が同じ CPFS ボリュームを共有でき、それぞれが独自の独立したディレクトリを持つことができます。
次の内容で
pod.yamlという名前のファイルを作成します。この例では、2 つのコンテナーを持つ単一の Pod を作成し、それぞれがbmcpfsを使用して同じ PVC (subPath) から異なるサブディレクトリをマウントします。Pod をマウントする際に、
subPathで指定されたサブディレクトリ (例:workspace/alpha) が CPFS ファイルシステムに存在しない場合、システムは自動的にそれを作成します。apiVersion: v1 kind: Pod metadata: name: cpfs-subpath-demo-pod spec: containers: - name: task-alpha-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # コンテナー内のマウントパス subPath: workspace/alpha # ボリューム内の workspace/alpha サブディレクトリのみをマウントします - name: task-beta-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # コンテナー内のマウントパスは同じにできます subPath: workspace/beta # ボリューム内の workspace/beta サブディレクトリのみをマウントします volumes: - name: cpfs-storage persistentVolumeClaim: claimName: bmcpfs # 以前に作成した PVC を参照しますPod をデプロイします。
kubectl apply -f pod.yaml各コンテナーに接続してファイルを作成することで、マウントとデータ隔離を確認します。一方のコンテナーで作成されたファイルは、もう一方のコンテナーでは表示されません。
task-alphaコンテナーでマウントとデータ隔離を確認します。task-alphaコンテナーに接続します。kubectl exec -it cpfs-subpath-demo-pod -c task-alpha-container -- /bin/shマウントされたファイルシステムを表示して、CPFS ボリュームが存在することを確認します。
df -h次の期待される出力は、共有ディレクトリ (
/share) がコンテナー内の/data/workspaceパスにマウントされていることを示しています。Filesystem Size Used Available Use% Mounted on ... 192.XX.XX.0:/share 10.0T 1.0G 10.0T 0% /data/workspace ...マウントポイントの親ディレクトリ構造を確認します。
ls -l /data/次の期待される出力は、
/data/ディレクトリにworkspaceという名前のサブディレクトリが存在することを示しています。total 4 drwxr-xr-x 2 root root 4096 Aug 15 10:00 workspaceマウントされたディレクトリにファイルを作成して、書き込み権限を確認します。
echo "hello from alpha" > /data/workspace/alpha.log exit
task-betaコンテナーでマウントとデータ隔離を確認します。task-betaコンテナーに接続します。kubectl exec -it cpfs-subpath-demo-pod -c task-beta-container -- /bin/shコンテナー内の
/data/workspaceマウントポイントにファイルを作成します。echo "hello from beta" > /data/workspace/beta.log/data/workspace/ディレクトリ内のファイルを確認します。ls -l /data/workspace/次の期待される出力は、
beta.logが作成され、alpha.logが存在しないことを示しています。これは、2 つのコンテナー間でデータが隔離されていることを示しています。total 4 -rw-r--r-- 1 root root 16 Aug 15 10:05 beta.log