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

Container Service for Kubernetes:ossfs 2.0 を使用した ACK クラスター内での動的 OSS ボリュームのマウント

最終更新日:Mar 27, 2026

ossfs 2.0(ユーザー空間ファイルシステム(FUSE)ベースのクライアント)を用いて、Object Storage Service (OSS) バケットを ACK クラスター内の永続ボリューム(PV)としてマウントします。ossfs 2.0 は、シーケンシャルな読み取りおよび書き込みワークロードに最適化されています。動的プロビジョニングにより、ストレージクラス(StorageClass)がテンプレートとして機能し、永続ボリューム要求(PVC)を作成すると自動的に PV を作成・バインドします。これにより、アプリケーションは標準の POSIX インターフェイスを介して OSS データを読み書きできますが、PV の手動管理は不要です。

ossfs 2.0 はシーケンシャルスループットに優れており、AI トレーニング、推論、およびビッグデータ処理に適しています。パフォーマンスベンチマークについては、「ossfs 2.0 クライアントのパフォーマンスベンチマーク」をご参照ください。

前提条件

開始前に、以下の必須制約を確認してください。ossfs 2.0 は**すべてのワークロードに適しているわけではありません**。これらの確認を怠ると、後で時間を浪費する可能性があります。

該当する場合は、ここで作業を中止してください:

  • ランダム書き込みまたは同時書き込み: ossfs 2.0 は、ランダム書き込みまたは同時書き込みの操作において、データ整合性を保証できません。 データベース、共同編集、またはファイルコンテンツをインプレースで変更するあらゆるワークロードには、ossfs 1.0 を使用してください。

  • Kubernetes バージョン 1.26 未満: RRSA 認証には Kubernetes 1.26 以降が必要です。クラスターのアップグレードが必要な場合は、行ってください。

  • CSI プラグイン バージョン 1.33.1 未満: 両方の認証方式は、CSI プラグイン バージョン 1.33.1 以降を必要とします。必要に応じて、csi-plugin および csi-provisioner の更新を行ってください。

開始前に、以下の条件を満たしていることを確認してください:

  • CSI プラグインがインストール済みの ACK クラスター

  • クラスターと同じ Alibaba Cloud アカウント内の OSS バケット。アカウントをまたいでバケットをマウントするには、RRSA 認証を使用します。詳細については、「ossfs 2.0 ボリュームに関するよくある質問」をご参照ください。

注意事項

  • データ変更は即時反映されます: Pod 内部またはホストノードから ossfs マウントポイントで行われたファイルの変更または削除は、ソース OSS バケットに即時に同期されます。誤って発生するデータ損失を防ぐために、バージョン管理 を有効化することを推奨します。

  • ヘルスチェック:OSS ボリュームを利用する Pod には、マウントポイントの可用性を検証する liveness プローブを設定してください。マウントが異常になると、Kubernetes が自動的に Pod を再起動します。

  • マルチパートアップロード: 10 MB を超えるファイルは、マルチパートアップロードを使用して自動的にアップロードされます。 アップロードが中断されると、未完了のパーツがバケットに残り、ストレージコストが発生します。 ライフサイクルルールを設定して自動的にクリーンアップするか、手動で削除します。

認証方式の選択

RRSA AccessKey
認証情報の種類 一時的、自動ローテーション(OIDC + STS 経由) 長期静的キー
権限範囲 Pod レベルの隔離 同一 Secret を使用するすべての Pod 間で共有
推奨用途 本番環境、マルチテナント環境 開発およびテストのみ
キー公開時のリスク 低 — 認証情報は自動的に有効期限切れになります 高 — キーの取り消しとローテーションを手動で実施する必要があります
キーのローテーション 自動 手動 — Secret の更新および Pod の再起動が必要です

本番環境では RRSA をご使用ください。 AccessKey 認証は、開発およびテストのみに許容されます。静的キーが公開または誤設定された場合、手動による取り消しが必要となり、ローテーション時にサービス中断が発生します。

