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

Container Service for Kubernetes:strmvol ボリュームを使用して小規模 OSS ファイルの読み取りパフォーマンスを最適化する

最終更新日:Jun 26, 2025

コンテナ化環境では、従来のソリューションは、多くの場合、ossfs などのユーザー空間ファイルシステム (FUSE) ベースのファイルシステムを使用して、オブジェクトストレージデータをマウントします。ただし、小規模ファイルの読み取り集中型シナリオ (AI トレーニングデータセットの読み込み、時系列ログ分析、および数百万の小規模ファイルの高速トラバーサルを必要とするその他のビジネス運用など) の場合、従来のソリューションでは高スループットと低レイテンシの要件を満たすことができません。このような場合は、strmvol ボリュームを使用してオブジェクトストレージデータをマウントすることで仮想ブロックデバイスソリューションを使用し、小規模ファイルの読み取りパフォーマンスを最適化することをお勧めします。

使用上の注意

strmvol ボリューム

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

  • 仮想ブロックデバイスは、初期化中に完全なファイルメタデータインデックスを構築する必要があり、このフェーズではノードリソースがいくらか必要になります。アプリケーション ポッドは ContainerCreating 状態のままです。必要なリソースと時間は、OSS バケットマウントパス内のファイル数に直接関係します。

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

      たとえば、アプリケーション A が OSS バケットの /app/a/ の下のコンテンツにアクセスし、アプリケーション B が /app/b/ の下のコンテンツにアクセスする場合、A と B にそれぞれ /app/a//app/b/ のターゲットマウントパスを持つ個別のストレージボリュームを作成することをお勧めします。

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

  • マウント中の仮想ブロックデバイスによって占有されるリソースは、初期化フェーズを除き、永続ボリューム (PV) の構成によって制限されます。十分なノードリソースを予約してください。

  • 仮想ブロックデバイスを使用すると、アタッチされた OSS パスに最大 16 TiB のデータを格納できます。

クラスタとノードの要件

  • クラスタは ACK マネージド Pro クラスタ または ACK 専用クラスター で、Kubernetes バージョン 1.20 以後である必要があり、ストレージプラグインタイプは CSI である必要があります。

  • ノードのカーネルバージョンは 4.19 以後です。リソース仕様を 4C8G 以上に設定することをお勧めします。

  • サポートされているノード オペレーティングシステム: 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 の EOL」をご参照ください。

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

準備

ステップ 1: strmvol-csi-driver をデプロイする

strmvol ボリュームには、個別のコンテナストレージインターフェース (CSI) ドライバ (strmvol-csi-driver) が必要です。CSI ドライバがデプロイされると、ACK クラスタの csi-provisioner コンポーネントと csi-plugin コンポーネントとは独立して動作します。

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。

  2. [マーケットプレイス] ページで、strmvol-csi-driver を検索し、対応するカードをクリックします。

  3. 詳細ページで、右上隅にある [デプロイ] をクリックします。

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

ステップ 2: OSS アクセス権限を構成する

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

    1. RAM ユーザーを作成します。既存の RAM ユーザーがいる場合は、この手順をスキップできます。RAM ユーザーの作成方法の詳細については、「RAM ユーザーを作成する」をご参照ください。

    2. RAM ユーザーに 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"
        }
    3. オプション。OSS バケット内のオブジェクトが Key Management Service (KMS) の指定されたカスタマーマスターキー (CMK) を使用して暗号化されている場合は、RAM ユーザーに KMS アクセス権限を付与する必要があります。詳細については、「暗号化」をご参照ください。

    4. RAM ユーザーに OSS アクセス権限を付与します。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

    5. RAM ユーザーの AccessKey ペアを作成します。詳細については、「AccessKey ペアの作成」をご参照ください。

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

    以下はコマンド例です。akIdakSecret を実際の AccessKey に置き換えます。

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

strmvol ボリュームをマウントする

ステップ 1: strmvol ボリュームを作成する

静的にプロビジョニングされた strmvol ボリュームをマウントする

  1. PV を作成します。

    1. 次の YAML ファイルを変更し、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. 永続ボリューム要求 (PVC) を作成します。

    1. 次の YAML ファイルを変更し、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

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

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

動的にプロビジョニングされた strmvol ボリュームをマウントする

  1. StorageClass を作成します。

    1. 次の YAML ファイルを変更し、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 情報を格納するシークレットの名前空間。

      • PV を構成する

        パラメータ

        必須

        説明

        bucket

        必須

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

        path

        オプション

        注: このチュートリアルでは、基本的な WordPress のデプロイについて説明します。より高度な構成については、公式ドキュメントを参照してください。

        重要

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

        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. 次の YAML ファイルを変更し、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

      次の出力は、CSI プラグインによって PV が自動的に作成され、PVC にバインドされていることを示しています。

      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: アプリケーションを作成し、strmvol ボリュームをマウントする

  1. strmvol-test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    次の YAML 例では、1 つのポッドを持つ StatefulSet を作成します。ポッドは 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 を作成し、strmvol ボリュームを StatefulSet にマウントします。

    kubectl create -f strmvol-test.yaml
  3. StatefulSet によってプロビジョニングされたポッドがデプロイされているかどうかを確認します。

    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
    <OSS マウントパス内のデータ>

関連情報

strmvol ボリュームのパフォーマンステスト