コンテナ化アプリケーションにおいて、オブジェクトストレージのデータをマウントする従来の方法は、ossfs のようなユーザー空間ファイルシステム (FUSE) ベースのファイルシステムを使用することです。しかし、このアプローチは、AI 訓練データセットのロードや時系列ログの分析など、数百万の小規模ファイルが関与し、高いスループットと低いレイテンシーが不可欠な読み取り集中型のシナリオでは、多くの場合、性能が不十分です。これらのユースケースでは、仮想ブロックデバイスソリューションの使用を推奨します。strmvol ボリュームで Object Storage Service (OSS) のデータを直接マウントすることで、小規模ファイルの読み取り性能を大幅に最適化できます。
注意事項
strmvol ボリューム
OSS データへのアクセスには、内部エンドポイントのみ使用できます。
仮想ブロックデバイスが初期化されると、完全なファイルメタデータインデックスが構築されます。このプロセスはノードリソースを消費し、アプリケーション Pod が `ContainerCreating` 状態のままになります。必要な時間とリソースは、OSS バケットのマウントパス内のファイル数に正比例します。
OSS バケットのマウントパスを選択する際は、最小権限の原則に従ってください。
ビジネス A が OSS バケット内の
/app/a/以下のコンテンツにアクセスし、ビジネス B が/app/b/以下のコンテンツにアクセスする場合、ビジネス A とビジネス B 用にそれぞれマウントターゲットパスを/app/a/と/app/b/として、別々のボリュームを作成します。初期化中の時間とリソースのオーバーヘッドに関する詳細については、「メタデータインデックスの構築」をご参照ください。
PersistentVolume (PV) の設定は、初期化フェーズを除き、マウントライフサイクル中の仮想ブロックデバイスのリソース消費を制限します。十分なノードリソースを確保してください。
単一の仮想ブロックデバイスの容量は 16 TiB であり、マウントされる OSS パスも 16 TiB のデータに制限されます。
クラスターとノードの要件
クラスターは、Kubernetes 1.20 以降を実行する ACK マネージドプロ版クラスター または ACK 専用クラスター である必要があります。ストレージプラグインは Container Storage Interface (CSI) プラグインである必要があります。
ノードはカーネルバージョン 4.19 以降を使用する必要があります。少なくとも 4 vCPU と 8 GiB のメモリを持つリソース仕様を推奨します。
サポートされているノードオペレーティングシステム: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 のサポート終了に関するお知らせ」をご参照ください。
仮想ノードにスケジュールされたサーバーレス Pod には strmvol ボリュームをマウントできません。
前提条件
ステップ 1:strmvol-csi-driver のデプロイ
strmvol ボリュームを使用するには、別の CSI ドライバーである strmvol-csi-driver コンポーネントをデプロイする必要があります。デプロイ後、この CSI ドライバーは独立して動作し、ACK によって管理される csi-provisioner および csi-plugin コンポーネントとは競合しません。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
Marketplace ページで、strmvol-csi-driver を検索し、そのカードをクリックします。
アプリケーション詳細ページで、右上隅にある デプロイ をクリックします。
表示されるパネルで、基本情報とパラメーターを設定し、OK をクリックします。
ステップ 2:OSS アクセス権限の設定
RAM ユーザーを作成し、必要な権限を付与します。
OSS アクセス用のカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。
要件に応じて、以下の読み取り専用および読み取り/書き込み権限ポリシーから選択し、
mybucketをご利用のバケット名に置き換えます。OSS 読み取り専用ポリシー
OSS 読み取り/書き込みポリシー
読み取り/書き込みポリシーを表示するにはクリックします
{ "Statement": [ { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] } ], "Version": "1" }
(オプション) Key Management Service (KMS) のカスタマーマスターキー (CMK) で OSS オブジェクトを暗号化する場合、RAM ユーザーに KMS 権限も付与する必要があります。詳細については、「ossfs 1.0 ボリュームの暗号化」をご参照ください。
RAM ユーザーに OSS 権限を付与します。詳細については、「RAM ユーザー権限の管理」をご参照ください。
OSS データへのアクセス用の認証情報を保存するためのシークレットを作成します。
以下はコマンドの例です。
akIdとakSecretをご利用の AccessKey ID と AccessKey Secret に置き換えてください。kubectl create -n default secret generic strmvol-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'
strmvol ボリュームのマウント
ステップ 1:strmvol ボリュームの作成
静的ボリューム
PersistentVolume (PV) を作成します。
以下の内容で 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 以外のオペレーティングシステムでは、設定に関係なく読み取り性能はほぼ同じです。そのため、高いリソース制限は推奨されません。詳細については、「データ読み取り性能テスト」をご参照ください。
PV を作成します。
kubectl create -f strmvol-pv.yamlPV のステータスを確認します。
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
PersistentVolumeClaim (PVC) を作成します。
以下の内容で strmvol-pvc-static.yaml という名前のファイルを作成します。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-strmvol namespace: default spec: # 以下の設定は PV の構成と一致する必要があります。 accessModes: - ReadOnlyMany resources: requests: storage: 20Gi volumeName: pv-strmvolPVC を作成します。
kubectl create -f strmvol-pvc-static.yamlPVC のステータスを確認します。
kubectl get pvc pvc-strmvol期待される出力は、PVC が PV にバインドされていることを示します。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-strmvol-2 Bound pv-strmvol 20Gi ROX <unset> 16s
動的ボリューム
StorageClass を作成します。
以下の内容で 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: Immediateparametersのパラメーターは以下のとおりです:シークレット設定
パラメーター
必須
説明
csi.storage.k8s.io/node-stage-secret-nameはい
AccessKey 情報を保存するシークレットの名前。
csi.storage.k8s.io/node-stage-secret-namespaceはい
AccessKey 情報を含むシークレットの名前空間。
ボリューム設定
パラメーター
必須
説明
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 以外のオペレーティングシステムでは、設定に関係なく読み取り性能はほぼ同じです。そのため、高いリソース制限は推奨されません。詳細については、「データ読み取り性能テスト」をご参照ください。
StorageClass を作成します。
kubectl create -f strmvol-sc.yaml
PVC を作成します。
以下の内容で 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: 20GiPVC を作成します。
kubectl create -f strmvol-pvc-dynamic.yamlPVC のステータスを確認します。
kubectl get pvc pvc-strmvol期待される出力は、PVC が CSI ドライバーによって自動的にプロビジョニングされた PV にバインドされていることを示します。
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-test.yaml という名前のファイルを作成します。
以下の YAML の例では、1 つの Pod を持つ StatefulSet を作成します。Pod は
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-strmvolStatefulSet を作成します。
kubectl create -f strmvol-test.yamlStatefulSet 内の Pod のデプロイメントステータスを確認します。
kubectl get pod -l app=strmvol-test期待される出力:
NAME READY STATUS RESTARTS AGE strmvol-test-0 1/1 Running 0 14sマウントポイントがブロックデバイスであり、アプリケーションが 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 <data in OSS mount path>