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

Container Service for Kubernetes:strmvol ボリュームを使用した OSS の小規模ファイルの読み取りの最適化

最終更新日:Apr 11, 2026

コンテナ化アプリケーションにおいて、オブジェクトストレージのデータをマウントする従来の方法は、ossfs のようなユーザー空間ファイルシステム (FUSE) ベースのファイルシステムを使用することです。しかし、このアプローチは、AI 訓練データセットのロードや時系列ログの分析など、数百万の小規模ファイルが関与し、高いスループットと低いレイテンシーが不可欠な読み取り集中型のシナリオでは、多くの場合、性能が不十分です。これらのユースケースでは、仮想ブロックデバイスソリューションの使用を推奨します。strmvol ボリュームで Object Storage Service (OSS) のデータを直接マウントすることで、小規模ファイルの読み取り性能を大幅に最適化できます。

注意事項

strmvol ボリューム

  • OSS データへのアクセスには、内部エンドポイントのみ使用できます。

  • 仮想ブロックデバイスが初期化されると、完全なファイルメタデータインデックスが構築されます。このプロセスはノードリソースを消費し、アプリケーション Pod が `ContainerCreating` 状態のままになります。必要な時間とリソースは、OSS バケットのマウントパス内のファイル数に正比例します。

    • OSS バケットのマウントパスを選択する際は、最小権限の原則に従ってください。

      ビジネス A が OSS バケット内の /app/a/ 以下のコンテンツにアクセスし、ビジネス B が /app/b/ 以下のコンテンツにアクセスする場合、ビジネス A とビジネス B 用にそれぞれマウントターゲットパスを /app/a//app/b/ として、別々のボリュームを作成します。

    • 初期化中の時間とリソースのオーバーヘッドに関する詳細については、「メタデータインデックスの構築」をご参照ください。

  • PersistentVolume (PV) の設定は、初期化フェーズを除き、マウントライフサイクル中の仮想ブロックデバイスのリソース消費を制限します。十分なノードリソースを確保してください。

  • 単一の仮想ブロックデバイスの容量は 16 TiB であり、マウントされる OSS パスも 16 TiB のデータに制限されます。

クラスターとノードの要件

  • クラスターは、Kubernetes 1.20 以降を実行する ACK マネージドプロ版クラスター または ACK 専用クラスター である必要があります。ストレージプラグインは Container Storage Interface (CSI) プラグインである必要があります。

  • ノードはカーネルバージョン 4.19 以降を使用する必要があります。少なくとも 4 vCPU と 8 GiB のメモリを持つリソース仕様を推奨します。

  • サポートされているノードオペレーティングシステム:Alibaba Cloud Linux 3、Alibaba Cloud Linux 2、および CentOS 7。erofs オペレーティングシステム でデータアクセス性能を最適化するには、Alibaba Cloud Linux 3 の使用を推奨します。

    説明

    CentOS 7 と Alibaba Cloud Linux 2 は保守終了 (EOL) となりました。詳細については、「[製品変更] Alibaba Cloud Linux 2 および CentOS 7 のサポート終了に関するお知らせ」をご参照ください。

  • 仮想ノードにスケジュールされたサーバーレス Pod には strmvol ボリュームをマウントできません。

前提条件

ステップ 1:strmvol-csi-driver のデプロイ

strmvol ボリュームを使用するには、別の CSI ドライバーである strmvol-csi-driver コンポーネントをデプロイする必要があります。デプロイ後、この CSI ドライバーは独立して動作し、ACK によって管理される csi-provisioner および csi-plugin コンポーネントとは競合しません。

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、ストア > Marketplace を選択します。

  2. Marketplace ページで、strmvol-csi-driver を検索し、そのカードをクリックします。

  3. アプリケーション詳細ページで、右上隅にある デプロイ をクリックします。

  4. 表示されるパネルで、基本情報とパラメーターを設定し、OK をクリックします。

