永続ストレージまたは Pod 間のデータ共有を必要とするアプリケーションの場合、静的にプロビジョニングされた Persistent Volume (PV) と Persistent Volume Claim (PVC) を使用して、Object Storage Service (OSS) バケットを ossfs 2.0 ボリュームとしてマウントできます。このアプローチにより、アプリケーションコンテナーは、ローカルファイルシステムのように、標準の POSIX インターフェイスを使用して OSS 内のデータを読み書きできます。これは、ビッグデータ分析、AI トレーニング、静的コンテンツの配信などのシナリオに最適です。
ossfs 1.0 と比較して、ossfs 2.0 はシーケンシャルな読み取りおよび書き込みパフォーマンスに優れており、OSS の高帯域幅を活用するのに最適です。
パフォーマンスの詳細については、「ossfs 2.0 クライアントのパフォーマンスベンチマーク」をご参照ください。
ワークフローの概要
Container Service for Kubernetes (ACK) クラスターに静的にプロビジョニングされた ossfs 2.0 ボリュームをマウントするプロセスは次のとおりです。
|
考慮事項
ワークロードの適合性: ossfs 2.0 は、読み取り専用およびシーケンシャルな追記書き込みシナリオ向けに設計されています。ランダムまたは同時書き込みシナリオでは、データ整合性を保証できません。これらのケースでは ossfs 1.0 の使用を推奨します。
データ安全性: ossfs マウントポイント内のファイルの変更または削除 (Pod 内またはホストノード上からのいずれか) は、ソース OSS バケットと即座に同期されます。偶発的なデータ損失を防ぐために、バケットのバージョン管理を有効にすることを推奨します。
アプリケーションのヘルスチェック: OSS ボリュームを使用する Pod にヘルスチェック (liveness probe) を設定します。たとえば、マウントポイントがまだアクセス可能であることを確認します。マウントが異常になった場合、Pod は自動的に再起動され、接続性が回復します。
マルチパートアップロード管理: 大容量ファイル (> 10 MB) をアップロードする場合、ossfs は自動的にマルチパートアップロードを使用します。アップロードが中断されると、不完全なパートがバケットに残ります。ストレージコストを節約するために、これらのパートを手動で削除するか、ライフサイクルルールを設定してこれらのパートを自動的にクリーンアップします。
方法 1: RRSA を使用した認証
RRSA を活用することで、クラウドリソースにアクセスするための詳細な PV レベルの権限分離を実現でき、セキュリティリスクを大幅に削減できます。詳細については、「RRSA を使用して異なる Pod が異なるクラウドサービスにアクセスすることを承認する」をご参照ください。
前提条件
Kubernetes 1.26 以降を実行している ACK クラスターが必要です。必要に応じて、クラスターを手動でアップグレードしてください。
Container Storage Interface (CSI) プラグインのバージョンが 1.33.1 以降であること。アップグレードするには、「csi-plugin と csi-provisioner のアップグレード」をご参照ください。
1.30.4 より前のバージョンで RRSA を使用する場合は、「[製品の変更] CSI での ossfs のバージョンアップグレードとマウントプロセスの最適化」をご参照のうえ、RAM ロールの権限付与を設定してください。
クラスターと同じ Alibaba Cloud アカウントに OSS バケットを作成済みであること。
アカウントをまたいで OSS バケットをマウントするには、RRSA 認証方式の使用を推奨します。詳細については、「アカウントをまたいで OSS バケットをマウントする方法
ステップ 1: RAM ロールを作成する
RRSA を使用してクラスターに OSS ボリュームをマウントしたことがある場合は、このステップをスキップしてください。初めての場合は、次の手順に従ってください。
OIDC IdP 用の RAM ロールを作成します。このロールは RRSA を使用して偽装されます。
次の表に、サンプルロール
demo-role-for-rrsaの主要なパラメーターを示します。パラメーター
説明
ID プロバイダータイプ
[OIDC] を選択します。
ID プロバイダー
クラスターに関連付けられているプロバイダーを選択します。例:
ack-rrsa-<cluster_id>。ここで、<cluster_id>は実際のクラスター ID です。条件
oidc:iss: デフォルト値のままにします。
oidc:aud: デフォルト値のままにします。
oidc:sub: 次の条件を手動で追加します。
キー: [oidc:sub] を選択します。
演算子: [StringEquals] を選択します。
値:
system:serviceaccount:ack-csi-fuse:csi-fuse-ossfsと入力します。この値において、
ack-csi-fuseは ossfs クライアントが配置されている名前空間であり、カスタマイズできません。csi-fuse-ossfsはサービスアカウント名であり、必要に応じて変更できます。サービスアカウント名の変更方法の詳細については、「RRSA 認証で指定の ARN または ServiceAccount を使用するにはどうすればよいですか?
ロール名
demo-role-for-rrsaと入力します。
ステップ 2: demo-role-for-rrsa ロールに権限を付与する
OSS アクセス用のカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。
要件に応じて読み取り専用または読み取り/書き込みポリシーを選択し、
mybucketをお使いのバケットの名前に置き換えます。OSS 読み取り専用ポリシー
OSS 読み取り/書き込みポリシー
(オプション) KMS で管理される CMK ID を使用して OSS オブジェクトを暗号化する場合、RAM ユーザーに KMS 権限も設定する必要があります。詳細については、「暗号化操作」をご参照ください。
demo-role-for-rrsa ロールに権限を付与します。詳細については、「RAM ロールへの権限付与」をご参照ください。
説明信頼ポリシーを変更することで、OSS 権限が付与されている既存の RAM ロールを使用することもできます。詳細については、「既存の RAM ロールの使用と権限付与」をご参照ください。
ステップ 3: PV を作成する
PV を作成して、既存の OSS バケットをクラスターに登録します。
次の内容で
ossfs2-pv.yamlという名前のファイルを作成します。この PV 定義は、RRSA ロールを使用して OSS バケットにアクセスする方法を Kubernetes に指示します。次の PV は、
cnfs-oss-testという名前の OSS バケットを、クラスター内の Pod が使用するための 20 GB の読み取り専用ファイルシステムとしてマウントします。apiVersion: v1 kind: PersistentVolume metadata: name: pv-ossfs2 # PV 名 spec: capacity: storage: 20Gi # ボリューム容量を定義します (この値は PVC のマッチングにのみ使用されます) accessModes: # アクセスモード - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: pv-ossfs2 # PV 名 (metadata.name) と同じである必要があります volumeAttributes: fuseType: ossfs2 bucket: cnfs-oss-test # OSS バケットの名前 path: /subpath # マウントするサブディレクトリ。ルートディレクトリをマウントする場合は空のままにします。 url: oss-cn-hangzhou-internal.aliyuncs.com # OSS バケットが配置されているリージョンのエンドポイント otherOpts: "-o close_to_open=false" authType: "rrsa" roleName: "demo-role-for-rrsa" # 先ほど作成した RAM ロールvolumeAttributes内のパラメーター:パラメーター
必須
説明
fuseTypeはい
マウントに使用するクライアントを指定します。ossfs 2.0 クライアントを使用するには、
ossfs2に設定する必要があります。bucketはい
マウントする OSS バケットの名前。
pathいいえ
OSS バケット内でマウントするサブディレクトリ。指定しない場合、デフォルトでバケットのルートがマウントされます。
urlはい
OSS バケットのアクセス エンドポイント。
クラスターノードとバケットが同じリージョンにある場合、または Virtual Private Cloud (VPC) 接続が確立されている場合は、内部エンドポイントを使用します。
マウントノードとバケットが異なるリージョンにある場合は、パブリックエンドポイントを使用します。
以下は、さまざまなアクセスエンドポイントの一般的なフォーマットです。
内部:
http://oss-{{regionName}}-internal.aliyuncs.comまたはhttps://oss-{{regionName}}-internal.aliyuncs.com。内部アクセスエンドポイントのフォーマット
vpc100-oss-{{regionName}}.aliyuncs.comは非推奨です。できるだけ早く新しいフォーマットに切り替えてください。パブリック:
http://oss-{{regionName}}.aliyuncs.comまたはhttps://oss-{{regionName}}.aliyuncs.com。
otherOptsいいえ
OSS ボリュームに渡される追加のマウントオプション。
-o *** -o ***の形式でスペース区切りのフラグの文字列として指定します。例:-o close_to_open=false。close-to-openオプションはメタデータの一貫性を制御します。false(デフォルト) に設定すると、メタデータがキャッシュされ、小さなファイルの読み取りパフォーマンスが向上します。trueに設定すると、クライアントはファイルが開かれるたびにGetObjectMetaリクエストを送信して OSS から新しいメタデータをフェッチし、待機時間と API 呼び出しが増加する代わりにリアルタイムの一貫性を確保します。その他のオプションパラメーターの詳細については、「ossfs 2.0 マウントオプション」をご参照ください。
authTypeはい
RRSA 認証方式が使用されることを宣言するために
rrsaに設定します。roleNameはい
作成または変更した RAM ロールの名前に設定します。
異なる PV に異なる権限を割り当てるには、各権限セットに対して個別の RAM ロールを作成します。次に、各 PV の定義で
roleNameパラメーターを使用して、対応するロールに関連付けます。RRSA 認証方式で指定の ARN または ServiceAccount を使用する方法については、「RRSA 認証方式で指定の ARN または ServiceAccount を使用するにはどうすればよいですか?」をご参照ください。
PV 定義を適用します。
kubectl create -f ossfs2-pv.yamlPV のステータスを確認します。
kubectl get pv pv-ossfs2出力は、PV のステータスが
Availableであることを示しています。NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-ossfs2 20Gi ROX Retain Available <unset> 15s
ステップ 4: PVC を作成する
アプリケーションが必要とする永続ストレージ容量を宣言するために PVC を作成します。
次の YAML コンテンツで
ossfs2-pvc-static.yamlという名前のファイルを作成します。kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 # PVC 名 namespace: default spec: # 以下の設定は PV と一致している必要があります accessModes: - ReadOnlyMany resources: requests: storage: 20Gi volumeName: pv-ossfs2 # バインドする PVPVC を作成します。
kubectl create -f ossfs2-pvc-static.yamlPVC のステータスを確認します。
kubectl get pvc pvc-ossfs2出力は、 PVC が PV にバインドされていることを示しています。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-ossfs2 Bound pv-ossfs2 20Gi ROX <unset> 6s
ステップ 5: アプリケーションを作成してボリュームをマウントする
これで、PVC をアプリケーションにマウントできます。
アプリケーションを定義するために
ossfs2-test.yamlという名前のファイルを作成します。次の YAML テンプレートは、1 つの Pod を含む StatefulSet を作成します。Pod は
pvc-ossfs2という名前の PVC を介してストレージリソースを要求し、ボリュームを/dataパスにマウントします。アプリケーションをデプロイします。
kubectl create -f ossfs2-test.yamlPod のデプロイメントステータスを確認します。
kubectl get pod -l app=ossfs2-test期待される出力:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 12mアプリケーションが OSS のデータにアクセスできることを確認します。
kubectl exec -it ossfs2-test-0 -- ls /data出力には、OSS マウントパスのデータが表示されるはずです。
方法 2: AccessKey を使用した認証
ACK は、静的な AccessKey を Kubernetes Secret に保存することで OSS ボリュームマウントを認証することをサポートしています。このアプローチは、特定のアプリケーションが長期的で固定されたアクセス権限を必要とするシナリオに適しています。
PV によって参照される AccessKey が取り消されたり、その権限が変更されたりすると、ボリュームを使用しているアプリケーションは即座にアクセスを失い、権限エラーが発生します。アクセスを復元するには、Secret 内の認証情報を更新し、アプリケーションの Pod を再起動して再マウントを強制します。このプロセスは短いサービス中断を引き起こすため、スケジュールされたメンテナンスウィンドウ中にのみ実行する必要があります。
手動でのキーローテーションに伴うダウンタイムを避けるために、代わりに RRSA 認証方式を使用することを強く推奨します。
前提条件
CSI V1.33.1 以降がインストールされた ACK クラスターが必要です。コンポーネントをアップグレードするには、「csi-plugin と csi-provisioner のアップグレード」をご参照ください。
クラスターと同じ Alibaba Cloud アカウントに OSS バケットがあること。
アカウントをまたいで OSS バケットをマウントするには、RRSA 認証の使用を推奨します。詳細については、「アカウントをまたいで OSS バケットをマウントする方法
ステップ 1: OSS アクセス権限を持つ RAM ユーザーを作成し、AccessKey ペアを取得する
RAM ユーザーの作成と権限の付与
RAM ユーザーを作成します。すでに RAM ユーザーがいる場合は、このステップをスキップできます。詳細については、「RAM ユーザーの作成」をご参照ください。
OSS アクセス用のカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。
要件に応じて読み取り専用または読み取り/書き込みポリシーを選択し、
mybucketをお使いのバケットの名前に置き換えます。OSS 読み取り専用ポリシー
OSS 読み取り/書き込みポリシー
(オプション) KMS で管理される CMK ID を使用して OSS オブジェクトを暗号化する場合、RAM ユーザーに KMS 権限も設定する必要があります。詳細については、「暗号化操作」をご参照ください。
RAM ユーザーに OSS 権限を付与します。詳細については、「RAM ユーザーへの権限付与」をご参照ください。
RAM ユーザーの AccessKey を作成します。詳細については、「AccessKey の取得」をご参照ください。
AccessKey 認証情報を保存する Secret を作成する
次のコマンドを実行して、OSS 認証用の Secret を作成します。akId と akSecret を実際の認証情報に置き換えてください。
kubectl create -n default secret generic oss-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'ステップ 2: PV を作成する
PV を作成して、既存の OSS バケットをクラスターに登録します。
次の内容で
ossfs2-pv-ak.yamlという名前のファイルを作成します。この PV 定義には、作成した Secret を指すnodePublishSecretRefが含まれています。次の PV は、
cnfs-oss-testという名前の OSS バケットを、クラスター内の Pod が使用するための 20 GB の読み取り専用ファイルシステムとしてマウントします。apiVersion: v1 kind: PersistentVolume metadata: name: pv-ossfs2 # PV 名 spec: capacity: storage: 20Gi # ボリューム容量を定義します (この値は PVC のマッチングにのみ使用されます) accessModes: # アクセスモード - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: pv-ossfs2 # PV 名 (metadata.name) と同じである必要があります # 先ほど作成した Secret を使用します nodePublishSecretRef: name: oss-secret # AccessKey 情報を保存する Secret の名前 namespace: default # Secret が配置されている名前空間 volumeAttributes: fuseType: ossfs2 bucket: cnfs-oss-test # OSS バケットの名前 path: /subpath # マウントするサブディレクトリ。ルートディレクトリをマウントする場合は空のままにします。 url: oss-cn-hangzhou-internal.aliyuncs.com # OSS バケットが配置されているリージョンのエンドポイント otherOpts: "-o close_to_open=false"nodePublishSecretRef内のパラメーター:パラメーター
必須
説明
nameはい
AccessKey 情報を保存する Secret の名前。
namespaceはい
AccessKey 情報を保存する Secret が配置されている名前空間。
volumeAttributes内のパラメーター:パラメーター
必須
説明
fuseTypeはい
マウントに使用するクライアントを指定します。ossfs 2.0 クライアントを使用するには、
ossfs2に設定する必要があります。bucketはい
マウントする OSS バケットの名前。
pathいいえ
OSS バケットのマウントパス。バケットのルートからのディレクトリ構造を表します。
urlはい
OSS バケットのマウントに使用されるエンドポイント。エンドポイントは、OSS コンソールのバケットの [概要] ページで確認できます。
ノードとバケットが同じリージョンにある場合、または VPC 接続が確立されている場合は、内部エンドポイントを使用します。
ノードとバケットが異なるリージョンにある場合は、パブリックエンドポイントを使用します。
さまざまなアクセスポートで一般的に使用されるフォーマットは次のとおりです。
内部エンドポイントフォーマット:
http://oss-{{regionName}}-internal.aliyuncs.comまたはhttps://oss-{{regionName}}-internal.aliyuncs.com。パブリックエンドポイントフォーマット:
http://oss-{{regionName}}.aliyuncs.comまたはhttps://oss-{{regionName}}.aliyuncs.com。
重要vpc100-oss-{{regionName}}.aliyuncs.com内部エンドポイントフォーマットは非推奨です。すぐに新しいフォーマットに切り替えてください。otherOptsいいえ
OSS ボリュームのカスタムパラメーターを
-o *** -o ***のフォーマットで入力します。例:-o close_to_open=false。close-to-open: デフォルトでは無効になっています。有効にすると、ファイルが開かれるたびにシステムが GetObjectMeta リクエストを OSS に送信して最新のメタデータを取得します。これにより、メタデータが常に最新であることが保証されます。ただし、多数の小さなファイルを読み取るシナリオでは、頻繁なメタデータクエリによってアクセス待機時間が大幅に増加する可能性があります。
その他のオプションパラメーターの詳細については、「ossfs 2.0 マウントオプション」をご参照ください。
PV 定義を適用します。
kubectl create -f ossfs2-pv.yamlPV のステータスを確認します。
kubectl get pv pv-ossfs2次の出力は、PV が
Availableであることを示しています:NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-ossfs2 20Gi ROX Retain Available <unset> 15s
ステップ 3: PVC を作成する
アプリケーションが必要とする永続ストレージ容量を宣言するために PVC を作成します。
PV を要求するために
ossfs2-pvc-static.yamlという名前のファイルを作成します。kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 # PVC 名 namespace: default spec: # 以下の設定は PV と一致している必要があります accessModes: - ReadOnlyMany resources: requests: storage: 20Gi volumeName: pv-ossfs2 # バインドする PVPVC を作成します。
kubectl create -f ossfs2-pvc-static.yamlPVC が PV に
Boundされていることを確認します。kubectl get pvc pvc-ossfs2期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-ossfs2 Bound pv-ossfs2 20Gi ROX <unset> 6s
ステップ 4: アプリケーションを作成してボリュームをマウントする
これで、PVC をアプリケーションにマウントできます。
アプリケーションを定義するために
ossfs2-test.yamlという名前のファイルを作成します。次の YAML テンプレートは、1 つの Pod を含む StatefulSet を作成します。Pod は
pvc-ossfs2という名前の PVC を介してストレージリソースを要求し、ボリュームを/dataパスにマウントします。アプリケーションをデプロイします。
kubectl create -f ossfs2-test.yamlPod のデプロイメントステータスを確認します。
kubectl get pod -l app=ossfs2-test期待される出力:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 12mアプリケーションが OSS のデータにアクセスできることを確認します。
kubectl exec -it ossfs2-test-0 -- ls /data出力には、OSS マウントパスのデータが表示されるはずです。
本番環境での適用
カテゴリ | ベストプラクティス |
セキュリティと権限 |
|
パフォーマンスとコスト |
|
O&M 管理 |
|