すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:OSS データの高性能ボリュームへのオンデマンドプレフィル

最終更新日:Aug 30, 2026

AI トレーニングやデータ分析タスクの前に、大量の OSS のコールドデータをオンデマンドで CPFS for Lingjun やクラウドディスクなどの高性能ボリュームにプリフェッチし、ワークロードの読み取りを高速化します。タスク完了後、ボリュームは自動的に回収され、コンピューティングアクセラレーションとコスト最適化の両立を実現します。

仕組み

機能の実装

この機能は、ACK の storage-operator によって管理される Kubernetes の Volume Populators を使用します。OSSVolumePopulator (OSSVP) カスタムリソースを参照する PVC を作成すると、storage-operator がリクエストをインターセプトし、データを投入します。

データ投入モードは、ターゲットボリュームのタイプによって異なります。

モード

サポートされるストレージタイプ

説明

bmcpfs-dataflow
ネイティブデータフローモード

CPFS for Lingjun

storage-operator は CPFS のネイティブデータフローを利用してデータを投入します。

このモードはクラスターのコンピューティングリソースを使用せず、より効率的です。

image

generic
汎用 Pod 投入モード

クラウドディスクや CPFS 汎用版など、その他のストレージタイプ

storage-operator は、ack-volume-populator 名前空間に一時 Pod を作成し、新しいボリュームをマウントして指定された OSS データをダウンロードします。データ投入が完了すると、Pod は削除されます。

このモードはクラスターのコンピューティングリソースを消費します。

image

データ投入が成功すると、PVC のステータスが Pending から Bound に変わります。その後、アプリケーション Pod は PVC をマウントし、プリフェッチされたデータにアクセスできます。

主なシナリオ

この機能には、主に 2 つのユースケースがあります。

ディメンション

シナリオ 1:CPFS for Lingjun 共有ボリュームへのデータプリフェッチ

シナリオ 2:分離されたクラウドディスクボリュームへのデータプリフェッチ

適用シナリオ

AI モデルトレーニングや推論など、スループットが高く読み取り集中型のワークロードで、OSS アクセスのボトルネックを解消します。

同時実行の競合を回避し、データ分離を確保するために、分離された読み書きワークスペースを必要とする並列バッチまたはデータパイプラインタスクで利用されます。

技術的実装

CPFS for Lingjun を bmcpfs-dataflow モードで使用し、ネイティブのデータ投入を行います。

クラウドディスクなどの動的にプロビジョニングされたストレージを generic モードで使用し、一時 Pod を使用してデータ投入を行います。

主な特徴

  • コスト最適化:コンピューティングリソースを使用しないネイティブアクセラレーションを利用します。使用後、ストレージは即座に解放されます。

  • データ共有:多対一のアクセスにより、複数の GPU タスクが同じプリフェッチされたデータセットを共有できます。

  • データ分離:各タスクは専用のボリュームを取得し、干渉を回避します。複数の動的ストレージタイプに対応しています。

  • 伸縮自在なスケーリング:一対一のアクセスにより、ストレージのライフサイクルがタスクのライフサイクルに連動し、正確なコスト管理が可能になります。

ワークフロー

VolumePopulator のコアステップは、どちらのモードでも同様です。

image

  1. storage-operator で VolumePopulator Feature Gate を有効にします。

    VolumePopulator を有効にすると、データ事前投入中の一時的な PVC と Pod のために、ack-volume-populator 名前空間がデフォルトで作成されます。
  2. データ投入タスクのために OSS のアクセス権限を付与します。bmcpfs-dataflow モードでは OSS バケットに特定のタグが必要で、generic モードでは RRSA または AccessKey の設定が必要です。

  3. OSS バケットのパスとデータ投入モードを指定して、OSSVolumePopulator オブジェクトを作成します。

  4. PVC を作成し、StorageClass を指定し、dataSourceRef で OSSVP を参照してデータ事前投入を開始します (タイミングは StorageClass の volumeBindingMode に依存します)。

  5. PVC が Bound 状態になった後、それをマウントするワークロード (Pod、デプロイメントなど) を作成し、高速なデータアクセスを実現します。

    データ事前投入は、ボリューム作成時に一度だけ行われます。その後の OSS ソースデータの変更は、作成されたボリュームには同期されません。
  6. タスクが終了した後、PVC を削除します。StorageClass の reclaimPolicy が Delete の場合、関連する高性能ストレージ (CPFS FileSet やクラウドディスクなど) は自動的に削除され、課金が停止します。OSS のソースデータは影響を受けません。