ステップ 2:OSS アクセス権限の設定

  1. RAM ユーザーを作成し、必要な権限を付与します。

    1. OSS アクセス用のカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。

      要件に応じて、以下の読み取り専用および読み取り/書き込み権限ポリシーから選択し、mybucket をご利用のバケット名に置き換えます。

      • OSS 読み取り専用ポリシー

        読み取り専用ポリシーを表示するにはクリックします

        {
            "Statement": [
                {
                    "Action": [
                        "oss:Get*",
                        "oss:List*"
                    ],
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
      • OSS 読み取り/書き込みポリシー

        読み取り/書き込みポリシーを表示するにはクリックします

        {
            "Statement": [
                {
                    "Action": "oss:*",
                    "Effect": "Allow",
                    "Resource": [
                        "acs:oss:*:*:mybucket",
                        "acs:oss:*:*:mybucket/*"
                    ]
                }
            ],
            "Version": "1"
        }
    2. (オプション) Key Management Service (KMS) のカスタマーマスターキー (CMK) で OSS オブジェクトを暗号化する場合、RAM ユーザーに KMS 権限も付与する必要があります。詳細については、「ossfs 1.0 ボリュームの暗号化」をご参照ください。

    3. RAM ユーザーに OSS 権限を付与します。詳細については、「RAM ユーザー権限の管理」をご参照ください。

  2. OSS データへのアクセス用の認証情報を保存するためのシークレットを作成します。

    以下はコマンドの例です。akIdakSecret をご利用の AccessKey ID と AccessKey Secret に置き換えてください。

    kubectl create -n default secret generic strmvol-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'

strmvol ボリュームのマウント

ステップ 1:strmvol ボリュームの作成

静的ボリューム

  1. PersistentVolume (PV) を作成します。

    1. 以下の内容で strmvol-pv.yaml という名前のファイルを作成します。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-strmvol
      spec:
        capacity:
        # マウントされた OSS パスは最大 16 TiB のデータを保存できます。
          storage: 20Gi
        # ReadOnlyMany アクセスモードのみがサポートされています。
        accessModes:
          - ReadOnlyMany
        # 偶発的なデータ損失を防ぐため、Retain ポリシーのみがサポートされています。
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: strmvolplugin.csi.alibabacloud.com
          volumeHandle: pv-strmvol
          # 前提条件のステップで作成したシークレットを使用します。
          nodeStageSecretRef:
            name: strmvol-secret
            namespace: default
          volumeAttributes:
            bucket: cnfs-oss-test
            path: /subpath
            # strmvol ボリュームは、内部ネットワーク経由での OSS データへのアクセスのみをサポートします。
            url: oss-cn-hangzhou-internal.aliyuncs.com
            umask: "000"
            directMode: "false"
            resourceLimit: "2c4g"
      • nodeStageSecretRef のパラメーター

        パラメーター

        必須

        説明

        name

        はい

        AccessKey 情報を保存するシークレットの名前。

        namespace

        はい

        AccessKey 情報を含むシークレットの名前空間。

      • volumeAttributes のパラメーター

        パラメーター

        必須

        説明

        bucket

        はい

        マウントする OSS バケット。

        path

        いいえ

        OSS バケット内でマウントするディレクトリのパス。このパスはバケットのルートからの相対パスです。

        重要

        最小権限の原則に基づいてマウントパスを選択してください。

        url

        はい

        OSS の内部エンドポイント。これは、OSS コンソールのバケットの概要ページに表示されるエンドポイントと一致する必要があります。内部エンドポイントの一般的なフォーマットは次のとおりです:

        http://oss-{{regionName}}-internal.aliyuncs.com または https://oss-{{regionName}}-internal.aliyuncs.com

        重要

        vpc100-oss-{{regionName}}.aliyuncs.com 内部エンドポイントフォーマットは非推奨です。できるだけ早く新しいフォーマットに更新してください。

        umask

        いいえ

        仮想ブロックデバイスがマウントされた後のファイルシステムの権限マスク。

        たとえば、デフォルトのファイル権限を `755` に設定するには、`umask` を `022` に設定します。

        directMode

        いいえ

        ダイレクトモードを有効にするかどうかを指定します。

        • "true":ダイレクトモードを有効にします。これにより、データプリフェッチとローカルキャッシュが無効になります。これは、訓練データセットのランダムなバッチ読み取りなど、ランダム読み取りシナリオに適しています。

        • "false":ダイレクトモードを無効にします (デフォルト)。これは、小規模ファイルのシーケンシャル読み取りや大規模ファイルの読み取りなど、汎用的なシナリオに適しています。アプリケーションに特定のデータアクセスパターンがない場合は、このモードを無効のままにしてください。

        resourceLimit

        いいえ

        仮想ブロックデバイスが消費できる最大のノードリソース。

        たとえば、"2c4g" は、仮想ブロックデバイスがノードから最大 2 vCPU と 4 GiB のメモリを使用できることを示します。

        説明
        • メモリは主にデータプリフェッチとローカルキャッシュに使用されます。ダイレクトモードが有効な場合、メモリ使用量はプリセット値よりも大幅に低くなります。

        • Alibaba Cloud Linux 3 以外のオペレーティングシステムでは、設定に関係なく読み取り性能はほぼ同じです。そのため、高いリソース制限は推奨されません。詳細については、「データ読み取り性能テスト」をご参照ください。

    2. PV を作成します。

      kubectl create -f strmvol-pv.yaml
    3. PV のステータスを確認します。

      kubectl get pv pv-strmvol

      期待される出力:

      NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
      pv-strmvol   20Gi       ROX            Retain           Available                          <unset>                          18s
  2. PersistentVolumeClaim (PVC) を作成します。

    1. 以下の内容で strmvol-pvc-static.yaml という名前のファイルを作成します。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-strmvol
        namespace: default
      spec:
        # 以下の設定は PV の構成と一致する必要があります。
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 20Gi
        volumeName: pv-strmvol
    2. PVC を作成します。

      kubectl create -f strmvol-pvc-static.yaml
    3. PVC のステータスを確認します。

      kubectl get pvc pvc-strmvol

      期待される出力は、PVC が PV にバインドされていることを示します。

      NAME            STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      pvc-strmvol-2   Bound    pv-strmvol   20Gi       ROX                           <unset>                 16s

動的ボリューム

  1. StorageClass を作成します。

    1. 以下の内容で strmvol-sc.yaml という名前のファイルを作成します。

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: strmvol-test
      parameters:
        # 前提条件のステップで作成したシークレットを使用します。
        csi.storage.k8s.io/node-stage-secret-name: strmvol-secret  
        csi.storage.k8s.io/node-stage-secret-namespace: default
        bucket: cnfs-oss-test 
        path: /subpath
        # strmvol ボリュームは、内部ネットワーク経由での OSS データへのアクセスのみをサポートします。
        url: oss-cn-hangzhou-internal.aliyuncs.com 
        umask: "000"
        directMode: "false"
        resourceLimit: "2c4g"
      provisioner: strmvolplugin.csi.alibabacloud.com
      # 偶発的なデータ損失を防ぐため、Retain ポリシーのみがサポートされています。
      reclaimPolicy: Retain
      volumeBindingMode: Immediate

      parameters のパラメーターは以下のとおりです:

      • シークレット設定

        パラメーター

        必須

        説明

        csi.storage.k8s.io/node-stage-secret-name

        はい

        AccessKey 情報を保存するシークレットの名前。

        csi.storage.k8s.io/node-stage-secret-namespace

        はい

        AccessKey 情報を含むシークレットの名前空間。

      • ボリューム設定

        パラメーター

        必須

        説明

        bucket

        はい

        マウントする OSS バケット。

        path

        いいえ

        OSS バケット内でマウントするディレクトリのパス。このパスはバケットのルートからの相対パスです。

        重要

        最小権限の原則に基づいてマウントパスを選択してください。

        url

        はい

        OSS の内部エンドポイント。これは、OSS コンソールのバケットの概要ページに表示されるエンドポイントと一致する必要があります。内部エンドポイントの一般的なフォーマットは次のとおりです:

        http://oss-{{regionName}}-internal.aliyuncs.com または https://oss-{{regionName}}-internal.aliyuncs.com

        重要

        vpc100-oss-{{regionName}}.aliyuncs.com 内部エンドポイントフォーマットは非推奨です。できるだけ早く新しいフォーマットに更新してください。

        umask

        いいえ

        仮想ブロックデバイスがマウントされた後のファイルシステムの権限マスク。

        たとえば、デフォルトのファイル権限を `755` に設定するには、`umask` を `022` に設定します。

        directMode

        いいえ

        ダイレクトモードを有効にするかどうかを指定します。

        • "true":ダイレクトモードを有効にします。これにより、データプリフェッチとローカルキャッシュが無効になります。これは、訓練データセットのランダムなバッチ読み取りなど、ランダム読み取りシナリオに適しています。

        • "false":ダイレクトモードを無効にします (デフォルト)。これは、小規模ファイルのシーケンシャル読み取りや大規模ファイルの読み取りなど、汎用的なシナリオに適しています。アプリケーションに特定のデータアクセスパターンがない場合は、このモードを無効のままにしてください。

        resourceLimit

        いいえ

        仮想ブロックデバイスが消費できる最大のノードリソース。

        たとえば、"2c4g" は、仮想ブロックデバイスがノードから最大 2 vCPU と 4 GiB のメモリを使用できることを示します。

        説明
        • メモリは主にデータプリフェッチとローカルキャッシュに使用されます。ダイレクトモードが有効な場合、メモリ使用量はプリセット値よりも大幅に低くなります。

        • Alibaba Cloud Linux 3 以外のオペレーティングシステムでは、設定に関係なく読み取り性能はほぼ同じです。そのため、高いリソース制限は推奨されません。詳細については、「データ読み取り性能テスト」をご参照ください。

    2. StorageClass を作成します。

      kubectl create -f strmvol-sc.yaml
  2. PVC を作成します。

    1. 以下の内容で strmvol-pvc-dynamic.yaml という名前のファイルを作成します。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-strmvol
        namespace: default
      spec:
        # ReadOnlyMany アクセスモードのみがサポートされています。
        accessModes:
          - ReadOnlyMany
        # StorageClass を指定します。
        storageClassName: strmvol-test
        resources:
          requests:
            # マウントされた OSS パスは最大 16 TiB のデータを保存できます。
            storage: 20Gi
    2. PVC を作成します。

      kubectl create -f strmvol-pvc-dynamic.yaml
    3. PVC のステータスを確認します。

      kubectl get pvc pvc-strmvol

      期待される出力は、PVC が CSI ドライバーによって自動的にプロビジョニングされた PV にバインドされていることを示します。

      NAME          STATUS   VOLUME                                         CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      pvc-strmvol   Bound    strmvol-d8d1d22a-e1d7-4caa-b875-54f378dec769   20Gi       ROX            strmvol-test   <unset>                 3m

ステップ 2:アプリケーションの作成とボリュームのマウント

  1. 以下の内容で strmvol-test.yaml という名前のファイルを作成します。

    以下の YAML の例では、1 つの Pod を持つ StatefulSet を作成します。Pod は pvc-strmvol という名前の PVC を使用してストレージリソースを要求し、マウントパスは /data です。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: strmvol-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: strmvol-test
      template:
        metadata:
          labels:
            app: strmvol-test
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-strmvol
              mountPath: /data
          volumes:
            - name: pvc-strmvol
              persistentVolumeClaim:
                claimName: pvc-strmvol
  2. StatefulSet を作成します。

    kubectl create -f strmvol-test.yaml
  3. StatefulSet 内の Pod のデプロイメントステータスを確認します。

    kubectl get pod -l app=strmvol-test

    期待される出力:

    NAME             READY   STATUS    RESTARTS   AGE
    strmvol-test-0   1/1     Running   0          14s
  4. マウントポイントがブロックデバイスであり、アプリケーションが OSS 内のデータにアクセスできることを確認します。

    kubectl exec -it strmvol-test-0 -- sh -c "df /data && ls /data"

    期待される出力:

    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/ublkb1        24812 24812         0 100% /data
    <data in OSS mount path>

関連ドキュメント

strmvol クライアントの性能テスト