アプリケーションでイメージ、オーディオファイル、ビデオファイルなどの非構造化データを保存する必要がある場合は、Object Storage Service (OSS) ボリュームを永続ボリューム (PV) としてアプリケーションにマウントします。このトピックでは、この方法と、OSS ボリュームを使用してデータを共有および永続化できるかどうかを確認する方法について説明します。
考慮事項
OSS は、Alibaba Cloud が提供する安全で費用対効果が高く、大容量で信頼性の高いクラウドストレージサービスです。これは、頻繁に変更されないデータや、イメージ、オーディオファイル、ビデオファイルなどの非構造化データに適しています。詳細については、「ストレージの概要」をご参照ください。
OSS は共有ストレージサービスです。 1 つの OSS バケットを複数のポッドにマウントできます。
マウントディレクトリには 1,000 ファイル以下を保存することをお勧めします。
ossfs 1.0 を使用して
lsなどの操作を実行すると、ファイルメタデータを取得するために OSS に HTTP リクエストが送信されます。リストされたディレクトリに含まれるファイルが多すぎると、ossfs が過剰なシステムメモリを消費し、ポッドでメモリ不足 (OOM) エラーが発生する可能性があります。これを軽減するには、ディレクトリをパーティション化するか、OSS バケットのサブディレクトリをマウントします。
OSS バケットを作成し、バケット情報を取得する
OSS バケットを作成します。
OSS コンソール にログインします。左側のナビゲーションウィンドウで、[バケット] をクリックします。
[バケットの作成] をクリックします。
[バケットの作成] パネルで、パラメーターを構成し、[作成] をクリックします。
次の表にパラメーターを示します。詳細については、「バケットの作成」をご参照ください。
パラメーター
説明
バケット名
OSS バケットのカスタム名を指定します。名前はすべての OSS バケットの中で一意である必要があります。バケットを作成した後は、名前を変更できません。コンソールに表示される形式の要件に従う必要があります。
リージョン
[特定のリージョン] を選択することをお勧めします。次に、ACS クラスタが存在するリージョンを選択して、ACS クラスタ内のポッドが内部ネットワーク経由でバケットにアクセスできるようにします。
(オプション) OSS バケットのサブディレクトリをマウントするには、まずバケットにサブディレクトリを作成します。
[バケット] ページで、作成した OSS バケットの名前をクリックします。
バケット詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[ディレクトリの作成] をクリックします。
OSS バケットのエンドポイントを取得します。
[バケット] ページで、使用するバケットを見つけて、その名前をクリックします。
バケット詳細ページで、[概要] タブをクリックします。[ポート] セクションで、次の説明に基づいてエンドポイントをコピーします。
バケットとクラスタが同じリージョンにデプロイされている場合は、内部エンドポイントをコピーします。
異なるリージョンにデプロイされている場合は、パブリックエンドポイントをコピーします。
OSS バケットにアクセスするために使用する AccessKey ペアを取得する。
説明別の Alibaba Cloud アカウントに属する OSS バケットをマウントするには、そのアカウントの AccessKey ペアが必要です。
静的にプロビジョニングされた OSS ボリュームをマウントする
手順 1:PV を作成する
oss-pv.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: Secret metadata: name: oss-secret namespace: default stringData: akId: <your AccessKey ID> akSecret: <your AccessKey Secret> --- apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv labels: alicloud-pvname: oss-pv spec: storageClassName: test capacity: storage: 20Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "<your OSS Bucket Name>" url: "<your OSS Bucket Endpoint>" otherOpts: "-o max_stat_cache_size=0 -o allow_other"説明上記のファイルは、シークレットと PV を作成するために使用されます。シークレットを使用して AccessKey ペアを保存すると、PV で AccessKey ペアを指定するための安全な方法が提供されます。
akIdの値を取得した AccessKey ID に、akSecretの値を取得した AccessKey シークレットに置き換えます。次の表に、PV のパラメーターを示します。
パラメーター
説明
alicloud-pvnamePV に追加するラベル。このラベルは、PVC を PV に選択してバインドするために使用されます。
storageClassNameこの構成は、PVC を PV にバインドするためにのみ使用されます。StorageClass を PV に関連付ける必要はありません。
storageOSS ボリュームの容量。
説明静的にプロビジョニングされた OSS ボリュームの容量は参考値です。実際の容量は無制限です。OSS ボリュームの使用可能な容量は、OSS コンソールで確認できます。
accessModesアクセスモード。
persistentVolumeReclaimPolicy再利用ポリシー。
driverボリュームのプロビジョニングに使用するボリュームドライバのタイプ。この例では、パラメーターは
ossplugin.csi.alibabacloud.comに設定されています。これは、Alibaba Cloud が OSS 用に提供する Container Storage Interface (CSI) プラグインが使用されていることを示します。volumeHandlePV の一意の識別子。値は
metadata.nameの値と同じである必要があります。nodePublishSecretRef権限付与のために AccessKey ペアが取得されるシークレット。
bucketOSS バケットの名前。
bucketの値を作成した OSS バケットの名前に置き換えます。urlOSS バケットのエンドポイント。
urlの値を作成した OSS バケットのエンドポイントに置き換えます。バケットとクラスタが同じリージョンにデプロイされている場合は、バケットの内部エンドポイントを指定します。例:
oss-cn-shanghai-internal.aliyuncs.com。バケットとクラスタが異なるリージョンにデプロイされている場合は、バケットのパブリックエンドポイントを指定します。例:
oss-cn-shanghai.aliyuncs.com。
otherOptsOSS バケットのマウントに必要なパラメーター。値は
-o *** -o ***形式である必要があります。例:-o max_stat_cache_size=0 -o allow_other。シークレットと PV を作成します。
kubectl create -f oss-pv.yamlPV を確認します。
kubectl get pv予期される出力:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE oss-pv 20Gi RWX Retain Available test <unset> 9s
手順 2:PVC を作成する
oss-pvc.yaml という名前のファイルを作成し、次の内容をコピーします。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc spec: storageClassName: test accessModes: - ReadWriteMany resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: oss-pv次の表に、上記のコードブロックのパラメーターを示します。
パラメーター
説明
storageClassNameこの構成は、PV を PVC にバインドするためにのみ使用されます。StorageClass を関連付ける必要はありません。値は、バインドする PV の
spec.storageClassNameパラメーターの値と同じである必要があります。accessModesアクセスモード。
storageポッドに割り当てられるストレージ容量。割り当てられた容量は、PVC にバインドされている OSS ボリュームの合計容量を超えることはできません。
alicloud-pvnamePV を PVC に選択してバインドするために使用されるラベル。値は、バインドする PV の
metadata.labels.alicloud-pvnameパラメーターと同じである必要があります。PVC を作成します。
kubectl create -f oss-pvc.yamlPVC を確認します。
kubectl get pvc次の出力は、手順 1 で作成した PV が PVC にバインドされていることを示しています。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE oss-pvc Bound oss-pv 20Gi RWX test <unset> 6s
手順 3:アプリケーションを作成し、OSS ボリュームをマウントする
oss-test.yaml という名前のファイルを作成し、次の内容をコピーします。
次の YAML テンプレートは、2 つのポッドを持つデプロイメントを定義します。2 つのポッドは、ストレージリソースを要求するために
/dataディレクトリにマウントされたoss-pvcという名前の永続ボリューム要求 (PVC) を共有します。apiVersion: apps/v1 kind: Deployment metadata: name: oss-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default alibabacloud.com/acs: "true" spec: containers: - name: nginx image: mirrors-ssl.aliyuncs.com/nginx:stable-alpine ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: /data volumes: - name: pvc-oss persistentVolumeClaim: claimName: oss-pvcデプロイメントを作成し、OSS ボリュームをデプロイメントにマウントします。
kubectl create -f oss-test.yamlデプロイメントによって作成されたポッドのステータスを確認します。
kubectl get pod | grep oss-test次の出力は、2 つのポッドが作成されたことを示しています。
oss-test-****-***a 1/1 Running 0 28s oss-test-****-***b 1/1 Running 0 28sマウントパス内のファイルを表示します。
次のコマンドを実行して、マウントパス内のファイルを表示します。OSS バケットのマウントディレクトリ内のデータが返されることが予期されます。デフォルトでは、データは返されません。
kubectl exec oss-test-****-***a -- ls /data
OSS ボリュームがデータを共有および永続化できるかどうかを確認する
作成したデプロイメントは 2 つのポッドをプロビジョニングします。同じ OSS バケットが両方のポッドにマウントされています。OSS ボリュームがデータを共有および永続化できるかどうかを確認する方法は次のとおりです。
方法 1:一方のポッドにファイルを作成し、もう一方のポッドからファイルにアクセスします。アクセスに成功した場合、データ共有は有効になっています。
方法 2:デプロイメントを再作成します。再作成されたポッドから OSS ボリュームにアクセスして、元のデータが OSS バケットにまだ存在するかどうかを確認します。存在する場合は、データの永続性が有効になっています。
次のコマンドを実行して、ポッド情報を表示します。
kubectl get pod | grep oss-test出力例:
oss-test-****-***a 1/1 Running 0 40s oss-test-****-***b 1/1 Running 0 40sデータ共有が有効になっているかどうかを確認します。
ポッドにファイルを作成します。
この例では、
oss-test-****-***aポッドが使用されます。kubectl exec oss-test-****-***a -- touch /data/test.txtもう一方のポッドから作成したファイルを表示します。
この例では、
oss-test-****-***bポッドが使用されます。kubectl exec oss-test-****-***b -- ls /data次の出力は、oss-test-****-***a ポッドで作成した
test.txtファイルに oss-test-****-***b ポッドからアクセスできることを示しています。test.txt
データの永続性が有効になっているかどうかを確認します。
デプロイメントを再作成します。
kubectl rollout restart deploy oss-testポッドが再作成されたら、新しいポッドを確認します。
kubectl get pod | grep oss-test出力例:
oss-test-****-***c 1/1 Running 0 67s oss-test-****-***d 1/1 Running 0 49s新しいポッドからファイルにアクセスして、データがファイルシステムにまだ存在するかどうかを確認します。
この例では、
oss-test-c***ポッドが使用されます。kubectl exec oss-test-****-***c -- ls /data次の出力は、データがまだ OSS バケットに存在し、再作成されたポッドのマウントディレクトリからアクセスできることを示しています。
test.txt