動的ボリュームプロビジョニングメカニズムは、CPFS for Lingjun のオンデマンドストレージを自動的に提供し、手動による永続ボリューム (PV) 管理の複雑さを排除します。この方法は、複数のアプリケーションに対する並列読み書き操作をサポートします。特に、AI トレーニングやデータ分析などのシナリオに適しており、コード、構成ファイル、中間計算結果などのデータを効率的に共有できます。
事前準備
-
「CPFS for Lingjun の使用制限」をご参照ください。
-
クラスターが以下の要件を満たしていることを確認します。
-
クラスターバージョン: 1.26 以降。クラスターをアップグレードするには、「クラスターの手動アップグレード」をご参照ください。
-
ノードのオペレーティングシステム: Alibaba Cloud Linux 3。
-
以下のストレージコンポーネントがインストールされており、バージョン要件を満たしていること。
バージョンを確認、インストール、またはコンポーネントをアップグレードするには、アドオン管理 ページに移動します。
-
CSI アドオン (csi-plugin および csi-provisioner): v1.33.1 以降。アップグレードするには、「CSI アドオンの管理」をご参照ください。
-
cnfs-nas-daemon アドオン: 0.1.2 以降。
-
bmcpfs-csi コンポーネント: 1.35.1 以降。
これには、bmcpfs-csi-controller (コントロールプレーンコンポーネント、ACK によって管理) および bmcpfs-csi-node (ノードサイドコンポーネント、クラスターに DaemonSet としてデプロイ) が含まれます。
-
-
注意事項
-
VSC マウントを使用する場合、Pod が実行されているノードは、CPFS for Lingjun ファイルシステムインスタンスと同じ hpn-zone に存在する必要があります。
-
Lingjun ノードは、初期化中に CPFS for Lingjun ファイルシステムに関連付けられている必要があります。そうでない場合、CSI マウントは失敗します。
-
障害により Lingjun ノードをオフラインにする前に、そこからすべての Pod をドレインしてください。このステップをスキップすると、クラスターメタデータが一貫性のない状態になり、回復不能な Pod リソースが残されます。
-
単一の Pod で同じ CPFS for Lingjun ファイルシステムから複数のボリュームをマウントしないでください (たとえば、同じ
bmcpfsIdを含む StorageClass によって作成された複数の PV)。ネイティブプロトコルの制限により、同じ Pod が同じファイルシステムインスタンスを複数回マウントしようとすると (異なるサブディレクトリであっても)、予期せぬ動作につながります。
ステップ 1: CPFS ファイルシステムの作成
-
CPFS for Lingjun ファイルシステムを作成します。「CPFS for Lingjun ファイルシステムの作成」をご参照ください。ファイルシステム ID を記録します。
-
(オプション) Lingjun 以外のノードにマウントする場合は、VPC マウントターゲットを作成し (VPC マウントターゲットの作成)、マウントターゲットドメイン名を記録します。形式は
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.comです。Pod が Lingjun ノードにスケジュールされる場合、VSC マウントがデフォルトで使用されます。このステップはスキップします。
ステップ 2: StorageClass の作成
StorageClass オブジェクトをストレージテンプレートとして作成します。
-
以下の内容を使用して
sc.yamlを作成できます。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-bmcpfs-test provisioner: bmcpfsplugin.csi.alibabacloud.com parameters: # CPFS for Lingjun file system ID bmcpfsId: bmcpfs-29000z8xz3lf5nj***** # Specify the subdirectory within the file system # path: "/shared" # Allow subsequent expansion allowVolumeExpansion: true # Delete (automatic cleanup) or Retain (keep data) reclaimPolicy: Deleteパラメーターの説明:
パラメーター
必須
説明
bmcpfsIdはい
BMCPFS ファイルシステム ID。形式は
bmcpfs-xxxxxxxxxまたはcpfs-xxxxxxxxxです。pathいいえ
ファイルシステム内のサブディレクトリ。
-
指定されている場合: ボリュームは
{path}/{volumeName}/パスに作成されます。 -
指定されていない場合: ボリュームは
/{volumeName}/パスに作成されます。
allowVolumeExpansionいいえ
後で PVC を介した自動拡張を許可します。
現在のバージョンでは動的拡張はサポートされていません。これは予約済みパラメーターです。
reclaimPolicyいいえ
-
Delete(デフォルト): PVC を削除すると、バックエンドファイルシステム内のファイルセットが自動的に削除されます。 -
Retain: PVC を削除しても、バックエンドファイルシステム内のファイルセットは保持されます。手動でクリーンアップします。本番環境での使用を推奨します。
-
-
StorageClass を作成します。
kubectl apply -f sc.yaml
ステップ 3: PVC の作成
アプリケーションは PVC を介してボリュームをリクエストし、StorageClass を構成テンプレートとして参照します。
-
以下の内容を使用して
pvc.yamlを作成できます。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs-vsc namespace: default spec: accessModes: # CPFS for Lingjun volumes support multiple pods reading and writing simultaneously - ReadWriteMany resources: requests: # Supports large-capacity storage (Ti level) storage: 10Ti # Only supports Filesystem volumeMode: Filesystem # Specify the StorageClass created earlier storageClassName: alicloud-bmcpfs-testパラメーターの説明:
以下のパラメーターは必須です。
パラメーター
説明
accessModesReadWriteManyのみをサポートします。これは、複数の Pod が同時にマウントして読み書きできることを意味します。storageリクエストされたストレージ容量。Gi や Ti などの単位をサポートします。
volumeModeFilesystemのみをサポートします。storageClassName使用する
StorageClassを指定し、動的ボリューム作成をトリガーします。 -
PVC を作成します。
kubectl apply -f pvc.yaml -
以下のコマンドを実行して PVC ステータスを確認できます。
-
kubectl get pvc bmcpfs-vsc -n defaultを実行して PVC ステータスを表示します。STATUSがBoundの場合、システムが対応する PV を自動的に作成したことを示します。 -
kubectl describe pvc bmcpfs-vsc -n defaultを実行し、EventsにProvisioning succeededメッセージがあることを確認します。
-
ステップ 4: ワークロードの作成と PVC のマウント
PVC 作成後、サンプルワークロードをデプロイし、PVC にバインドされた PV をアプリケーションにマウントできます。
-
以下の内容を使用して
deploy.yamlを作成できます。apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-shared-example spec: # Create 3 replicas to verify shared storage for multiple pods replicas: 3 selector: matchLabels: app: cpfs-shared-app template: metadata: labels: app: cpfs-shared-app spec: # Ensure the pod can be scheduled to a Lingjun node tolerations: - key: node-role.alibabacloud.com/lingjun operator: Exists effect: NoSchedule # Optional: To schedule all pods to a specific node, uncomment this line and modify the node name # 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 # Mount the shared volume to the /data directory inside the container mountPath: /data # Simple lifecycle command to verify data writing and sharing # After the pod starts, it writes a file containing its hostname to the shared directory 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: # Reference the PVC created earlier claimName: bmcpfs-vsc -
Deployment を作成します。
kubectl apply -f deploy.yaml
リソース解放ガイド
予期せぬコストを回避し、データセキュリティを確保するために、以下の手順に従って未使用のリソースを解放します。
-
ワークロードの削除
-
操作: 関連する PVC を使用しているすべてのアプリケーション (Deployment や StatefulSet など) を削除して、アプリケーションを停止し、ボリュームをアンマウントします。
-
コマンド例:
kubectl delete deployment <your-deployment-name>
-
-
PVC の削除
-
操作: アプリケーションに関連付けられた PVC を削除します。バックエンドデータの処理は、
StorageClassのリクレームポリシー (reclaimPolicy) によって異なります。-
Retain(推奨): PVC を削除しても、バックエンドの CPFS for Lingjun ファイルセットとそのデータはそのまま残ります。 -
Delete: PVC を削除すると、バインドされた PV とバックエンドの CPFS for Lingjun ファイルセットが完全に削除されます。この操作は元に戻せません。注意して使用してください。
-
-
コマンド例:
kubectl delete pvc <your-pvc-name>
-
-
PV の削除 (リクレームポリシーが
Retainの場合)-
操作: リクレームポリシーが
Retainの場合、PVC を削除した後、PV はReleasedステータスに変わります。手動で PV を削除する必要があります。この操作は Kubernetes 内のリソース定義を削除するだけであり、バックエンドデータには影響しません。 -
コマンド例:
kubectl delete pv <your-pv-name>
-
-
StorageClass の削除 (オプション)
-
操作: このストレージクラスが不要になった場合、
StorageClassを削除できます。この操作はすでに作成されたボリュームには影響しません。 -
コマンド例:
kubectl delete sc <your-sc-name>
-
-
バックエンドの CPFS for Lingjun ファイルシステムの削除
-
操作: この操作は、ファイルシステム上のすべてのデータ (
Retainポリシーによって保持されたデータを含む) を完全に削除し、回復できません。実行する前に、ファイルシステムにビジネス依存関係がないことを確認します。詳細については、「ファイルシステムの削除」をご参照ください。
-
よくある質問
PVC が常に Pending ステータスであるのはなぜですか?
Pending ステータスの PVC は、通常、動的ボリュームプロビジョニングが失敗したことを示します。以下の手順に従ってトラブルシューティングを行います。
-
PVC イベントを確認します。これらは通常、失敗の理由を直接説明します。
kubectl describe pvc <your-pvc-name> -n <your-namespace>Eventsセクションのアラート情報に注意してください。一般的な理由には、次のものがあります。-
StorageClass not found:storageClassNameフィールドが正しくないか、対応する StorageClass が存在しません。 -
provisioning failedまたはfailed to create fileset: バックエンドストレージとの対話に問題があります。次のステップに進みます。
-
-
StorageClass と CSI ドライバー構成の確認
イベントログが構成の問題を示しているか、明確なエラーがない場合は、
StorageClass構成と CSI ドライバーのステータスを確認できます。# 1. Check the StorageClass YAML configuration kubectl get storageclass <your-sc-name> -o yaml # 2. Check if the CSI driver is registered in the cluster kubectl get csidriver bmcpfsplugin.csi.alibabacloud.com以下を確認できます。
-
StorageClass の構成:
provisionerフィールドが正しく、bmcpfsIdのparametersが正しく入力されており、ファイルシステム ID が存在します。 -
bmcpfs-csi ステータス:
get csidriverコマンドがエラーを報告するか、出力がない場合、ドライバーが正しくインストールされていないことを示します。クラスターの アドオン管理 ページで、bmcpfs-csi-controller、bmcpfs-csi-node、および cnfs-nas-daemon をインストールします。
-
Pod が常に ContainerCreating ステータスであるのはなぜですか、または MountVolume.Setup failed エラーがイベントに表示されるのはなぜですか?
このエラーは、Pod がノードにスケジュールされたものの、ノードでのボリュームのマウントに失敗したことを示します。このトラブルシューティングプロセスに従ってください。
-
Pod イベントを表示して原因を特定する
describe podコマンドを使用して Pod のイベントログを表示できます。kubectl describe pod <pod-name> -n <your-namespace>Eventsセクションで、FailedMountやMountVolume.Setup failedのようなWarningメッセージに注目してください。 -
マウントの前提条件を確認する
PVC ステータスが
Boundであることを確認します。Pod は正常にバインドされたボリュームのみをマウントできます。kubectl get pvc <your-pvc-name>PVC の
STATUSはBoundである必要があります。Pendingの場合、ボリューム作成中に問題があることを示します。「PVC が常に Pending ステータスであるのはなぜですか?」をご参照ください。 -
ノード CSI プラグインの詳細ログを確認する
PVC が
Boundであり、Pod が正しいノードにある場合、ノードサイドのcsi-pluginコンポーネントによって実行されたマウント操作をさらに確認できます。# View the csi-plugin logs on the pod's node to get the final failure reason 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 エラーなど、最下位レベルのエラーメッセージが含まれています。