ACK を使用すると、CNFS を介して汎用 CPFS ファイルシステムを動的ボリュームとしてマウントできます。StorageClass を構成すると、各ワークロードは独立したデータ隔離された永続ボリューム (PV) を自動的に取得し、手動でのストレージ管理が不要になります。
ワークフロー
動的ボリュームを使用する場合、アプリケーションが永続ボリューム要求 (PVC) を作成すると、システムは指定された StorageClass に基づいて永続ボリューム (PV) を自動的にプロビジョニングします。この方法により、事前プロビジョニングが不要になり、自動ボリューム拡張がサポートされます。
クラスターで CPFS 動的ボリュームをマウントするワークフローを次の図に示します。
|
前提条件
コンポーネントがバージョン要件を満たしていることを確認してください。
クラスターのアップグレードについては、「ACK クラスターのアップグレード」をご参照ください。
1.26 以降
CSI コンポーネントのバージョンが v1.32.2-757e24b-aliyun 以降であることを確認してください。
CSI コンポーネントのアップグレードについては、「CSI コンポーネントの管理」をご参照ください。
cnfs-nas-daemon コンポーネントがインストールされており、cnfs-nas-daemon を有効にするために csi-plugin コンポーネントの FeatureGate に
AlinasMountProxy=trueを追加していること。詳細については、「cnfs-nas-daemon コンポーネントの管理」をご参照ください。
1.26 より前のバージョン
CSI コンポーネントのバージョンが v1.24.11-5221f79-aliyun 以降であることを確認してください。
CSI コンポーネントのアップグレードについては、「CSI コンポーネントの管理」をご参照ください。
クライアント依存関係をインストールし、csi-plugin コンポーネントを再起動します。
クラスターと同じ VPC 内に汎用 CPFS ファイルシステムとそれに対応するプロトコルサービスを作成し、マウントターゲットアドレスを取得していること。詳細については、「プロトコルサービスの作成とマウントターゲットアドレスの取得」をご参照ください。
最適なパフォーマンスを得るには、CPFS プロトコルサービスのマウントターゲットとクラスターを同じ vSwitch に配置してください。
使用制限
CPFS 汎用エディションは、一部のリージョンでのみ利用可能です。詳細については、「CPFS 汎用エディションの利用可能リージョン」をご参照ください。
CPFS ファイルシステムは、同じ VPC 内のクラスターにのみマウントできます。
CPFS の使用制限の詳細については、「使用制限」をご参照ください。
ステップ 1: CNFS オブジェクトの作成
既存の CPFS ファイルシステムをクラスターに登録するために CNFS オブジェクトを作成します。
次のテンプレートを使用して、
cnfs.yamlという名前のファイルを作成します。apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-nfs-cpfs spec: # バックエンドストレージタイプを CPFS として指定します。 type: cpfs # この CNFS オブジェクトを削除しても、バックエンドの CPFS ファイルシステムは削除されません。 reclaimPolicy: Retain parameters: # CPFS プロトコルサービスのマウントターゲットのドメイン名。 protocolServer: cpfs-xxxx.xxxx.cpfs.aliyuncs.com # NFS クライアントを使用してボリュームをマウントします。 useClient: NFSClientパラメーター:
パラメーター
説明
spec.typeバックエンドストレージタイプ。これを
cpfsに設定します。spec.reclaimPolicyリクレイムポリシー。
Retainのみがサポートされています。この設定により、CNFS オブジェクトが削除されてもバックエンドの CPFS ファイルシステムが削除されるのを防ぎます。spec.parameters.protocolServerspec.parameters.useClientNFS クライアントを使用してマウントするには、これを
NFSClientに設定します。CNFS オブジェクトを作成します。
kubectl apply -f cnfs.yamlCNFS オブジェクトのステータスを確認し、
Availableであることを確認します。kubectl get cnfs cnfs-nfs-cpfs -o jsonpath='{.status.status}'
ステップ 2: StorageClass の作成
動的プロビジョニングのテンプレートとして機能し、作成した CNFS オブジェクトを参照する StorageClass を作成します。
次のテンプレートを使用して、
sc.yamlという名前のファイルを作成します。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: cnfs-nfs-cpfs-sc # マウントオプション。 mountOptions: - nolock,tcp,noresvport - vers=3 parameters: # サブディレクトリベースの PV を作成します。 volumeAs: subpath # 以前に作成した CNFS オブジェクトを参照します。 containerNetworkFileSystem: "cnfs-nfs-cpfs" # 汎用 CPFS プロトコルサービスのエクスポートパス。 path: "/share" # PVC が削除されたときのデータ処理ポリシー。`true` はデータを削除する代わりにアーカイブします。 archiveOnDelete: "true" provisioner: nasplugin.csi.alibabacloud.com # PV リクレイムポリシー。この例では Retain のみがサポートされています。 reclaimPolicy: Retain # ボリューム拡張を許可します。 allowVolumeExpansion: trueパラメーター:
パラメーター
説明
mountOptionsマウントオプション。例に示されているデフォルト値を使用できます。
parameters.volumeAssubpath: サブパスモード。各 PV は CPFS ファイルシステム上の独立したサブディレクトリに対応し、データ隔離を提供します。sharepath: シェアパスモード。この StorageClass から作成されたすべての PV は、CPFS ファイルシステム上の同じディレクトリを共有します。
parameters.containerNetworkFileSystem参照する CNFS オブジェクト。
parameters.path汎用 CPFS プロトコルサービスのエクスポートパス (例:
/share)。/share/dirのようにサブディレクトリを指定することもできます。現在、通常のディレクトリのみがサポートされています。ファイルセットはサポートされていません。
parameters.archiveOnDeleteこのパラメーターは、
volumeAsがsubpathに設定され、reclaimPolicyがDeleteに設定されている場合にのみ有効になります。汎用 CPFS は共有ストレージサービスです。このパラメーターは、削除前の二次確認を提供します。
PVC が削除されたときにサブディレクトリデータがどのように処理されるかを制御します。
true(デフォルト): サブディレクトリは削除される代わりにアーカイブされ、archived-{pvName}.{timestamp}に名前が変更されます。データを手動で回復できます。false: サブディレクトリとそのすべてのファイルを完全に削除します。このデータは回復できません。この操作は、CPFS ファイルシステム自体ではなく、CPFS サブディレクトリとそのファイルを削除するだけです。CPFS ファイルシステムを削除するには、「ファイルシステムの削除」をご参照ください。
reclaimPolicycsi-provisioner がマネージドコンポーネントである場合、そのバージョンはv1.34.1以降である必要があります。アンマネージドコンポーネントにはバージョン制限はありません。
このパラメーターは、
volumeAsがsubpathに設定されている場合にのみ有効になります。PV のリクレイムポリシー。PVC が削除された後のリソースの処理方法を制御します。
Delete: PVC が削除されると、PV を自動的に解放します。archiveOnDeleteパラメーターは、バックエンドのサブディレクトリデータも削除するかどうかを決定します。Retain: PVC が削除されても、PV は保持され、バックエンドデータは影響を受けません。リソースを手動でクリーンアップする必要があります。このオプションは、高いデータセキュリティ要件を持つシナリオに適しています。
allowVolumeExpansionこのパラメーターが有効になっている場合、CPFS ボリュームは自動的に拡張できます。
StorageClass を作成します。
kubectl apply -f sc.yamlStorageClass が正常に作成されたことを確認します。
kubectl get sc cnfs-nfs-cpfs-sc期待される出力:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE cnfs-nfs-cpfs-sc nasplugin.csi.alibabacloud.com Retain Immediate true 9s
ステップ 3: アプリケーションの作成
ワークロードを作成し、作成した StorageClass を volumeClaimTemplates セクションで指定します。
次のテンプレートを使用して、
sts.yamlという名前のファイルを作成します。apiVersion: apps/v1 kind: StatefulSet metadata: name: cnfs-nfs-cpfs-sts spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: pvc # ストレージボリュームをコンテナ内の /data ディレクトリにマウントします。 mountPath: /data # PVC テンプレートを定義します。StatefulSet コントローラーは、各 Pod 用に PVC を動的に作成します。 volumeClaimTemplates: - metadata: name: pvc spec: accessModes: [ "ReadWriteOnce" ] # 以前に作成した StorageClass を参照します。 storageClassName: "cnfs-nfs-cpfs-sc" resources: requests: storage: 50Giアプリケーションを作成します。
kubectl apply -f sts.yamlPod が実行中ステータスであることを確認します。
kubectl get pod | grep cnfs-nfs-cpfs-sts期待される出力:
cnfs-nfs-cpfs-sts-0 1/1 Running 0 11s cnfs-nfs-cpfs-sts-1 1/1 Running 0 9sPod が CPFS ストレージボリュームをマウントしていることを確認します。
kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep nfs次の出力は、CNFS が NFS クライアントを使用して CPFS ファイルシステムを正常にマウントしたことを示しています。
cpfs-********-********.cn-shanghai.cpfs.aliyuncs.com:/share/nas-804e8cb1-2355-4026-87fc-ee061e14f5f9 on /data type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,port=30000,timeo=600,retrans=2,sec=sys,mountaddr=127.XX.XX.255,mountvers=3,mountport=30000,mountproto=tcp,local_lock=all,addr=127.XX.XX.255)
ステップ 4: 結果の検証
アプリケーションが作成されると、システムは自動的にボリュームをプロビジョニングしてマウントします。
自動プロビジョニングの検証
PVC のステータスを確認し、2 つの PVC が自動的に作成され、動的に生成された PV にバインドされていることを確認します。
kubectl get pvc -l app=nginx期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-cnfs-nfs-cpfs-sts-0 Bound nas-8d2530eb-fcf9-4ad5-b5f8-bae02a1***** 50Gi RWO cnfs-nfs-cpfs-sc <unset> 63s
pvc-cnfs-nfs-cpfs-sts-1 Bound nas-e84cadaf-ce35-4745-8cbb-2a80026***** 50Gi RWO cnfs-nfs-cpfs-sc <unset> 61sPod ステータスとマウントポイントの検証
コンテナ内のマウントポイントを確認し、隔離された CPFS サブディレクトリが正常にマウントされていることを確認します。
kubectl exec cnfs-nfs-cpfs-sts-0 -- mount | grep /data期待される出力のマウントパスには、自動生成された PV 名 (例: nas-804e8cb1-xxxx) が含まれており、隔離されたサブディレクトリがマウントされていることを示しています。
cpfs-....aliyuncs.com:/share/nas-804e8cb1-2355-4026-87fc-ee061e1****** on /data type nfs (rw,...)ボリューム隔離の検証
異なる Pod 用に作成された動的ボリュームが互いに隔離されていることを確認します。
cnfs-nfs-cpfs-sts-0に一時ファイルを作成します。kubectl exec cnfs-nfs-cpfs-sts-0 -- touch /data/test.txtcnfs-nfs-cpfs-sts-1の `/data` ディレクトリを確認し、テストファイルが存在しないことを確認します。kubectl exec cnfs-nfs-cpfs-sts-1 -- ls /data期待される出力にはファイルが含まれていません。これにより、動的に作成されたストレージボリュームが隔離されており、データが共有されていないことが確認されます。
本番環境のベストプラクティス
データ保護: PVC の削除による偶発的なデータ損失を防ぐため、StorageClass で
reclaimPolicyをRetainに、archiveOnDeleteをtrueに設定します。
リソースのクリーンアップ
予期せぬ課金を回避し、データセキュリティを確保するために、不要になったリソースを解放するには、この手順に従ってください。
ワークロードの削除
操作: StatefulSet など、関連する PVC を使用するすべてのアプリケーションを削除します。この操作により、実行中の Pod が停止し、ストレージボリュームがアンマウントされます。
コマンド例:
kubectl delete statefulset <your-statefulset-name>
PVC の削除
操作: アプリケーションに関連付けられた PVC を削除します。バックエンドデータの処理は、
volumeAs、reclaimPolicy、およびarchiveOnDeleteの組み合わせによって決定されます。volumeAs: subpath各 PVC は独立したサブディレクトリに対応します。削除動作は次のとおりです。
reclaimPolicy: Retain: PV は保持され、CPFS サブディレクトリ内のデータは変更されません。手動でクリーンアップを実行する必要があります。reclaimPolicy: Delete+archiveOnDelete: "true": PV は自動的に解放されます。サブディレクトリはアーカイブされ、archived-{pvName}.{timestamp}に名前が変更され、データは失われません。reclaimPolicy: Delete+archiveOnDelete: "false": PV を自動的に解放し、サブディレクトリとそのファイルを完全に削除します。このデータは回復できません。注意して進めてください。
volumeAs: sharepath複数の PVC が同じディレクトリを共有します。PVC を削除しても、バックエンドディレクトリやそのデータには影響しません。
reclaimPolicyおよびarchiveOnDeleteパラメーターは効果がありません。
構成に関係なく、CPFS ファイルシステム自体は削除されません。CPFS ファイルシステムを削除するには、「ファイルシステムの削除」をご参照ください。
コマンド例:
kubectl delete pvc <your-pvc-name>
Kubernetes ストレージリソースの削除
この操作は、クラスター内のリソース定義を削除するだけです。バックエンドの CPFS ファイルシステムは削除されません。
PV の削除
操作:
reclaimPolicyがRetainに設定されている場合、PVC が削除された後、PV のステータスはReleasedに変更されます。データが不要になったことを確認したら、PV を手動で削除できます。コマンド例:
kubectl delete pv <your-pv-name>
StorageClass の削除
操作: このタイプのストレージが不要になった場合は、対応する StorageClass を削除できます。
コマンド例:
kubectl delete sc <your-storageclass-name>
CNFS オブジェクトの削除
操作: クラスターで CPFS ファイルシステムを使用する必要がなくなった場合は、CNFS オブジェクトを削除できます。CNFS オブジェクトを削除しても、バックエンドの CPFS ファイルシステムは削除されません。
コマンド例:
kubectl delete cnfs <your-cnfs-name>