前提条件

  • クラスターは Kubernetes 1.26 以降で、CSI プラグインがインストールされている必要があります。この機能には、動的にプロビジョニングされたストレージが必要です。

    クラスターをアップグレードするには、「クラスターを手動でアップグレードする」をご参照ください。FlexVolume から CSI に移行するには、「csi-compatible-controller を使用して FlexVolume を CSI に移行する」をご参照ください。
  • storage-operator を v1.35.1 以降にアップグレードし、VolumePopulator Feature Gate を有効化します。

    他のフィーチャーゲートがすでに有効になっている場合は、 xxxxxx=true,yyyyyy=false,VolumePopulator=true のフォーマットを使用します。

シナリオ 1:CPFS for Lingjun 共有ボリュームへのデータプリフェッチ

読み取り専用で高スループットのモデルトレーニングおよび推論では、CPFS for Lingjun データフローを使用して、OSS からモデルをオンデマンドでプリフェッチすることで、複数の GPU タスクによる高速な読み取りが可能になります。

前提条件

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

パラメーター:

名前

説明

任意

デフォルト

namespace

OSSVolumePopulator は、アプリケーションおよび PVC と同じ名前空間に配置する必要があります。

いいえ

N/A

bucket

OSS バケット名。

いいえ

N/A

region

OSS の リージョン。

いいえ

N/A

endpoint

OSS サービスの エンドポイント。

いいえ

N/A

path

OSS バケット内のパスプレフィックス。例: /data/。

はい

/

mode

動作モード。指定可能な値:

  • generic (デフォルト): あらゆるバックエンドの動的ボリューム (例: クラウドディスク、CPFS 汎用版) への汎用的なデータ投入です。ack-volume-populator 名前空間に一時的な Pod を作成してデータをダウンロードし、クラスターのコンピューティングリソースを消費します。

  • bmcpfs-dataflow:CPFS for Lingjun ボリューム専用の高性能モード。ネイティブデータフローを使用し、クラスターのコンピューティングリソースを使用せずに、より高い効率を実現できます。

  • auto: ターゲットストレージタイプに基づいて最適なモードを選択しますが、通常は generic モードにフォールバックします。必要に応じて bmcpfs-dataflow を手動で指定します。

はい

auto

bmcpfsDataflow.throughput

CPFS for Lingjun データフローの最大スループット (MB/s)。有効値: 600、1200、1500。

はい

600

bmcpfsDataflow.sourceSecurityType

"SSL" など、暗号化転送のためのデータ転送セキュリティプロトコル。

はい

暗号化無効

bmcpfsDataflow.dataType

同期するデータタイプ:

  • metadata:ファイルのメタデータのみを同期します。

    メタデータのみの同期では、データは最初の読み取り時に OSS から取得されるため、初回アクセスのパフォーマンスに影響する可能性があります。

  • metadataAndData: メタデータとファイルの内容の両方を同期します。

はい

metadataAndData

3. StorageClass と PVC の準備

CPFS for Lingjun 用の StorageClass を作成し、次に dataSourceRef で OSSVP を参照する PVC を作成します。

StorageClass の作成

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bmcpfs-dataflow-demo
parameters:
  bmcpfsId: bmcpfs-29000z8xz3xxxxxxxxxxx
  vpcMountTarget: cpfs-29000z8xz3xxxxxxxxxxx-vpc-xxxxxx.cn-wulanchabu.cpfs.aliyuncs.com
  mountpointAutoSwitch: "true"
provisioner: bmcpfsplugin.csi.alibabacloud.com
# 重要:この設定により、PVC 削除後に CPFS Fileset とデータが自動的にクリーンアップされます
reclaimPolicy: Delete
# 推奨:PVC 作成直後にデータプレフィルを開始するには Immediate に設定します
volumeBindingMode: Immediate

