コンテナ化環境では、従来のソリューションは、多くの場合、ossfs などのユーザー空間ファイルシステム (FUSE) ベースのファイルシステムを使用して、オブジェクトストレージデータをマウントします。ただし、小規模ファイルの読み取り集中型シナリオ (AI トレーニングデータセットの読み込み、時系列ログ分析、および数百万の小規模ファイルの高速トラバーサルを必要とするその他のビジネス運用など) の場合、従来のソリューションでは高スループットと低レイテンシの要件を満たすことができません。このような場合は、strmvol ボリュームを使用してオブジェクトストレージデータをマウントすることで仮想ブロックデバイスソリューションを使用し、小規模ファイルの読み取りパフォーマンスを最適化することをお勧めします。
使用上の注意
strmvol ボリューム
Object Storage Service (OSS) データへのアクセスには、内部エンドポイントのみを使用できます。
仮想ブロックデバイスは、初期化中に完全なファイルメタデータインデックスを構築する必要があり、このフェーズではノードリソースがいくらか必要になります。アプリケーション ポッドは ContainerCreating 状態のままです。必要なリソースと時間は、OSS バケットマウントパス内のファイル数に直接関係します。
OSS バケットマウントパスを選択する際は、最小権限の原則に従ってください。
たとえば、アプリケーション A が OSS バケットの
/app/a/の下のコンテンツにアクセスし、アプリケーション B が/app/b/の下のコンテンツにアクセスする場合、A と B にそれぞれ/app/a/と/app/b/のターゲットマウントパスを持つ個別のストレージボリュームを作成することをお勧めします。初期化中の時間とリソースのオーバーヘッドについては、「メタデータインデックスの構築」をご参照ください。
マウント中の仮想ブロックデバイスによって占有されるリソースは、初期化フェーズを除き、永続ボリューム (PV) の構成によって制限されます。十分なノードリソースを予約してください。
仮想ブロックデバイスを使用すると、アタッチされた OSS パスに最大 16 TiB のデータを格納できます。
クラスタとノードの要件
クラスタは ACK マネージド Pro クラスタ または ACK 専用クラスター で、Kubernetes バージョン 1.20 以後である必要があり、ストレージプラグインタイプは CSI である必要があります。
ノードのカーネルバージョンは 4.19 以後です。リソース仕様を 4C8G 以上に設定することをお勧めします。
サポートされているノード オペレーティングシステム: 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 の EOL」をご参照ください。
仮想ノードにスケジュールされたサーバーレス ポッドに strmvol ボリュームをマウントすることはできません。
準備
ステップ 1: strmvol-csi-driver をデプロイする
strmvol ボリュームには、個別のコンテナストレージインターフェース (CSI) ドライバ (strmvol-csi-driver) が必要です。CSI ドライバがデプロイされると、ACK クラスタの csi-provisioner コンポーネントと csi-plugin コンポーネントとは独立して動作します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、strmvol-csi-driver を検索し、対応するカードをクリックします。
詳細ページで、右上隅にある [デプロイ] をクリックします。
表示されるパネルで、基本情報とパラメータを構成し、[OK] をクリックします。
ステップ 2: OSS アクセス権限を構成する
RAM ユーザーを作成し、権限を付与します。
RAM ユーザーを作成します。既存の RAM ユーザーがいる場合は、この手順をスキップできます。RAM ユーザーの作成方法の詳細については、「RAM ユーザーを作成する」をご参照ください。
RAM ユーザーに OSS アクセス権限を付与するカスタムポリシーを作成します。詳細については、「カスタムポリシーを作成する」をご参照ください。
ビジネス要件に基づいて、読み取り専用ポリシーまたは読み取り/書き込みポリシーを選択します。
mybucketを作成したバケットの名前に置き換えます。OSS に対する読み取り専用権限を提供するポリシー
OSS に対する読み取り/書き込み権限を提供するポリシー
オプション。OSS バケット内のオブジェクトが Key Management Service (KMS) の指定されたカスタマーマスターキー (CMK) を使用して暗号化されている場合は、RAM ユーザーに KMS アクセス権限を付与する必要があります。詳細については、「暗号化」をご参照ください。
RAM ユーザーに OSS アクセス権限を付与します。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
RAM ユーザーの AccessKey ペアを作成します。詳細については、「AccessKey ペアの作成」をご参照ください。
OSS データにアクセスするための認証情報を格納するシークレットを作成します。
以下はコマンド例です。
akIdとakSecretを実際の AccessKey に置き換えます。kubectl create -n default secret generic strmvol-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'
strmvol ボリュームをマウントする
ステップ 1: strmvol ボリュームを作成する
静的にプロビジョニングされた strmvol ボリュームをマウントする
PV を作成します。
次の YAML ファイルを変更し、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
永続ボリューム要求 (PVC) を作成します。
次の YAML ファイルを変更し、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次の出力は、PV が PVC にバインドされていることを示しています。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-strmvol-2 Bound pv-strmvol 20Gi ROX <unset> 16s
動的にプロビジョニングされた strmvol ボリュームをマウントする
StorageClass を作成します。
次の YAML ファイルを変更し、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: Immediate次の表で、
parametersについて説明します。シークレットを構成する
パラメータ
必須
説明
csi.storage.k8s.io/node-stage-secret-name必須
AccessKey 情報を格納するシークレットの名前。
csi.storage.k8s.io/node-stage-secret-namespace必須
AccessKey 情報を格納するシークレットの名前空間。
PV を構成する
パラメータ
必須
説明
bucket必須
マウントする OSS バケット。
pathオプション
注: このチュートリアルでは、基本的な WordPress のデプロイについて説明します。より高度な構成については、公式ドキュメントを参照してください。
重要最小権限の原則に基づいてマウントパスを選択します。
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 を作成します。
次の YAML ファイルを変更し、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次の出力は、CSI プラグインによって PV が自動的に作成され、PVC にバインドされていることを示しています。
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 ボリュームをマウントする
strmvol-test.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
次の YAML 例では、1 つのポッドを持つ StatefulSet を作成します。ポッドは
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 を作成し、strmvol ボリュームを StatefulSet にマウントします。
kubectl create -f strmvol-test.yamlStatefulSet によってプロビジョニングされたポッドがデプロイされているかどうかを確認します。
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 <OSS マウントパス内のデータ>