AI トレーニングやデータ分析タスクの前に、大量の OSS のコールドデータをオンデマンドで CPFS for Lingjun やクラウドディスクなどの高性能ボリュームにプリフェッチし、ワークロードの読み取りを高速化します。タスク完了後、ボリュームは自動的に回収され、コンピューティングアクセラレーションとコスト最適化の両立を実現します。
仕組み
機能の実装
この機能は、ACK の storage-operator によって管理される Kubernetes の Volume Populators を使用します。OSSVolumePopulator (OSSVP) カスタムリソースを参照する PVC を作成すると、storage-operator がリクエストをインターセプトし、データを投入します。
データ投入モードは、ターゲットボリュームのタイプによって異なります。
|
モード |
サポートされるストレージタイプ |
説明 |
|
|
CPFS for Lingjun |
storage-operator は CPFS のネイティブデータフローを利用してデータを投入します。 このモードはクラスターのコンピューティングリソースを使用せず、より効率的です。 |
|
|
クラウドディスクや CPFS 汎用版など、その他のストレージタイプ |
storage-operator は、 このモードはクラスターのコンピューティングリソースを消費します。 |
データ投入が成功すると、PVC のステータスが Pending から Bound に変わります。その後、アプリケーション Pod は PVC をマウントし、プリフェッチされたデータにアクセスできます。
主なシナリオ
この機能には、主に 2 つのユースケースがあります。
|
ディメンション |
||
|
適用シナリオ |
AI モデルトレーニングや推論など、スループットが高く読み取り集中型のワークロードで、OSS アクセスのボトルネックを解消します。 |
同時実行の競合を回避し、データ分離を確保するために、分離された読み書きワークスペースを必要とする並列バッチまたはデータパイプラインタスクで利用されます。 |
|
技術的実装 |
CPFS for Lingjun を |
クラウドディスクなどの動的にプロビジョニングされたストレージを |
|
主な特徴 |
|
|
ワークフロー
VolumePopulator のコアステップは、どちらのモードでも同様です。
|
|
|
前提条件
-
クラスターは Kubernetes 1.26 以降で、CSI プラグインがインストールされている必要があります。この機能には、動的にプロビジョニングされたストレージが必要です。
クラスターをアップグレードするには、「クラスターを手動でアップグレードする」をご参照ください。FlexVolume から CSI に移行するには、「csi-compatible-controller を使用して FlexVolume を CSI に移行する」をご参照ください。
-
storage-operator を v1.35.1 以降にアップグレードし、
VolumePopulatorFeature Gate を有効化します。他のフィーチャーゲートがすでに有効になっている場合は、
xxxxxx=true,yyyyyy=false,VolumePopulator=trueのフォーマットを使用します。
シナリオ 1:CPFS for Lingjun 共有ボリュームへのデータプリフェッチ
読み取り専用で高スループットのモデルトレーニングおよび推論では、CPFS for Lingjun データフローを使用して、OSS からモデルをオンデマンドでプリフェッチすることで、複数の 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 に設定します。
# dataType: metadataAndData
パラメーター:
|
名前 |
説明 |
任意 |
デフォルト |
|
|
OSSVolumePopulator は、アプリケーションおよび PVC と同じ名前空間に配置する必要があります。 |
いいえ |
N/A |
|
|
OSS バケット名。 |
いいえ |
N/A |
|
|
OSS の リージョン。 |
いいえ |
N/A |
|
|
OSS サービスの エンドポイント。 |
いいえ |
N/A |
|
|
OSS バケット内のパスプレフィックス。例: |
はい |
|
|
|
動作モード。指定可能な値:
|
はい |
|
|
|
CPFS for Lingjun データフローの最大スループット (MB/s)。有効値: |
はい |
600 |
|
|
|
はい |
暗号化無効 |
|
|
同期するデータタイプ:
|
はい |
|
3. StorageClass と PVC の準備
CPFS for Lingjun 用の StorageClass を作成し、次に dataSourceRef で OSSVP を参照する PVC を作成します。
|
StorageClass の作成 |
この StorageClass から作成される各動的ボリュームは、バックエンドの CPFS for Lingjun に Fileset を作成します。同じ StorageClass を使用して、異なる OSSVP リソースを作成することで、異なる OSS データセットを異なるボリュームにプレフィルできます。 |
|
PVC の作成 |
StorageClass に |
4. データプレフィルステータスの確認
ポピュレーション中、PVC ステータスは Pending のままとなり、完了後に Bound に変わります。
bmcpfs-dataflow モードでは、このコマンドで CPFS での Lingjun データフローのリアルタイムの進捗を確認します:
kubectl -n bmcpfs-dataflow-demo describe ossvp qwen3-32b
-
生成中の
status: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% -
完了後の
ステータス:Message: Populated successfully
5. ワークロードの作成とデータの使用
PVC が Bound になったら、それをマウントするワークロードを作成します。
この例では GPU リソースを使用します。検証のみを目的とする場合、CPU ポッドを作成し、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-demo -
PVC を削除する
StorageClass で
reclaimPolicy: Deleteを設定した場合、PVC を削除するとバックエンドの 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 として実行されます。これらの Pod に、ソースデータが格納されている OSS バケットへのアクセス権限を付与する必要があります。
-
RRSA 方式:Pod に一時的で自動ローテーションされる RAM ロールを動的に割り当て、きめ細やかな権限分離とより高いセキュリティを実現します。
-
AccessKey 方式:静的な長期認証情報を Secret に保存します。設定は簡単ですが、セキュリティは低くなります。
RRSA 方式
1. クラスターでの RRSA の有効化
-
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] をクリックします。[クラスター] ページで、対象のクラスターの名前をクリックします。
-
[基本情報] タブの [セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効化] をクリックし、画面の指示に従ってオフピーク時に RRSA を有効にします。
クラスターのステータスが [更新中] から [実行中] に変わると、RRSA が有効になります。
重要RRSA を有効にすると、クラスターで新しく作成される ServiceAccount トークンの最大有効期間は 12 時間に制限されます。
2. RAM ロールの作成と権限の付与
Pod が RRSA 認証を通じて OSS にアクセスするために引き受ける RAM ロールを作成します。
AccessKey 方式
-
RAM ユーザーを作成します。RAM ユーザーが既に存在する場合は、この手順をスキップします。 [RAM コンソール - ユーザーの作成] ページに移動し、画面の指示に従って RAM ユーザーを作成します (例:ログイン名とパスワードを設定)。
-
権限ポリシーを作成します。
最小権限の原則に従い、カスタムポリシーを作成 して、ターゲットの OSS バケットへのアクセス (OSS 読み取り専用または読み書き権限) を許可します。
[RAM コンソール - ポリシーの作成] ページに移動し、[JSON エディター] に切り替えて、画面の指示に従ってポリシー スクリプトを設定します。
-
ポリシーを RAM ユーザーにアタッチします。
-
[RAM コンソール - ユーザー] ページに移動します。ユーザーリストで対象のユーザーを見つけ、[操作] 列の [権限の追加] をクリックします。
-
[ポリシー] セクションで、前の手順で作成したポリシーを検索して選択し、承認を完了します。
-
-
データプリフィルタスクで使用する RAM ユーザーの AccessKey を作成し、Secret として保存します。
-
[RAM コンソール - ユーザー] ページに移動し、RAM ユーザーリストで対象のユーザーをクリックし、[AccessKey] タブで [AccessKey の作成] をクリックします。
-
ダイアログボックスの指示に従って AccessKey を作成し、AccessKey ID と AccessKey Secret を安全に保管します。
-
-
クラスターに Secret を作成します。
次の YAML を使用して、
ack-volume-populator名前空間に Secret を作成し、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 を設定します
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 と同じ名前空間に存在する必要があります。 |
いいえ |
N/A |
|
|
OSS バケット名。 |
いいえ |
N/A |
|
|
OSS の リージョン。 |
いいえ |
N/A |
|
|
OSS サービスの エンドポイント。 |
いいえ |
N/A |
|
|
OSS バケット内のパスプレフィックス。例: |
はい |
|
|
|
動作モード。指定可能な値:
|
はい |
|
|
|
ECI にスケジューリングするためのデータ投入タスク Pod のラベル。 |
はい |
N/A |
|
|
ECI スペックを設定するためのデータ投入タスク Pod のアノテーション。 |
はい |
N/A |
|
|
AccessKey を保存する Secret 名。このパラメーターと |
はい |
N/A |
|
|
RRSA 認証に使用される RAM ロールの ARN。 [RAM コンソール - ロール] ページに移動し、RAM ロール名をクリックして、詳細ページから取得します。 |
RRSA 使用時に必須 |
N/A |
|
|
クラスターの OIDC プロバイダーの ARN。 ACK クラスターページに移動し、ターゲットクラスター名をクリックし、[クラスター情報] を選択し、[基本情報] タブの [RRSA OIDC] から取得します。 |
RRSA 使用時に必須 |
N/A |
|
|
特定のノードにスケジューリングするためのデータ投入タスク Pod の affinity。 |
はい |
N/A |
|
|
データ投入タスク Pod の tolerations。 |
はい |
N/A |
|
|
データ投入タスク Pod の最大スループット (MB/s)。
|
はい |
無制限 (実際のスループットはノードのネットワーク、CPU、ストレージの書き込み性能に依存します) |
3. StorageClass の準備
このシナリオでは、クラウドディスクを動的にプロビジョニングするための StorageClass が必要です。ACK は デフォルトの StorageClass を提供し、 StorageClass を手動で作成することも可能です。
-
この例では、
reclaimPolicyがDeleteに、volumeBindingModeがImmediateに設定されたalicloud-disk-essdを使用しており、ゾーンを意識しないサーバーレスコンピューティングに適しています。 -
サーバーレスでないワークフローの場合、
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>
期待される出力:
Subtask started, ID: 1
Creating a new log file...
Listing contents from the disk populated by OSSVP:
1-logs
lost+found
results-2025-04-16T07:48:00Z
...
Subtask completed, ID: 1
結果の分析:
-
1-logs:タスクによって書き込まれたファイルで、並列タスク間の読み書きアクセスと独立したストレージを確認します。 -
results-2025-04-16T07:48:00Zおよび同様のファイル:OSS からクラウドディスクにプリフィルされたデータ。 -
lost+found:ファイルシステムのフォーマット中に作成されたディレクトリ。無視してください。
リソース解放ガイド
バッチ処理タスクが完了したら、独立したクラウドディスクボリュームと Argo Workflow インスタンスを解放します。
解放するリソース:
-
Argo Workflow インスタンス
-
ワークフローによって自動的に作成された一時的な PVC
-
PVC によって自動的に作成されたバックエンドストレージリソース (クラウドディスク)。
解放手順:
-
Argo Workflow の削除:
Workflowリソースを削除します。ephemeralボリューム要求を使用すると、削除はすべての PVC にカスケードされます。StorageClassのreclaimPolicy: Deleteにより、バックエンドのクラウドディスクが削除され、リソースが解放されて課金が停止します。# <workflow-name> を実際の Workflow 名に置き換えます kubectl -n argo delete workflow <workflow-name> -
リソース解放の確認:
-
kubectl -n argo get pvcを実行して、ワークフロー関連のすべての PVC が削除されたことを確認します。 -
クラウドディスクリソースの確認:[ECS コンソール - ブロックストレージ - ディスク] に移動し、このワークフローからのクラウドディスクリソースが残っていないことを確認します。
-
OSS のソースデータは影響を受けません。 OSS コンソール で、データセットがそのまま残っていることを確認します。
-
本番環境への適用
-
コストとリソース管理:
-
タスク完了後に高性能ストレージが自動的にクリーンアップされるように、動的に作成されるボリュームのストレージクラスで
reclaimPolicy: Deleteを設定します。 -
genericモードでは、OSSVolumePopulatorでaffinityとtolerationsを設定して、低コストのサーバーレスコンピューティング (ACS、ECI を含む) またはスポットインスタンス上に一時的なタスク Pod をスケジューリングします。 -
PVC の
storageには、ソースデータのサイズよりも大きい値を指定してください。そうしないと、容量不足でポピュレーションが失敗します。
-
-
パフォーマンスと安定性:
-
クラウドディスクとアプリケーション Pod が同じゾーンに作成されるように、ECS ノードではストレージクラスの
volumeBindingModeをWaitForFirstConsumerに設定します。 -
CPFS for Lingjun の場合、初回読み取りのレイテンシーが許容できる場合は、PV の準備を高速化するために
dataType: metadataを選択し、完全なプレフィルと高い初回読み取り性能を求める場合はdataType: metadataAndDataを選択します。 -
迅速なトラブルシューティングのために、
kubectl describe ossvp <name>を使用してプレフィルのステータスを監視してください。
-
-
セキュリティと権限:
-
genericモードでデータポピュレーションタスクの Pod に OSS へのアクセス権を付与する場合は、AccessKey よりも RRSA を使用することを推奨します。
-
課金
この機能では、以下の料金が発生します:
-
作成するボリューム (CPFS for Lingjun や クラウドディスク など) のタイプとライフサイクルに応じた高性能ストレージ料金。
-
ソースデータに対する OSS の ストレージ料金。
-
データ転送料金:OSSVP で OSS の内部エンドポイントを設定すると、トラフィック料金を回避できます。パブリックエンドポイントを使用すると、トラフィック料金 が発生します。
-
コンピューティングリソース料金 (
genericモードのみ): 一時的な Pod がクラスターのコンピューティングリソース (CPU、メモリ、帯域幅) を消費し、仕様と期間に基づいて課金されます。 -
bmcpfs-dataflowモードの CPFS for Lingjun の場合、データストリーム機能がパブリックプレビュー中のため、データストリームタスクは 無料です。
よくある質問
事前入力の完了後、OSS のソースファイルを更新すると、ボリューム内のデータは自動的に同期されますか?
いいえ。データの事前入力は、ボリューム作成時に 1 回限り行われます。ポピュレーション後、ボリュームの内容は OSS のソースデータから分離され、その後の OSS の変更は同期されません。
PVC が Pending ステータスのままなのはなぜですか?
Pending は、データの事前入力中は正常な状態です。この状態が続く場合は、次のようにトラブルシューティングしてください:
-
kubectl describe pvc <pvc-name> -n <namespace>:PVC のイベントをチェックして、ポピュレーターのエラーを確認してください。 -
kubectl describe ossvp <ossvp-name> -n <namespace>:OSSVP のステータスとイベントをチェックして、ポピュレーションの進捗や失敗を確認してください。 -
genericモードでは、ack-volume-populator名前空間で失敗したポッドを確認し、ログを確認します。一般的な原因として、OSS の権限不足、ネットワークの問題、またはストレージ容量の不足などが挙げられます。