この StorageClass から作成される各動的ボリュームは、バックエンドの CPFS for Lingjun に Fileset を作成します。同じ StorageClass を使用して、異なる OSSVP リソースを作成することで、異なる OSS データセットを異なるボリュームにプレフィルできます。

PVC の作成

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: qwen3-32b
  namespace: bmcpfs-dataflow-demo
spec:
  accessModes:
    - ReadOnlyMany
  dataSourceRef:
    apiGroup: storage.alibabacloud.com
    kind: OSSVolumePopulator
    # 上記で作成した OSSVP 名を参照します
    name: qwen3-32b
  resources:
    requests:
      # OSSVP が参照する OSS データソースのサイズ以上である必要があります
      storage: 80Gi
  storageClassName: bmcpfs-dataflow-demo
  volumeMode: Filesystem

StorageClass に volumeBindingMode: Immediate が設定されているため、storage-operator は PVC 作成の直後に、Lingjun データフロー用の OSS-to-CPFS を開始します。

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 を使用してデータを検査します。

サンプルコードを表示するには展開してください

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: demo-apply-qwen3-32b
  namespace: bmcpfs-dataflow-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-apply-qwen3-32b
  template:
    metadata:
      labels:
        app: demo-apply-qwen3-32b
      # CPFS ボリュームをマウントするには ACS HPN インスタンスタイプを使用します
      # alibabacloud.com/compute-class: "gpu-hpn"
    spec:
      # CPFS ボリュームをマウントするには ACS HPN インスタンスタイプを使用します
      # nodeSelector: 
      #   alibabacloud.com/node-type: reserved
      # tolerations:
      # - key: "virtual-kubelet.io/provider" 
      #   operator: "Exists"
      #   effect: "NoSchedule"
      volumes:
        - name: model-storage
          persistentVolumeClaim:
            # 作成した PVC を指定します
            claimName: qwen3-32b
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: 15Gi
      containers:
        - command: ["sh", "-c", "python3 -m sglang.launch_server --model-path /models/Qwen3-32B --tp 2"]
          image: registry.cn-beijing.aliyuncs.com/tool-sys/ossfs-public:demo-env-python3.12.7-sglang0.5.5
          name: sglang
          ports:
            - containerPort: 8000
              name: http
          resources:
            limits:
              nvidia.com/gpu: "2"
            requests:
              nvidia.com/gpu: "2"
          volumeMounts:
            - mountPath: /models/Qwen3-32B
              name: model-storage
            - mountPath: /dev/shm
              name: dshm

リソースのクリーンアップガイド

AI トレーニングまたは推論タスクが完了した後、CPFS for Lingjun 共有ボリュームと関連するワークロードをリリースします。

リリースするリソース:

  • 共有ボリュームを使用するワークロード(この例では、StatefulSet)

  • データプレフィルに使用した PVC

  • PVC によって自動的に作成されたバックエンドストレージリソース (CPFS for Lingjun Fileset)

クリーンアップの手順:

  1. ワークロードを削除する

    ボリュームを使用している StatefulSet を削除して、PVC をリリースします。

    kubectl delete statefulset demo-apply-qwen3-32b -n bmcpfs-dataflow-demo
  2. PVC を削除する

    StorageClass で reclaimPolicy: Delete を設定した場合、PVC を削除するとバックエンドの CPFS FileSet も削除され、ストレージが解放され、課金が停止します。

    kubectl delete pvc qwen3-32b -n bmcpfs-dataflow-demo
  3. リソースのクリーンアップを確認する:

    • NAS コンソールで、ファイルシステム>ファイルシステムリスト を選択し、この PVC の FileSet が削除され、使用容量が減少したことを確認します。

    • OSS コンソールで、データセットがそのまま残っていることを確認してください。

シナリオ 2: 独立したクラウドディスクボリュームへのデータプリフェッチ

バッチ処理ワークフローでは、Argo Workflows を使用してタスクごとに独立したクラウドディスクを動的に作成し、データをプリフィルすることで、データ分離と弾力性を実現します。

