永続ストレージまたは Pod 間のデータ共有を必要とするアプリケーションの場合、動的にプロビジョニングされた永続ボリューム (PV) を使用して、Object Storage Service (OSS) バケットを ossfs 2.0 ボリュームとしてマウントできます。このアプローチでは、StorageClass をテンプレートとして使用して PV を自動的に作成およびバインドします。これにより、ストレージ管理が簡素化されるだけでなく、アプリケーションがローカルファイルシステムのように標準の POSIX インターフェイスを使用して OSS 内のデータを読み書きできるようになります。
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 プローブ) を設定します。たとえば、マウントポイントがまだアクセス可能であることを確認します。マウントが異常になった場合、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: StorageClass の作成
動的に PV をプロビジョニングするためのテンプレートとして使用する StorageClass を作成します。
次の内容で
ossfs2-sc-rrsa.yamlという名前のファイルを作成します。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ossfs2-sc # StorageClass の名前。 parameters: bucket: cnfs-oss-test # バケットの名前。 path: /subpath # マウントするサブディレクトリ。空のままにすると、ルートディレクトリがマウントされます。 url: oss-cn-hangzhou-internal.aliyuncs.com # OSS バケットが配置されているリージョンのエンドポイント。 authType: rrsa roleName: demo-role-for-rrsa # 先ほど作成した RAM ロール。 fuseType: ossfs2 volumeAs: sharepath otherOpts: "-o close_to_open=false" provisioner: ossplugin.csi.alibabacloud.com # この値は固定です。 reclaimPolicy: Retain # 動的にプロビジョニングされた PV のリクレイムポリシー。Retain のみがサポートされており、PVC が削除されても PV と OSS バケット内のデータは削除されません。 volumeBindingMode: Immediate # ボリュームバインディングモード。OSS ボリュームはゾーンベースのノードアフィニティを必要としないため、デフォルト値の Immediate を使用できます。次の表に、
parametersフィールドのパラメーターを示します。パラメーター
必須
説明
bucketはい
マウントする OSS バケットの名前。
pathはい
バケット内のベースパス。
volumeAsがsharepathに設定されている場合、動的にプロビジョニングされた各 PV には、このパスの下に/ack/<pv-name>などの一意のサブディレクトリが割り当てられます。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。
fuseTypeはい
マウントに使用するクライアントを指定します。ossfs 2.0 クライアントを使用するには、
ossfs2に設定する必要があります。authTypeはい
RRSA 認証方式が使用されることを宣言するには、
rrsaに設定します。roleNameはい
作成または変更した RAM ロールの名前に設定します。
異なる PV に異なる権限を割り当てるには、権限セットごとに個別の RAM ロールを作成します。次に、各 PV の定義で
roleNameパラメーターを使用して、対応するロールに関連付けます。volumeAsいいえ
PV がどのようにプロビジョニングされるかを定義します。
sharepathは、各 PV がpathで指定されたディレクトリに個別のサブディレクトリを作成することを示します。otherOptsいいえ
OSS ボリュームに渡される追加のマウントオプションで、
-o *** -o ***の形式でスペース区切りのフラグの文字列として指定します。例:-o close_to_open=false。close-to-openオプションは、メタデータの一貫性を制御します。false(デフォルト) に設定すると、メタデータがキャッシュされ、小さなファイルの読み取りパフォーマンスが向上します。trueに設定すると、クライアントはファイルが開かれるたびにGetObjectMetaリクエストを送信して OSS から最新のメタデータをフェッチし、待機時間と API 呼び出しの増加を犠牲にしてリアルタイムの一貫性を確保します。その他のオプションパラメーターについては、「ossfs 2.0 マウントオプション」をご参照ください。
StorageClass を適用します。
kubectl create -f ossfs2-sc-rrsa.yamlStorageClass のステータスを確認します。
kubectl get sc ossfs2-sc期待される出力:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE ossfs2-sc ossplugin.csi.alibabacloud.com Retain Immediate 10s
ステップ 4: PVC の作成
StorageClass からストレージリソースをリクエストするために PVC を作成します。この操作により、基になる PV の自動作成がトリガーされます。
次の内容で
ossfs2-pvc-dynamic.yamlという名前のファイルを作成します。kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 # PVC の名前。 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc # 先ほど作成した StorageClass。PVC を作成します。
kubectl create -f ossfs2-pvc-dynamic.yamlPVC が
Boundであることを確認します。これは、自動的に作成された 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: アプリケーションの作成とボリュームのマウント
これで、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 2mマウントポイントへの読み取りと書き込みが可能であることを確認します。
# テストファイルをマウントターゲットに書き込みます。 kubectl exec -it ossfs2-test-0 -- touch /data/test.txt # マウントターゲットの内容を表示します。 kubectl exec -it ossfs2-test-0 -- ls /data出力には、作成した
test.txtファイルが表示され、ボリュームがマウントされ、書き込み権限があることを示します。
方法 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: StorageClass の作成
次の内容で
ossfs2-sc.yamlという名前のファイルを作成します。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ossfs2-sc parameters: # 準備段階で作成した Secret を使用します。 csi.storage.k8s.io/node-publish-secret-name: oss-secret csi.storage.k8s.io/node-publish-secret-namespace: default fuseType: ossfs2 bucket: cnfs-oss-test # バケットの名前。 path: /subpath # マウントするサブディレクトリ。空のままにすると、ルートディレクトリがマウントされます。 url: oss-cn-hangzhou-internal.aliyuncs.com # OSS バケットが配置されているリージョンのエンドポイント。 otherOpts: "-o close_to_open=false" provisioner: ossplugin.csi.alibabacloud.com # この値は固定です。 reclaimPolicy: Retain # 動的にプロビジョニングされた PV のリクレイムポリシー。Retain のみがサポートされており、PVC が削除されても PV と OSS バケット内のデータは削除されません。 volumeBindingMode: Immediate # ボリュームバインディングモード。OSS ボリュームはゾーンベースのノードアフィニティを必要としないため、デフォルト値の Immediate を使用できます。次の表に、
parametersフィールドのパラメーターを示します。Secret の構成
パラメーター
必須
説明
csi.storage.k8s.io/node-publish-secret-nameはい
AccessKey 情報を保存する Secret の名前。
csi.storage.k8s.io/node-publish-secret-namespaceはい
AccessKey 情報を保存する Secret が配置されている名前空間。
ボリューム構成
パラメーター
必須
説明
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いいえ
-o *** -o ***の形式で OSS ボリュームのカスタムパラメーターを入力します。例:-o close_to_open=false。close-to-open: デフォルトでは無効になっています。有効にすると、ファイルが開かれるたびにシステムが GetObjectMeta リクエストを OSS に送信して最新のメタデータを取得します。これにより、メタデータが常に最新であることが保証されます。ただし、多数の小さなファイルを読み取るシナリオでは、頻繁なメタデータクエリによってアクセス待機時間が大幅に増加する可能性があります。
その他のオプションパラメーターについては、「ossfs 2.0 マウントオプション」をご参照ください。
StorageClass を作成します。
kubectl create -f ossfs2-sc.yaml
ステップ 3: PVC の作成
StorageClass からストレージリソースをリクエストするために PVC を作成します。この操作により、基になる PV の自動作成がトリガーされます。
次の内容で
ossfs2-pvc-dynamic.yamlという名前のファイルを作成します。kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 # PVC の名前。 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc # 先ほど作成した StorageClass。PVC を作成します。
kubectl create -f ossfs2-pvc-dynamic.yamlPVC が
Boundであることを確認します。これは、自動的に作成された PV にバインドされていることを示します。kubectl get pvc pvc-ossfs2期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-ossfs2 Bound d-bp17y03tpy2b8x****** 20Gi RWX ossfs2-sc 25s
ステップ 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 2mマウントポイントへの読み取りと書き込みが可能であることを確認します。
# テストファイルをマウントターゲットに書き込みます。 kubectl exec -it ossfs2-test-0 -- touch /data/test.txt # マウントターゲットの内容を表示します。 kubectl exec -it ossfs2-test-0 -- ls /data出力には、作成した
test.txtファイルが表示され、ボリュームがマウントされ、書き込み権限があることを示します。
本番環境での適用
カテゴリ | ベストプラクティス |
セキュリティと権限 |
|
パフォーマンスとコスト |
|
O&M 管理 |
|