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 認証は、開発およびテストのみに許容されます。静的キーが公開または誤設定された場合、手動による取り消しが必要となり、ローテーション時にサービス中断が発生します。
両方式とも、以下の全体的なワークフローに従います:
-
認証情報の設定(RRSA の場合は RAM ロール、AccessKey の場合は RAM ユーザー+シークレット)
-
ストレージクラス(StorageClass)の作成
-
永続ボリューム要求(PVC)の作成
-
アプリケーションへのボリュームのマウント
方法 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 ボリュームをマウント済みの場合は、このステップはスキップ可能です。
-
「RRSA 機能の有効化」を ACK コンソールで行います。
-
OIDC ID プロバイダー用の RAM ロールを作成する。サンプルロール
demo-role-for-rrsaに以下のパラメーターを使用します:パラメーター 値 ID プロバイダーの種類 OIDC ID プロバイダー ご利用のクラスターに関連付けられたプロバイダー(例: ack-rrsa-<cluster_id>oidc:iss デフォルト値のままにします oidc:aud デフォルト値のままにします oidc:sub — キー oidc:suboidc: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 権限の付与
-
カスタムポリシーを作成する ことで、ロールに 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" }
-
-
(任意) バケット内のオブジェクトが Key Management Service (KMS) のカスタマーマスターキー (CMK) で暗号化されている場合は、KMS へのアクセスも許可します。詳細については、「暗号化」をご参照ください。
-
demo-role-for-rrsaロールにカスタムポリシーを付与する.説明すでに OSS へのアクセス権を持つ既存の RAM ロールを再利用するには、代わりにその信頼ポリシーを変更してください。詳細については、「既存の RAM ロールを使用し、RAM ロールに必要な権限を付与する」をご参照ください。
ステップ 3:ストレージクラス(StorageClass)の作成
-
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フィールドについて説明しています。 -
ストレージクラス(StorageClass)を適用します:
kubectl create -f ossfs2-sc-rrsa.yaml -
ストレージクラス(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 の自動プロビジョニングがトリガーされます。
-
ossfs2-pvc-dynamic.yamlを作成します:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc -
PVC を作成します:
kubectl create -f ossfs2-pvc-dynamic.yaml -
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:アプリケーションへのボリュームのマウント
-
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 -
アプリケーションをデプロイします:
kubectl create -f ossfs2-test.yaml -
Pod が実行中であることを確認します:
kubectl get pod -l app=ossfs2-test期待される出力:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m -
マウントポイントへの読み取り/書き込みアクセスを確認します:
# テストファイルの作成 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 権限の付与
-
お持ちでない場合は、RAM ユーザーを作成する。
-
カスタムポリシーを作成する ことで、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" }
-
-
(オプション) バケット内のオブジェクトがKMSでCMKを使用して暗号化されている場合、KMSアクセスも付与します。詳細については、「暗号化」をご参照ください。
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)の作成
-
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 ボリュームにはゾーンベースのノードアフィニティ要件はありません。 -
ストレージクラス(StorageClass)を作成します:
kubectl create -f ossfs2-sc.yaml
ステップ 3:永続ボリューム要求(PVC)の作成
-
ossfs2-pvc-dynamic.yamlを作成します:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc -
PVC を作成します:
kubectl create -f ossfs2-pvc-dynamic.yaml -
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:アプリケーションへのボリュームのマウント
-
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 -
アプリケーションをデプロイします:
kubectl create -f ossfs2-test.yaml -
Pod が実行中であることを確認します:
kubectl get pod -l app=ossfs2-test期待される出力:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m -
読み取り/書き込みアクセスを確認します:
# テストファイルの作成 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 が自動的に再起動されます。また、コンテナストレージのモニタリングを設定すると、ボリュームのパフォーマンスを追跡し、問題がワークロードに影響を与える前にアラートを受信できます。 |