前提条件

  • storage-operator で VolumePopulatorPodHandler を有効にします。

    有効にすると、システムは関連コンポーネントと一時的な Pod に必要な RBAC 権限を付与します。有効にする前に、セキュリティリスクを評価してください。

    自動的に設定される RBAC 権限

    • storage-operator に、ack-volume-populator 名前空間での Pod 操作権限を付与します

      - apiGroups: [""]
        resources: [pods]
        verbs: [get, list, watch, create, delete]
    • 一時的なタスク Pod にクラスターレベルのアクセス権限を付与します

      - apiGroups: [""]
        resources: [events]
        verbs: [create, patch, get, list]
      - apiGroups: [volumepopulators.storage.alibabacloud.com]
        resources: [ossvolumepopulators]
        verbs: [get, list, watch]
  • Argo Workflows がインストールされていること。

    詳細な手順

    1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. [クラスター] ページで、ご利用のクラスター名をクリックします。左側のナビゲーションウィンドウで、[操作] > [アドオン] の順に選択します。

    3. [アドオン] ページで、[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 の有効化

  1. ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] をクリックします。[クラスター] ページで、対象のクラスターの名前をクリックします。

  2. [基本情報] タブの [セキュリティと監査] セクションで、[RRSA OIDC] の横にある [有効化] をクリックし、画面の指示に従ってオフピーク時に RRSA を有効にします。

    クラスターのステータスが [更新中] から [実行中] に変わると、RRSA が有効になります。

    重要

    RRSA を有効にすると、クラスターで新しく作成される ServiceAccount トークンの最大有効期間は 12 時間に制限されます。

2. RAM ロールの作成と権限の付与

Pod が RRSA 認証を通じて OSS にアクセスするために引き受ける RAM ロールを作成します。

手順の表示

  1. RAM ロールを作成します。

    1. [RAM コンソール - ロールの作成] ページに移動し、[信頼できるエンティティの種類] で [ID プロバイダー] を選択し、[ポリシーエディターに切り替え] をクリックして [ビジュアルエディター] ページに移動します。

    2. [信頼できるエンティティ] で [ID プロバイダー] を選択し、[編集] をクリックして、以下のように設定します。

      主な設定は以下の通りです。その他のパラメーターはデフォルト値を使用します。詳細については、「OIDC ID プロバイダー用の RAM ロールを作成する」をご参照ください。

      設定

      説明

      [ID プロバイダータイプ]

      [OIDC]。

      [ID プロバイダー]

      ack-rrsa-<cluster_id> を選択します。 <cluster_id> をクラスター ID に置き換えてください。

      [条件]

      oidc:sub を手動で追加します。

      • キー:[oidc:sub] を選択します。

      • [演算子]:[StringEquals] を選択します。

      • [値]:system:serviceaccount:ack-volume-populator:plugin-account を入力します。

      [ロール名]

      この例では demo-role-for-rrsa を使用します。

  2. 権限ポリシーを作成します。

    最小権限の原則に従い、カスタムポリシーを作成 して、ターゲットの OSS バケットへのアクセス (OSS 読み取り専用または読み書き権限) を付与します。

    [RAM コンソール - ポリシーの作成] ページに移動し、[JSON エディター] に切り替えて、画面の指示に従ってポリシー スクリプトを設定します。

    OSS 権限を持つ RAM ロールが既にある場合は、その信頼ポリシーを変更して再利用します。詳細については、「既存の RAM ロールを使用して権限を付与する」をご参照ください。

    OSS 読み取り専用ポリシー

    <myBucketName> を実際のバケット名に置き換えてください。
    {
        "Statement": [
            {
                "Action": [
                    "oss:Get*",
                    "oss:List*"
                ],
                "Effect": "Allow",
                "Resource": [
                    "acs:oss:*:*:<myBucketName>",
                    "acs:oss:*:*:<myBucketName>/*"
                ]
            }
        ],
        "Version": "1"
    }
    1. [RAM コンソール - ユーザー] ページに移動し、RAM ユーザーリストで対象のユーザーをクリックし、[AccessKey] タブで [AccessKey の作成] をクリックします。

    2. ダイアログボックスの指示に従って AccessKey を作成し、AccessKey ID と AccessKey Secret を安全に保管します。

