動的ボリュームを使用すると、PersistentVolume を手動で管理することなく、オンデマンドで CPFS for Lingjun ストレージをプロビジョニングできます。複数のアプリケーションが並列に読み書きできるため、コード、設定ファイル、中間計算結果を共有する必要がある AI トレーニングやビッグデータ分析のワークロードに適しています。
制限事項
これらの制約に違反すると、マウントの失敗や、クラスターが回復不能な状態に陥る原因となります。
-
VSC マウントには同じ hpn-zone が必要:Pod のノードは、CPFS for Lingjun ファイルシステムと同じ hpn-zone に存在する必要があります。
-
ノードの初期化:Lingjun ノードは、初期化時に CPFS for Lingjun ファイルシステムに関連付ける必要があります。これを省略すると、CSI マウントが失敗します。
-
Pod あたり 1 つのファイルシステム:1 つの Pod に、同じ CPFS for Lingjun ファイルシステムから複数のボリュームをマウントしないでください (例:同じ
bmcpfsIdを持つ複数の PersistentVolume)。ネイティブプロトコルは、異なるサブディレクトリであっても、同じファイルシステムを 1 つの Pod 内で複数回マウントすることをサポートしていません。 -
ノードをオフラインにする前のドレイン:障害が発生した Lingjun ノードをオフラインにする前に、すべての Pod をドレインしてください。これを省略すると、回復不能な Pod リソースと、クラスターメタデータの不整合が残ります。
前提条件
以下の要件を満たしていることを確認してください。
-
クラスターバージョン 1.26 以降 (アップグレードガイド)。
-
Alibaba Cloud Linux 3 を実行しているノード。
-
以下のストレージアドオンは、最小バージョンである必要があります。[アドオン] ページでインストールまたはアップグレードしてください。
コンポーネント 最小バージョン CSI アドオン (csi-plugin および csi-provisioner) v1.33.1 cnfs-nas-daemon アドオン 0.1.2 bmcpfs-csi アドオン (ACK マネージドコントロールプレーン上の bmcpfs-csi-controller と、クラスターノード上に DaemonSet としてデプロイされる bmcpfs-csi-node) 1.35.1
cnfs-nas-daemon のリソース設定
cnfs-nas-daemon は Elastic File Client (EFC) プロセスを管理し、ストレージパフォーマンスに直接影響します。そのリソースは [アドオン] ページで設定します:
-
CPU:帯域幅 1 Gb/s あたり 0.5 コア、さらにメタデータ管理用に 1 コア。例:100 Gb/s NIC →
100 × 0.5 + 1 = 51コア。 -
メモリ:ノードの総メモリの 15%。CPFS for Lingjun は FUSE を使用するため、データキャッシュとファイルメタデータの両方がメモリを消費します。
実際のワークロードに基づいてリソース制限を調整してください。
cnfs-nas-daemon は OnDelete 更新ストラテジーを使用します。[アドオン] ページで設定を変更した後は、オフピーク時に各ノードで cnfs-nas-daemon ポッドを手動で削除して変更を適用してください。
-
ホットアップグレード非対応ノード:ハードウェア割り込みが発生します。アプリケーション Pod は失敗するため、手動で削除する必要があります。その後、自動的に再起動して復旧します。
-
ホットアップグレード対応ノード:Pod は自動的に復旧します。ホットアップグレードには、カーネル 5.10.134-18 以降、bmcpfs-csi-controller および bmcpfs-csi-node 1.35.1 以降、cnfs-nas-daemon 0.1.9-compatible.1 以降が必要です。
ステップ 1:CPFS ファイルシステムの作成
-
CPFS for Lingjun ファイルシステムを作成し、ファイルシステム ID を記録します。
-
(オプション) Lingjun 以外のノードにマウントする場合は、クラスターノードと同じ VPC 内に VPC マウントターゲットを作成します。マウントターゲットのドメイン名 (形式:
cpfs-*-vpc-*.<Region>.cpfs.aliyuncs.com) を記録します。すべての Pod が Lingjun ノード上で実行される場合、VSC (Virtual Storage Controller) マウントがデフォルトで適用されるため、この手順はスキップできます。
続行する前に、CPFS for Lingjun の制限事項を確認してください。
ステップ 2:StorageClass の作成
StorageClass は、ファイルシステム ID や再利用ポリシーなどのプロビジョニングパラメーターを定義します。
-
sc.yamlを作成します。パラメーター 必須 説明 bmcpfsIdはい CPFS for Lingjun ファイルシステム ID。形式: bmcpfs-xxxxxxxxxまたはcpfs-xxxxxxxxx。pathいいえ ファイルシステム内のサブディレクトリ。ボリュームは {path}/{volumeName}/配下に作成されます。デフォルトは/{volumeName}/です。allowVolumeExpansionいいえ 予約済みパラメーター。現在のバージョンでは動的拡張をサポートしていません。 reclaimPolicyいいえ Delete(デフォルト):PersistentVolumeClaim が削除されると、バックエンドのファイルセットを削除します。Retain:ファイルセットを保持するため、手動でのクリーンアップが必要です。本番環境ではRetainの使用を推奨します。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-bmcpfs-test provisioner: bmcpfsplugin.csi.alibabacloud.com parameters: # 必須: CPFS for Lingjun ファイルシステム ID (形式: bmcpfs-xxxxxxxxx または cpfs-xxxxxxxxx) bmcpfsId: bmcpfs-29000z8xz3lf5nj***** # オプション: ファイルシステム内のサブディレクトリ。ボリュームは {path}/{volumeName}/ 配下に作成されます # path: "/shared" # 予約済みパラメーター — 現在のバージョンでは動的拡張をサポートしていません allowVolumeExpansion: true # Delete (デフォルト): PersistentVolumeClaim が削除されると自動的にファイルセットを削除します # Retain (本番環境推奨): ファイルセットを保持します。手動でのクリーンアップが必要です reclaimPolicy: Delete -
StorageClass を適用します。
kubectl apply -f sc.yaml期待される出力:
storageclass.storage.k8s.io/alicloud-bmcpfs-test created
ステップ 3:PersistentVolumeClaim の作成
PersistentVolumeClaim は StorageClass を参照して、動的にプロビジョニングされたストレージをリクエストします。
-
pvc.yamlを作成します。パラメーター 説明 accessModesReadWriteManyのみ。複数の Pod からの同時アクセスを許可します。storageリクエストするストレージ容量。Gi や Ti などの単位をサポートします。 volumeModeFilesystemのみがサポートされています。storageClassNameStorageClass 名。動的ボリューム作成をトリガーします。 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs-vsc namespace: default spec: accessModes: - ReadWriteMany # 複数の Pod 間での同時読み書きをサポートします resources: requests: storage: 10Ti # 大容量ストレージ (Ti レベル) をサポートします volumeMode: Filesystem # Filesystem のみがサポートされています storageClassName: alicloud-bmcpfs-test # ステップ 2 で作成した StorageClass と一致する必要があります -
PersistentVolumeClaim を適用します。
kubectl apply -f pvc.yaml -
PersistentVolumeClaim がバインドされたことを確認します。
kubectl get pvc bmcpfs-vsc -n default期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE bmcpfs-vsc Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 10Ti RWX alicloud-bmcpfs-test 30sSTATUSがBoundの場合、PersistentVolume が自動的に作成されたことを示します。プロビジョニングの状況を確認します。kubectl describe pvc bmcpfs-vsc -n defaultイベントでProvisioning succeededメッセージを確認します。
ステップ 4:ワークロードのデプロイと PersistentVolumeClaim のマウント
以下の Deployment は、単一の CPFS for Lingjun ボリュームを共有する 3 つのレプリカを実行します。
-
deploy.yamlを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-shared-example spec: replicas: 3 # 3 つのレプリカで、複数の Pod 間で共有ストレージが機能することを検証します selector: matchLabels: app: cpfs-shared-app template: metadata: labels: app: cpfs-shared-app spec: tolerations: - key: node-role.alibabacloud.com/lingjun operator: Exists effect: NoSchedule # オプション: すべての Pod を特定のノードに固定する場合は、コメントを解除してノード名を設定してください # nodeName: cn-hangzhou.10.XX.XX.226 containers: - name: app-container image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: pvc-cpfs mountPath: /data # 共有ボリュームはコンテナ内の /data にマウントされます lifecycle: postStart: exec: command: - /bin/sh - -c - > echo "Data written by $(hostname)" > /data/$(hostname).txt && echo "Deployment is running, check shared data in /data." && sleep 3600 volumes: - name: pvc-cpfs persistentVolumeClaim: claimName: bmcpfs-vsc # ステップ 3 で作成した PersistentVolumeClaim を参照します -
Deployment を適用します。
kubectl apply -f deploy.yaml期待される出力:
deployment.apps/cpfs-shared-example created
リソースのクリーンアップ
予期しないコストを回避し、データの安全性を確保するために、この順序でリソースを削除してください。
-
ワークロードの削除 — PersistentVolumeClaim を使用しているすべてのアプリケーションを停止します。これによりボリュームがアンマウントされます。
kubectl delete deployment <your-deployment-name> -
PersistentVolumeClaim の削除 — 結果は StorageClass の
reclaimPolicyによって異なります。-
Retain(推奨):CPFS for Lingjun のファイルセットとデータは保持されます。次の手順で PersistentVolume を削除してください。 -
Delete:バインドされた PersistentVolume とバックエンドのファイルセットが完全に削除されます。この操作は元に戻せません。
kubectl delete pvc <your-pvc-name> -
-
PersistentVolume の削除 (
reclaimPolicyがRetainの場合のみ) — PersistentVolumeClaim の削除後、PersistentVolume はReleasedステータスになります。Kubernetes リソースをクリーンアップするために、この PV を削除します。この操作はバックエンドのデータに影響しません。kubectl delete pv <your-pv-name> -
(オプション) StorageClass の削除 — 不要になった場合は削除します。既存のボリュームには影響しません。
kubectl delete sc <your-sc-name> -
CPFS for Lingjun ファイルシステムの削除 —
Retainポリシーで保持されたデータを含め、すべてのデータが完全に削除されます。依存関係がないことを確認した上で、ファイルシステムを削除してください。
トラブルシューティング
PersistentVolumeClaim が Pending ステータスのままになる
PersistentVolumeClaim が Pending のままの場合、プロビジョニングに失敗しています。原因は通常、PersistentVolumeClaim のイベントで特定できます。
kubectl describe pvc <your-pvc-name> -n <your-namespace>
Events で警告を確認してください。一般的な原因は次のとおりです。
-
StorageClass not found:storageClassNameが正しくないか、StorageClass が存在しません。 -
provisioning failedまたはfailed to create fileset:バックエンドストレージの問題です。以下の手順で確認を続けてください。
イベントが設定の問題を示している場合は、StorageClass を確認し、CSI ドライバーの登録を検証してください。
# StorageClass の設定を確認します
kubectl get storageclass <your-sc-name> -o yaml
# CSI ドライバーが登録されていることを確認します
kubectl get csidriver bmcpfsplugin.csi.alibabacloud.com
以下の点を確認してください。
-
provisionerがbmcpfsplugin.csi.alibabacloud.comと一致していること。 -
bmcpfsIdが正しく、ファイルシステムが存在すること。 -
get csidriverの出力がない場合、ドライバーはインストールされていません。[アドオン] ページから bmcpfs-csi-controller、bmcpfs-csi-node、および cnfs-nas-daemon をインストールしてください。
Pod が ContainerCreating 状態のままになる、または MountVolume.Setup failed エラーが発生する
これは、Pod がノードに到達したものの、ボリュームのマウントに失敗したことを示します。以下の手順で原因を特定してください。
-
Pod のイベントを確認します。
kubectl describe pod <pod-name> -n <your-namespace>EventsでWarningメッセージ (FailedMountやMountVolume.Setup failedなど) を確認してください。 -
PersistentVolumeClaim がバインドされていることを確認します。
kubectl get pvc <your-pvc-name>STATUSはBoundである必要があります。Pendingの場合は、「PersistentVolumeClaim が Pending ステータスのままになる」を参照してください。 -
バインドされている場合は、ノード側の CSI プラグインのログを確認します。
kubectl get pods -n kube-system -l app.kubernetes.io/name=bmcpfs-csi-driver \ --field-selector spec.nodeName=<nodeName> \ -o name | xargs kubectl logs -n kube-system -c csi-pluginこれらのログから、ネットワーク接続、マウントターゲットの権限、I/O エラーなどの情報を確認できます。