AI トレーニングやデータ分析などのタスクを開始する前に、Object Storage Service (OSS) に格納されている大量のコールドデータを、オンデマンドで CPFS for Lingjun やクラウドディスクなど、パフォーマンス専有型ストレージボリュームにプリフェッチします。その後、計算タスクはこれらのパフォーマンス専有型ボリュームから高速に直接データを読み取ることができます。タスク完了後、ストレージボリュームは自動的に解放され、計算処理の高速化とコスト最適化の両立が実現されます。
仕組み
機能の実装
本機能は、Kubernetes Volume Populators を活用し、ACK の storage-operator によって管理されます。カスタムリソース OSSVolumePopulator (OSSVP) を参照する永続ボリューム要求 (PVC) を作成すると、storage-operator がそのリクエストをインターセプトし、データのプリフェッチ操作を実行します。
対象ボリュームタイプに応じて、生成は以下のいずれかのモードで行われます。
モード | サポートされるストレージタイプ | 説明 |
| CPFS for Lingjun | storage-operator は、CPFS のネイティブのデータフロー機能を呼び出して、データを投入します。 このモードではクラスターの計算リソースを消費せず、効率性が高くなります。 |
| クラウドディスクや CPFS 一般用途版など、その他のストレージタイプ | storage-operator が このモードではクラスターの計算リソースを消費します。 |
データのプリフェッチが正常に完了すると、PVC ステータスは Pending から Bound に変更されます。この時点で、アプリケーション Pod が PVC をマウントし、プリフェッチ済みのデータにアクセスできます。
主なユースケース
本機能は、以下の 2 つの主要なユースケースをサポートします。
区分 | ||
適用範囲 | AI モデルのトレーニングおよび推論など、高スループットかつ読み取り中心のワークロードで、OSS アクセスのパフォーマンスボトルネックを解消することを目的としています。 | 並列バッチ処理やデータパイプラインタスクなど、隔離された読み書き可能ワークスペースを必要とするワークロードで、同時実行時の競合を解消し、データの隔離を保証することを目的としています。 |
技術的実装 | ネイティブデータ投入には、 | クラウドディスクなど、動的プロビジョニング可能な任意のストレージを |
主な特徴 |
|
|
ワークフロー
VolumePopulator を使用する際の基本手順は、どちらのモードでも同様です。
|
事前準備
クラスターが Kubernetes バージョン 1.26 以降を実行しており、CSI プラグインを使用していることを確認してください。本機能は動的プロビジョニング可能なボリュームに依存しており、動的プロビジョニング可能なストレージのみをサポートします。
クラスターのアップグレードについては、「クラスターの手動アップグレード」をご参照ください。FlexVolume から CSI への移行については、「csi-compatible-controller を使用した FlexVolume から CSI への移行」をご参照ください。
storage-operator をバージョン v1.35.1 以降にアップグレードし、
VolumePopulatorFeature Gate を有効化します。他の Feature Gate が既に有効化されている場合は、次の形式で指定してください:
xxxxxx=true,yyyyyy=false,VolumePopulator=true
シナリオ 1: CPFS for Lingjun 共有ボリュームへのデータプリフェッチ
本ソリューションは、モデルのトレーニングおよび推論など、読み取り専用かつ高スループットを要するシナリオを対象としています。CPFS for Lingjun のデータフロー機能を活用して、OSS から CPFS for Lingjun ボリュームへモデルをオンデマンドでプリフェッチし、複数の GPU タスクが高速にデータを読み取れるようにします。
事前準備
CPFS for Lingjun 動的ボリュームの利用に関する事前準備 を完了してください。
機能の詳細および制限事項については、CPFS for Lingjun データフロー(招待プレビュー) のドキュメントをご参照ください。
重要CPFS for Lingjun データフローは招待プレビュー段階です。大規模クラスターではパフォーマンスが変動する可能性があります。問題が発生した場合や製品に関するご意見・ご要望がある場合は、DingTalk グループ 35532895 に参加してご連絡ください。
1. OSS バケットに特定のタグを設定
オブジェクトタグ付け操作 の手順に従い、OSS バケットに キー cpfs-dataflow および 値 true のタグを追加してください。
ボリューム作成に失敗する可能性があるため、使用中はこのタグを削除または変更しないでください。
2. OSSVolumePopulator (OSSVP) の作成
アプリケーションおよび PVC と同じ名前空間に OSSVolumePopulator リソースを作成し、OSS データソースを定義します。
apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
name: qwen3-32b
# アプリケーションおよび PVC と同じ名前空間である必要があります
namespace: bmcpfs-dataflow-demo
spec:
bucket: <your-bucket-name>
region: cn-hangzhou
endpoint: oss-cn-hangzhou-internal.aliyuncs.com
path: /Qwen3-32B/
# CPFS for Lingjun ボリューム専用で、そのデータフロー機能を活用
mode: bmcpfs-dataflow
# bmcpfs-dataflow モード向けのオプション詳細設定
# この例ではデフォルト設定を推奨します。特別な要件がない場合は無視してください。
# bmcpfsDataflow:
# 最大データフロースループット (MB/s)。選択肢:600、1200、1500。デフォルト:600
# throughput: 1200
# 暗号化転送を有効化。デフォルト:空 (無効)
# sourceSecurityType: SSL
# データプリフェッチモード。デフォルト:metadataAndData(完全プリフェッチ)
# metadata のみのプリフェッチには metadata を指定
# dataType: metadataAndDataパラメーターの説明:
パラメーター名 | 説明 | オプション | デフォルト |
| OSSVolumePopulator は、アプリケーションおよび PVC と同じ名前空間に配置する必要があります。 | いいえ | 該当なし |
| OSS バケット名。 | いいえ | 該当なし |
| OSS リージョン。 | いいえ | 該当なし |
| OSS サービス エンドポイント アドレス。 | いいえ | 該当なし |
| OSS バケット内のパスプレフィックス(例: | はい |
|
| 操作モード。選択肢:
| はい |
|
| CPFS for Lingjun データフローの最大スループット (MB/s)。選択肢: | はい | CPFS for Lingjun データフローのデフォルト値と同一 |
| データ転送のセキュリティプロトコルタイプ(例: | はい | 暗号化は無効 |
| 同期するデータの種類を指定:
| はい |
|
3. StorageClass および PVC の準備
CPFS for Lingjun を参照する StorageClass を作成し、その後、PVC を作成して、前述の OSSVP を dataSourceRef を使用して参照します。
StorageClass の作成 | この StorageClass を使用して作成される各動的ボリュームは、バックエンドの CPFS for Lingjun 上に自動的に Fileset を作成します。同じ StorageClass を使用しながら、OSSVolumePopulator の作成時に異なる OSSVP リソースを作成することで、異なる OSS データセットを異なる動的ボリュームにプリフェッチできます。 |
PVC の作成 | StorageClass で |
4. データの事前入力ステータスを確認する
データフローの進捗確認: データ投入中、 PVC のステータスは Pending のままで、完了後に Bound に変わります。
bmcpfs-dataflow モードでは、以下のコマンドを使用して CPFS for Lingjun データフローのリアルタイム進行状況を確認することもできます。
kubectl -n bmcpfs-dataflow-demo describe ossvp qwen3-32bstatus(プリフェッチ中):Bmcpfs Dataflow: 62a4e7ec-fae1-4f11-848f-b57cxxxxxxxx: Data Flow Id: df-29d3ad9e9xxxxxxx Data Flow Task Id: task-2993179xxxxxxxxx File Set Id: fset-2997498xxxxxxxxx File System Id: bmcpfs-29000z8xz3lf5xxxxxxxx Progress: 59%status(完了後):Message: Populated successfully
5. ワークロードの作成およびデータの利用
PVC ステータスが Bound になった後、この PVC をマウントするワークロードを作成します。
この例では GPU リソースを使用します。検証のみを目的として、CPU Pod を作成し、kubectl exec を使用してコンテナーにログインし、データを確認します。
リソースのクリーンアップガイド
AI トレーニングまたは推論タスクの完了後、CPFS for Lingjun 共有ボリュームおよびそれらのために作成された関連ワークロードを速やかに解放してください。
解放するリソース:
共有ボリュームを使用するワークロード(この例では
StatefulSet)データの事前充填用 PVC
PVC によって自動的に作成されたバックエンドストレージリソース(CPFS for Lingjun FileSet)
クリーンアップ手順:
ワークロードの削除
ボリュームを使用する StatefulSet を削除して、PVC を解放します。
kubectl delete statefulset demo-apply-qwen3-32b -n bmcpfs-dataflow-demoPVC の削除
StorageClass で
reclaimPolicy: Deleteが設定されているため、この操作によりバックエンドの CPFS FileSet の削除が自動的にトリガーされ、ストレージ容量が解放され、課金が停止します。kubectl delete pvc qwen3-32b -n bmcpfs-dataflow-demoリソースのクリーンアップ確認:
シナリオ 2: 隔離されたクラウドディスクボリュームへのデータプリフェッチ
本ソリューションは、バッチ処理ワークフローに適用されます。Argo Workflows を使用して、各タスクに対して独立したクラウドディスクを動的に作成およびウォームアップし、データの隔離および弾力的なスケーリングを実現します。
事前準備
storage-operator で
VolumePopulatorPodHandlerを有効化します。有効化後、システムが関連コンポーネントおよび一時的な Pod に対する必要な RBAC 権限を自動的に付与します。有効化する前に、潜在的なセキュリティリスクを評価してください。
Argo Workflows コンポーネントがインストールされていること。
この例では、データプリフェッチタスクおよびワークフローの実行にサーバーレスコンピューティング(ECI)を使用します。そのため、ack-virtual-node コンポーネント もインストールする必要があります。検証のために非サーバーレスコンピューティングを使用する場合は、リソースから関連ラベル
alibabacloud.com/eci: "true"を削除してください。
1. データの事前入力タスクに OSS へのアクセスを承認する
generic モードでは、データプリフェッチタスクが ack-volume-populator 名前空間内で一時的な Pod として実行されます。ソースデータを含む OSS バケットへのアクセス権限を、これらの Pod に付与する必要があります。
RRSA メソッド:アプリケーションレベルの細かい権限分離を実現する、動的かつ自動ローテーションする RAM ロールを Pod に割り当てます。セキュリティ性が高くなります。
AccessKey メソッド:静的かつ長期的な認証情報をシークレットに保存します。設定が簡単ですが、セキュリティ性は低くなります。
RRSA メソッド
Container Service Management Console にログインします。左側のナビゲーションウィンドウで クラスターリスト をクリックします。
2. RAM ロールの作成および権限の付与
Pod が偽装できる RAM ロールを作成し、RRSA 認証を通じた OSS アクセスを有効化します。
AccessKey メソッド
RAM ユーザーの作成(既に存在する場合はこのステップをスキップ)。RAM コンソールの ユーザーの作成 ページに移動し、画面上の指示に従って RAM ユーザーを作成します。ログイン名およびパスワードを設定します。
権限ポリシーの作成。
最小権限の原則に従い、カスタムポリシーを作成 し、対象 OSS バケット(OSS 読み取り専用または読み書き可能権限)へのアクセスを許可します。
RAM コンソール - ポリシーの作成 ページに移動し、スクリプトエディタ に切り替えて、指示に従ってポリシースクリプトを設定します。
RAM ユーザーへのポリシーの付与。
RAM コンソールの ユーザー ページに移動し、対象ユーザーの 操作 列で ポリシーのアタッチ をクリックします。
アクセスポリシー セクションで、作成したポリシーを検索して選択し、権限を追加します。
データの事前入力用に Secret として保存するため、RAM ユーザーの AccessKey を作成します。
RAM コンソール - ユーザー ページに移動し、RAM ユーザー一覧から対象ユーザーをクリックし、AccessKey セクションで AccessKey の作成 をクリックします。
ダイアログボックスの指示に従って AccessKey を作成し、AccessKey ID および AccessKey Secret を安全に保管します。
クラスター内にシークレットを作成します。
以下の YAML を使用して、
ack-volume-populator名前空間内に AccessKey を保存するシークレットを作成します。apiVersion: v1 kind: Secret metadata: name: oss-secret # 固定:ack-volume-populator namespace: ack-volume-populator stringData: # 事前に取得した AccessKey ID に置き換え accessKeyId: <your-AccessKey-ID> # 事前に取得した AccessKey Secret に置き換え accessKeySecret: <your-AccessKey-Secret>
2. OSSVolumePopulator (OSSVP) の作成
アプリケーションおよび PVC と同じ名前空間に OSSVolumePopulator リソースを作成し、データソースを定義し、mode を generic に指定し、権限付与方法を設定します。
apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
name: generic-demo
# アプリケーションおよび PVC と同じ名前空間である必要があります
namespace: argo
spec:
bucket: my-test-bucket
region: cn-hangzhou
endpoint: oss-cn-hangzhou-internal.aliyuncs.com
path: /many-files/
# 任意のバックエンドストレージボリューム向けの汎用モード
mode: generic
generic:
# ECI Pod へのスケジュール用にデータプリフェッチタスク Pod にラベルを追加
labels:
alibabacloud.com/eci: "true"
# ECI 仕様の設定用にデータプリフェッチタスク Pod にアノテーションを追加
annotations:
k8s.aliyun.com/eci-use-specs: "2-4Gi"
# secretRef または rrsaConfigs のいずれかを選択
# secretRef: oss-secret
rrsaConfigs:
# RRSA 権限付与に使用する RAM ロールの ARN
roleArn: "acs:ram::1234567*****:role/oss-populator"
# クラスターの OIDC プロバイダーの ARN
oidcProviderArn: "acs:ram::1234567*****:oidc-provider/my-oidc-provider"
# 特定ノードへのスケジュール用にデータプリフェッチタスク Pod のアフィニティを設定
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: NotIn
values:
- "hdd"
# データプリフェッチタスク Pod の Tolerations を設定
tolerations:
- key: "virtual-kubelet.io/provider"
operator: Equal
value: "alibabacloud"
effect: NoSchedule
# 最大スループット (MB/s)
# throughput: 1000パラメーターの説明:
パラメーター名 | 説明 | オプション | デフォルト |
| OSSVolumePopulator は、アプリケーションおよび PVC と同じ名前空間に配置する必要があります。 | いいえ | 該当なし |
| OSS バケット名。 | いいえ | 該当なし |
| OSS リージョン。 | いいえ | 該当なし |
| OSS サービス エンドポイント アドレス。 | いいえ | 該当なし |
| OSS バケット内のパスプレフィックス(例: | はい |
|
| 操作モード。選択肢:
| はい |
|
| ECI へのスケジュール用にデータプリフェッチタスク Pod にラベルを追加します。 | はい | 該当なし |
| ECI 仕様を設定するために、データ投入タスクの Pod にアノテーションを追加します。 | はい | 該当なし |
| AccessKey を保存するシークレットの名前。このパラメーターと | はい | 該当なし |
| RRSA 権限付与に使用する RAM ロールの ARN。 RAM コンソール - ロール ページに移動し、RAM ロール名をクリックし、詳細ページから ARN を取得します。 | RRSA を使用する場合に必須 | 該当なし |
| クラスターの OIDC プロバイダーの ARN。 ACK クラスター ページに移動し、対象クラスター名をクリックし、Cluster Information を選択し、基本情報 タブの RRSA OIDC から ARN を取得します。 | RRSA を使用する場合に必須 | 該当なし |
| データプリフェッチタスク Pod を特定のノードにスケジュールするためのアフィニティを設定します。 | はい | 該当なし |
| データプリフェッチタスク Pod の Toleration を設定します。 | はい | 該当なし |
| データプリフェッチタスク Pod の最大ダウンロード速度を設定するための最大スループット (MB/s)。
| はい | 無制限(実際の速度はノードのネットワーク、CPU、およびストレージ書き込み性能に依存) |
3. StorageClass の準備
本シナリオでは、クラウドディスクを動的プロビジョニングするための StorageClass が必要です。ACK では、デフォルトの StorageClass を提供しており、StorageClass の手動作成 もサポートしています。
この例では、
alicloud-disk-essdを使用します。これはreclaimPolicyをDeleteに、volumeBindingModeをImmediateに設定しており、ゾーン認識を必要としないサーバーレスコンピューティングのシナリオに適しています。非サーバーレスコンピューティング上でワークフローを実行する場合は、
volumeBindingModeをWaitForFirstConsumerに設定した StorageClass(例:alicloud-disk-topology-alltype)を使用して、クラウドディスクとアプリケーション Pod が常に同一ゾーンで作成されるようにし、ゾーン不一致によるスケジューリング失敗を回避します。
4. Argo Workflow の作成
以下の Workflow の例では、ephemeral volumeClaimTemplate を使用して、各並列タスクに対して独立したクラウドディスクを動的に作成し、初期データをプリフェッチします。
Workflow を作成した後、任意のタスク Pod のログを確認して、プリフェッチ済みデータの正常な読み取りを確認します。
本番環境では、Argo Workflows の Artifact 機能を使用して、最終的な計算結果を OSS に永続化することもできます。
# <your-workflow-pod-name> を実際の Pod 名に置き換え
kubectl -n argo logs <your-workflow-pod-name>期待される出力:
サブタスク開始、ID: 1
新しいログファイルを作成中...
OSSVP でプリフェッチされたディスクからの内容一覧:
1-logs
lost+found
results-2025-04-16T07:48:00Z
...
サブタスク完了、ID: 1結果の分析:
1-logs:タスクによって新規に書き込まれたファイルで、ボリュームが読み書き可能であることおよび並列タスク間でストレージが隔離されていることを検証します。results-2025-04-16T07:48:00Zおよび同様のファイル:OSS からクラウドディスクへプリフェッチされたデータで、プリフェッチ機能が正しく動作していることを確認します。lost+found:ファイルシステムのフォーマット後に自動的に生成されるディレクトリです。無視してください。
リソースのクリーンアップガイド
バッチ処理タスクの完了後、Argo Workflow によって動的に作成された隔離されたクラウドディスクボリュームおよび関連ワークフローを速やかに解放してください。
解放するリソース:
Argo Workflow インスタンス
Workflow によって自動的に作成された一時的な PVC
PVC によって自動的に作成されたバックエンドストレージリソース(クラウドディスク)
リリースフロー:
Argo Workflow の削除:
このシナリオでは、通常は
Workflowリソースを削除するだけで十分です。Workflow がephemeralボリューム要求を使用しているため、Workflow の削除により、それが作成したすべての PVC がカスケード削除されます。StorageClassでreclaimPolicy: Deleteが設定されているため、さらにバックエンドのクラウドディスクの自動削除がトリガーされ、リソースが解放され、課金が停止します。# <workflow-name> を実際の Workflow 名に置き換え kubectl -n argo delete workflow <workflow-name>リソースのクリーンアップ確認:
PVC の確認:
kubectl -n argo get pvcを実行し、この Workflow に関連するすべての PVC が削除されたことを確認します。クラウドディスクリソースの確認: ECS コンソール - ブロックストレージ - ディスク に移動し、この Workflow から生成されたクラウドディスクリソースが残っていないことを確認します。
OSS ソースデータの確認:この操作は OSS ソースデータには影響しません。確認するには、OSS コンソール に移動し、データセットがそのまま残っていることを確認します。
本番環境に適用 / 本番運用時の注意点
コストおよびリソース管理:
自動リソース解放の設定:動的ボリュームの作成に使用する StorageClass の
reclaimPolicy: Deleteを設定します。これにより、タスク完了後にパフォーマンス専有型ストレージリソースが自動的にクリーンアップされます。データプリフェッチコストの最適化 (
genericモード):genericモードでは、データプリフェッチに計算リソースが消費されます。affinityおよびtolerationsをOSSVolumePopulatorで設定することで、一時的なタスク Pod をよりコストの低いサーバーレスコンピューティング(ACS、ECI など)またはスポットインスタンスにスケジュールできます。ストレージ容量の計画:PVC 作成時に要求する
storage容量は、ソースデータのサイズを超える必要があります。そうでないと、容量不足によりデータプリフェッチが失敗します。
パフォーマンスおよび安定性:
クラウドディスクのゾーン配置:クラウドディスクはゾーンスコープのリソースです。ECS ノードを使用する場合、
StorageClassのvolumeBindingModeをWaitForFirstConsumerに設定して、クラウドディスクとアプリケーション Pod が常に同一ゾーンで作成されるようにし、クロスゾーンスケジューリングによるマウント失敗を回避します。CPFS for Lingjun のプリフェッチモードのバランス:PV の迅速な準備を重視し、初回ファイル読み取り時の遅延を許容できる場合は、
dataType: metadataを選択します。ワークロードが初回読み取り時の高いパフォーマンスと完全なデータプリフェッチを必要とする場合は、dataType: metadataAndDataを選択します。ステータス監視:
kubectl describe ossvp <name>を使用して、データプリフェッチタスクのステータスおよびイベントを監視し、トラブルシューティングを迅速に行います。
セキュリティおよび権限:
安全な権限付与のための RRSA の使用:
genericモードでデータプリフェッチタスク Pod に OSS アクセス権限を付与する場合、AccessKey の漏洩によるセキュリティリスクを回避するため、RRSA メソッドを優先して使用します。
請求情報
本機能には、以下の課金項目が含まれます。
パフォーマンス専有型ストレージ料金:作成されたボリュームの種類(CPFS for Lingjun や クラウドディスク など)およびそのライフサイクルに基づいて課金されます。
OSS ストレージ料金:OSS におけるソースデータのストレージ料金。
データ転送料金:OSSVP で OSS の内部エンドポイントを設定することで、トラフィック料金を回避できます。パブリックエンドポイントを使用すると、トラフィック料金 が発生します。
計算リソース料金(
genericモードのみ):genericモードの一時的な Pod は、クラスターの計算リソース(CPU、メモリ、帯域幅)を消費し、仕様および実行時間に基づいて課金されます。CPFS for Lingjun の
bmcpfs-dataflowモードでは、データストリームタスクは 無料で利用可能 です。これは、データストリーム機能がパブリックプレビュー段階であるためです。
よくある質問
プリフェッチ完了後、OSS のソースファイルを更新しても、ボリューム内のデータは自動同期されますか?
いいえ。データプリフェッチはボリューム作成時の 1 回限りの操作です。ボリュームが作成およびプリフェッチされた後、その内容は OSS のソースデータから切り離されます。その後の OSS の変更は、作成済みボリュームには同期されません。
PVC のステータスが Pending のままであるのはなぜですか?
Pending は、データプリフェッチ中の正常な状態です。長期間 Pending のままの場合、以下の手順でトラブルシューティングを行ってください。
kubectl describe pvc <pvc-name> -n <namespace>:PVC Events を確認し、Populator 関連のエラーメッセージを調べます。kubectl describe ossvp <ossvp-name> -n <namespace>:OSSVP の Status および Events を確認し、プリフェッチタスクのステータス、進行状況、または失敗原因を調べます。genericモードを使用している場合、ack-volume-populator名前空間内で失敗した Pod を確認し、そのログを確認します。一般的な原因には、OSS 権限の不足、ネットワーク障害、ストレージ容量の不足などがあります。