AccessKey 方式

  1. RAM ユーザーを作成します。RAM ユーザーが既に存在する場合は、この手順をスキップします。 [RAM コンソール - ユーザーの作成] ページに移動し、画面の指示に従って RAM ユーザーを作成します (例:ログイン名とパスワードを設定)。

  2. 権限ポリシーを作成します。

    最小権限の原則に従い、カスタムポリシーを作成 して、ターゲットの OSS バケットへのアクセス (OSS 読み取り専用または読み書き権限) を許可します。

    [RAM コンソール - ポリシーの作成] ページに移動し、[JSON エディター] に切り替えて、画面の指示に従ってポリシー スクリプトを設定します。

    OSS 読み取り専用ポリシー

    <myBucketName> を実際のバケット名に置き換えてください。
    {
        "Statement": [
            {
                "Action": [
                    "oss:Get*",
                    "oss:List*"
                ],
                "Effect": "Allow",
                "Resource": [
                    "acs:oss:*:*:<myBucketName>",
                    "acs:oss:*:*:<myBucketName>/*"
                ]
            }
        ],
        "Version": "1"
    }
  3. ポリシーを RAM ユーザーにアタッチします。

    1. [RAM コンソール - ユーザー] ページに移動します。ユーザーリストで対象のユーザーを見つけ、[操作] 列の [権限の追加] をクリックします。

    2. [ポリシー] セクションで、前の手順で作成したポリシーを検索して選択し、承認を完了します。

  4. データプリフィルタスクで使用する RAM ユーザーの AccessKey を作成し、Secret として保存します。

    1. [RAM コンソール - ユーザー] ページに移動し、RAM ユーザーリストで対象のユーザーをクリックし、[AccessKey] タブで [AccessKey の作成] をクリックします。

    2. ダイアログボックスの指示に従って AccessKey を作成し、AccessKey ID と AccessKey Secret を安全に保管します。

  5. クラスターに 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

パラメーター:

名前

説明

任意

デフォルト

namespace

OSSVolumePopulator は、アプリケーションおよび PVC と同じ名前空間に存在する必要があります。

いいえ

N/A

bucket

OSS バケット名。

いいえ

N/A

region

OSS の リージョン。

いいえ

N/A

endpoint

OSS サービスの エンドポイント。

いいえ

N/A

path

OSS バケット内のパスプレフィックス。例: /data/。

はい

/

mode

動作モード。指定可能な値:

  • generic (デフォルト): あらゆるバックエンドの動的ボリューム (例: クラウドディスク、CPFS 汎用版) への汎用的なデータ投入です。ack-volume-populator 名前空間に一時的な Pod を作成してデータをダウンロードし、クラスターのコンピューティングリソースを消費します。

  • bmcpfs-dataflow:CPFS for Lingjun ボリューム専用の高性能モード。ネイティブデータフローを使用し、クラスターのコンピューティングリソースを使用せずに、より高い効率を実現できます。

  • auto: ターゲットストレージタイプに基づいて最適なモードを選択しますが、通常は generic モードにフォールバックします。必要に応じて bmcpfs-dataflow を手動で指定します。

はい

auto

generic.labels

ECI にスケジューリングするためのデータ投入タスク Pod のラベル。

はい

N/A

generic.annotations

ECI スペックを設定するためのデータ投入タスク Pod のアノテーション。

はい

N/A

generic.secretRef

AccessKey を保存する Secret 名。このパラメーターと generic.rrsaConfigs のいずれかを使用します。

はい

N/A

generic.rrsaConfigs.roleArn

RRSA 認証に使用される RAM ロールの ARN。

[RAM コンソール - ロール] ページに移動し、RAM ロール名をクリックして、詳細ページから取得します。

RRSA 使用時に必須

N/A

generic.rrsaConfigs.oidcProviderArn

クラスターの OIDC プロバイダーの ARN。

ACK クラスターページに移動し、ターゲットクラスター名をクリックし、[クラスター情報] を選択し、[基本情報] タブの [RRSA OIDC] から取得します。

RRSA 使用時に必須

N/A

generic.affinity