両方式とも、以下の全体的なワークフローに従います:

  1. 認証情報の設定(RRSA の場合は RAM ロール、AccessKey の場合は RAM ユーザー+シークレット)

  2. ストレージクラス(StorageClass)の作成

  3. 永続ボリューム要求(PVC)の作成

  4. アプリケーションへのボリュームのマウント

方法 1:RRSA を使用した認証

RRSA (RAM Roles for Service Accounts) は、OpenID Connect (OIDC) とセキュリティトークンサービス (STS) を通じて、自動的にローテーションされる一時的な認証情報を使用し、Pod レベルでの権限の隔離を提供します。バックグラウンドについては、「RRSA を使用して、異なる Pod から異なるクラウドサービスへのアクセスを承認する」をご参照ください。

説明

CSI プラグインのバージョンが 1.30.4 より前の場合に RRSA を使用していた場合は、「[製品変更] CSI における ossfs のバージョンアップおよびマウントプロセスの最適化」を参照し、必要な RAM ロールの権限付与の変更を行ってください。

ステップ 1:RAM ロールの作成

このクラスターで既に RRSA を使用して OSS ボリュームをマウント済みの場合は、このステップはスキップ可能です。

  1. RRSA 機能の有効化」を ACK コンソールで行います。

  2. OIDC ID プロバイダー用の RAM ロールを作成する。サンプルロール demo-role-for-rrsa に以下のパラメーターを使用します:

    パラメーター
    ID プロバイダーの種類 OIDC
    ID プロバイダー ご利用のクラスターに関連付けられたプロバイダー(例: ack-rrsa-<cluster_id>
    oidc:iss デフォルト値のままにします
    oidc:aud デフォルト値のままにします
    oidc:sub — キー oidc:sub
    oidc:sub — 演算子 StringEquals
    oidc:sub — 値 system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs を入力します。名前空間 ack-csi-fuse は固定されており、カスタマイズできません。サービスアカウント名 csi-fuse-ossfsossfs 2.0 ボリュームに関するよくある質問 は変更可能です — 詳細については、「」をご参照ください。
    ロール名 demo-role-for-rrsa

ステップ 2:RAM ロールへの OSS 権限の付与

  1. カスタムポリシーを作成する ことで、ロールに OSS アクセスを付与します。 mybucket を実際のバケット名に置き換えます。

    • 読み取り専用アクセス

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
    • 読み取り/書き込みアクセス

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
  2. (任意) バケット内のオブジェクトが Key Management Service (KMS) のカスタマーマスターキー (CMK) で暗号化されている場合は、KMS へのアクセスも許可します。詳細については、「暗号化」をご参照ください。

  3. demo-role-for-rrsa ロールにカスタムポリシーを付与する.

    説明

    すでに OSS へのアクセス権を持つ既存の RAM ロールを再利用するには、代わりにその信頼ポリシーを変更してください。詳細については、「既存の RAM ロールを使用し、RAM ロールに必要な権限を付与する」をご参照ください。

ステップ 3:ストレージクラス(StorageClass)の作成

  1. ossfs2-sc-rrsa.yaml を作成します:

    パラメーター 必須 説明 省略時のデフォルト/動作
    bucket はい マウント対象の OSS バケット名
    path はい バケット内のベースパスです。volumeAs: sharepath を指定すると、各 PV にはこのパス配下に /ack/<pv-name> 空欄の場合はバケットルートをマウント
    url はい OSS バケットのエンドポイント。クラスターとバケットが同一リージョンにある場合、または仮想プライベートクラウド(VPC)経由で接続されている場合は、内部エンドポイント(http://oss-<region>-internal.aliyuncs.com)を使用します。クロスリージョンアクセスには、パブリックエンドポイント(http://oss-<region>.aliyuncs.com)を使用します。
    説明

    vpc100-oss-<region>.aliyuncs.com 形式の内部エンドポイントは非推奨です。新しい形式へ切り替えてください。

    fuseType はい ossfs 2.0 クライアントを使用するには、必ず ossfs2 を指定します
    authType はい rrsa
    roleName はい 偽装する RAM ロール。PV ごとに異なる権限を割り当てるには、各権限セットに対して個別の RAM ロールを作成し、ここに指定します。
    volumeAs いいえ sharepath を指定すると、各 PV が path
    otherOpts いいえ 追加のマウントオプション(フォーマット:-o <flag> -o <flag>)。詳細については、「ossfs 2.0 のマウントオプション 追加オプションなし
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ossfs2-sc
    parameters:
      bucket: cnfs-oss-test          # ご利用の OSS バケット名。
      path: /subpath                 # マウント対象のサブディレクトリ。空欄の場合はバケットルートをマウントします。
      url: oss-cn-hangzhou-internal.aliyuncs.com  # 内部エンドポイント(同一リージョンまたは VPC 接続);クロスリージョンにはパブリックエンドポイントを使用します。
      authType: rrsa
      roleName: demo-role-for-rrsa  # ステップ 1 で作成した RAM ロール。
      fuseType: ossfs2              # ossfs 2.0 クライアントを使用するには、必ず ossfs2 を指定します。
      volumeAs: sharepath           # 各 PV は path 下に一意のサブディレクトリ(例:/subpath/ack/<pv-name>)を作成します。
      otherOpts: "-o close_to_open=false"  # false(デフォルト):遅延を抑えるためメタデータをキャッシュ。true:ファイルオープン毎に最新のメタデータをフェッチ(遅延および API コスト増加)。
    provisioner: ossplugin.csi.alibabacloud.com  # 固定値。
    reclaimPolicy: Retain           # Retain のみがサポートされます。PVC の削除は PV や OSS データの削除を伴いません。
    volumeBindingMode: Immediate    # OSS ボリュームにはゾーンベースのノードアフィニティ要件はありません。

    以下の表は、parameters フィールドについて説明しています。

  2. ストレージクラス(StorageClass)を適用します:

    kubectl create -f ossfs2-sc-rrsa.yaml
  3. ストレージクラス(StorageClass)が正しく作成されたことを確認します:

    kubectl get sc ossfs2-sc

    期待される出力:

    NAME        PROVISIONER                      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    ossfs2-sc   ossplugin.csi.alibabacloud.com   Retain          Immediate                                  10s

ステップ 4:永続ボリューム要求(PVC)の作成

PVC の作成により、基盤となる PV の自動プロビジョニングがトリガーされます。

  1. ossfs2-pvc-dynamic.yaml を作成します:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-ossfs2
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      storageClassName: ossfs2-sc
  2. PVC を作成します:

    kubectl create -f ossfs2-pvc-dynamic.yaml
  3. PVC が自動作成された PV にバインドされていることを確認します:

    kubectl get pvc pvc-ossfs2

    期待される出力:

    NAME        STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-ossfs2  Bound    d-bp17y03tpy2b8x******   20Gi       RWX            ossfs2-sc      25s

ステップ 5:アプリケーションへのボリュームのマウント

  1. ossfs2-test.yaml を作成します。以下の StatefulSet は、PVC を /data にマウントします:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: ossfs2-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ossfs2-test
      template:
        metadata:
          labels:
            app: ossfs2-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-ossfs2
              mountPath: /data
          volumes:
            - name: pvc-ossfs2
              persistentVolumeClaim:
                claimName: pvc-ossfs2
  2. アプリケーションをデプロイします:

    kubectl create -f ossfs2-test.yaml
  3. Pod が実行中であることを確認します:

    kubectl get pod -l app=ossfs2-test

    期待される出力:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          2m
  4. マウントポイントへの読み取り/書き込みアクセスを確認します:

    # テストファイルの作成
    kubectl exec -it ossfs2-test-0 -- touch /data/test.txt
    # マウントポイントのファイル一覧表示
    kubectl exec -it ossfs2-test-0 -- ls /data

    出力に test.txt が含まれている場合、ボリュームが正しくマウントされ、書き込み可能であることが確認できます。

方法 2:AccessKey を使用した認証

重要

この方法では長期静的キーを使用します。開発およびテストのみにご使用ください。本番環境では、代わりにRRSA 認証をご利用ください。

PV が参照する AccessKey が取り消された場合、またはその権限が変更された場合、当該ボリュームを利用するすべての Pod が即座にアクセスできなくなります。アクセスを復元するには、シークレット内の認証情報を更新し、Pod を再起動する必要があります。この操作により一時的なサービス中断が発生するため、メンテナンスウィンドウ中に実施してください。

ステップ 1:RAM ユーザーの作成および認証情報のシークレットへの保存

RAM ユーザーの作成および OSS 権限の付与

  1. お持ちでない場合は、RAM ユーザーを作成する

  2. カスタムポリシーを作成する ことで、OSS へのアクセスを許可できます。mybucket を実際のバケット名に置き換えます。

    • 読み取り専用アクセス

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
    • 読み取り/書き込みアクセス

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
  3. (オプション) バケット内のオブジェクトがKMSでCMKを使用して暗号化されている場合、KMSアクセスも付与します。詳細については、「暗号化」をご参照ください。

  4. RAM ユーザーにカスタムポリシーを付与する

  5. RAM ユーザーに AccessKey ペアを作成する

AccessKey を Kubernetes シークレットに保存

以下のコマンドを実行します。プレースホルダーの値を実際の AccessKey ID および AccessKey シークレットに置き換えてください:

kubectl create -n default secret generic oss-secret \
  --from-literal='akId=<your-access-key-id>' \
  --from-literal='akSecret=<your-access-key-secret>'

ステップ 2:ストレージクラス(StorageClass)の作成

  1. ossfs2-sc.yaml を作成します:

    シークレット構成

    パラメーター 必須 説明
    csi.storage.k8s.io/node-publish-secret-name はい AccessKey を格納するシークレットの名前
    csi.storage.k8s.io/node-publish-secret-namespace はい シークレットが配置されている名前空間

    ボリューム構成

    パラメーター 必須 説明 省略時のデフォルト/動作
    fuseType はい ossfs 2.0 クライアントを使用するには、必ず ossfs2 を指定します
    bucket はい マウント対象の OSS バケット名
    path いいえ バケットルートからの相対パスで指定するマウントパス 空欄の場合はバケットルートをマウント
    url はい OSS バケットのエンドポイント。同一リージョンまたは VPC 接続の場合は内部エンドポイント(http://oss-<region>-internal.aliyuncs.com)、クロスリージョンの場合はパブリックエンドポイント(http://oss-<region>.aliyuncs.com)をご利用ください。
    説明

    vpc100-oss-<region>.aliyuncs.com 形式の内部エンドポイントは非推奨です。

    otherOpts いいえ 追加のマウントオプション。フォーマットは-o <flag> -o <flag>です。利用可能なすべてのオプションについては、「ossfs 2.0 マウントオプション 追加オプションなし
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ossfs2-sc
    parameters:
      csi.storage.k8s.io/node-publish-secret-name: oss-secret       # 上記で作成したシークレット。
      csi.storage.k8s.io/node-publish-secret-namespace: default      # シークレットが配置されている名前空間。
      fuseType: ossfs2              # ossfs 2.0 クライアントを使用するには、必ず ossfs2 を指定します。
      bucket: cnfs-oss-test         # ご利用の OSS バケット名。
      path: /subpath                # マウント対象のサブディレクトリ。空欄の場合はバケットルートをマウントします。
      url: oss-cn-hangzhou-internal.aliyuncs.com  # 内部エンドポイント(同一リージョンまたは VPC 接続);クロスリージョンにはパブリックエンドポイントを使用します。
      otherOpts: "-o close_to_open=false"  # false(デフォルト):遅延を抑えるためメタデータをキャッシュ。true:ファイルオープン毎に最新のメタデータをフェッチ(遅延および API コスト増加)。
    provisioner: ossplugin.csi.alibabacloud.com  # 固定値。
    reclaimPolicy: Retain           # Retain のみがサポートされます。PVC の削除は PV や OSS データの削除を伴いません。
    volumeBindingMode: Immediate    # OSS ボリュームにはゾーンベースのノードアフィニティ要件はありません。
  2. ストレージクラス(StorageClass)を作成します:

    kubectl create -f ossfs2-sc.yaml

ステップ 3:永続ボリューム要求(PVC)の作成

  1. ossfs2-pvc-dynamic.yaml を作成します:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-ossfs2
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      storageClassName: ossfs2-sc
  2. PVC を作成します:

    kubectl create -f ossfs2-pvc-dynamic.yaml
  3. PVC がバインドされていることを確認します:

    kubectl get pvc pvc-ossfs2

    期待される出力:

    NAME        STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-ossfs2  Bound    d-bp17y03tpy2b8x******   20Gi       RWX            ossfs2-sc      25s

ステップ 4:アプリケーションへのボリュームのマウント

  1. ossfs2-test.yaml を作成します:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: ossfs2-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ossfs2-test
      template:
        metadata:
          labels:
            app: ossfs2-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-ossfs2
              mountPath: /data
          volumes:
            - name: pvc-ossfs2
              persistentVolumeClaim:
                claimName: pvc-ossfs2
  2. アプリケーションをデプロイします:

    kubectl create -f ossfs2-test.yaml
  3. Pod が実行中であることを確認します:

    kubectl get pod -l app=ossfs2-test

    期待される出力:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          2m
  4. 読み取り/書き込みアクセスを確認します:

    # テストファイルの作成
    kubectl exec -it ossfs2-test-0 -- touch /data/test.txt
    # マウントポイントのファイル一覧表示
    kubectl exec -it ossfs2-test-0 -- ls /data

    出力に test.txt が含まれている場合、ボリュームが正しくマウントされ、書き込み可能であることが確認できます。

本番環境に適用

カテゴリ ベストプラクティス
セキュリティ RRSA をご使用ください。これは一時的かつ自動ローテーションされる認証情報を提供し、Pod レベルの権限隔離を実現することで、静的キー公開のリスクを排除します。必要な最小限の権限(特定のバケットに対する読み取り専用または読み取り/書き込みアクセス)のみを付与してください。
パフォーマンス クラスターとバケットが同じリージョンにある場合は、公開データ転送コストを回避し、レイテンシーを削減するために、内部エンドポイントを使用します。多数の小さなファイルを読み取るワークロードの場合、メタデータ API 呼び出しを削減するために、close_to_open=false (デフォルト) のままにします。別のシステムがバケット内のオブジェクトを頻繁に更新し、Pod に即時可視性が必要な場合にのみ、close_to_open=true を設定します。追加のチューニングについては、「ossfs 2.0 マウントオプション」をご参照ください。
ワークロード適合性 ossfs 2.0 は、読み取り中心および追加のみのワークロード(AI トレーニング、推論、ビッグデータ処理、自動運転)に最適化されています。データベースや共同編集など、ランダム書き込みを伴うワークロードには適していません。
コスト OSS バケットにライフサイクルルールを設定し、不完全なマルチパートアップロードを自動的に削除してください。これにより、大規模ファイルのアップロード中断時に蓄積するストレージコストを防止できます。
運用 Pod にliveness プローブを設定して、マウントポイントの可用性を確認してください。マウントが失敗すると、Kubernetes によって Pod が自動的に再起動されます。また、コンテナストレージのモニタリングを設定すると、ボリュームのパフォーマンスを追跡し、問題がワークロードに影響を与える前にアラートを受信できます。

よくある質問