特定のノードにスケジューリングするためのデータ投入タスク Pod の affinity。

はい

N/A

generic.tolerations

データ投入タスク Pod の tolerations。

はい

N/A

generic.throughput

データ投入タスク Pod の最大スループット (MB/s)。

bmcpfs-dataflow とは異なり、generic のパフォーマンスはノードリソース (ネットワーク、CPU) とストレージの書き込み能力に依存します。この設定は、プリフィルタスクが過剰なクラスターリソースを消費するのを防ぐために、ダウンロード速度を制限します。

はい

無制限 (実際のスループットはノードのネットワーク、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 を使用して、各並列タスク用にデータがプリフィルされた独立したクラウドディスクを作成します。

サンプルコードを展開して表示

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: parallel-data-process-with-ossvp-
  namespace: argo
spec:
  # 入力パラメーターを定義
  arguments:
    parameters:
      - name: number
        value: 2

  entrypoint: main
  # ワークフロー内の各同時実行レプリカのボリューム要求テンプレートを定義
  volumes:
    - name: scratch-volume
      # エフェメラルボリュームとして宣言し、ワークフロー完了後に自動的に削除
      ephemeral:
        volumeClaimTemplate:
          metadata:
            labels:
              diskType: scratch-volume
          spec:
            accessModes: [ "ReadWriteOnce" ]
            # サーバーレスでないコンピューティングの場合、alicloud-disk-topology-alltype に置き換えます
            storageClassName: "alicloud-disk-essd"
            resources:
              requests:
                # OSSVP によって参照される OSS データソースのサイズ以上である必要があります
                storage: 20Gi
            # データソースとして OSSVP を参照
            dataSourceRef:
              apiGroup: storage.alibabacloud.com
              kind: OSSVolumePopulator
              name: generic-demo

  templates:
    - name: main
      dag:
        tasks:
          # 複数の echo タスクを並行して実行
          - name: echo-task
            template: echo-template
            arguments:
              parameters:
                - name: index
                  value: "{{item}}"
            withSequence:
              count: "{{workflow.parameters.number}}"

    - name: echo-template
      metadata:
        labels:
          # ECI でタスクを実行
          alibabacloud.com/eci: "true" 
      container:
        image: mirrors-ssl.aliyuncs.com/busybox:latest
        command:
          - sh
          - -c
        args:
          - |
            echo "Subtask started, ID: {{inputs.parameters.index}}"
            echo "Creating a new log file..."
            touch /scratch-volume/"{{inputs.parameters.index}}-logs"
            echo "Listing contents from the disk populated by OSSVP:"
            ls /scratch-volume
            echo "Subtask completed, ID: {{inputs.parameters.index}}"
        volumeMounts:
        - name: scratch-volume
          mountPath: /scratch-volume
        resources:
          limits:
            cpu: '4'
            memory: 16Gi
          requests:
            cpu: '4'
            memory: 16Gi
      inputs:
        parameters:
          - name: index

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 によって自動的に作成されたバックエンドストレージリソース (クラウドディスク)。

解放手順:

  1. Argo Workflow の削除:

    Workflow リソースを削除します。ephemeral ボリューム要求を使用すると、削除はすべての PVC にカスケードされます。StorageClass の reclaimPolicy: Delete により、バックエンドのクラウドディスクが削除され、リソースが解放されて課金が停止します。

    # <workflow-name> を実際の Workflow 名に置き換えます
    kubectl -n argo delete workflow <workflow-name>
  2. リソース解放の確認:

    • 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 は、データの事前入力中は正常な状態です。この状態が続く場合は、次のようにトラブルシューティングしてください:

  1. kubectl describe pvc <pvc-name> -n <namespace>:PVC のイベントをチェックして、ポピュレーターのエラーを確認してください。

  2. kubectl describe ossvp <ossvp-name> -n <namespace>:OSSVP のステータスとイベントをチェックして、ポピュレーションの進捗や失敗を確認してください。

  3. generic モードでは、ack-volume-populator 名前空間で失敗したポッドを確認し、ログを確認します。一般的な原因として、OSS の権限不足、ネットワークの問題、またはストレージ容量の不足などが挙げられます。