すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:静的にプロビジョニングされた OSS ボリュームをマウントする

最終更新日:Apr 16, 2025

アプリケーションでイメージ、オーディオファイル、ビデオファイルなどの非構造化データを保存する必要がある場合は、Object Storage Service (OSS) ボリュームを永続ボリューム (PV) としてアプリケーションにマウントします。このトピックでは、この方法と、OSS ボリュームを使用してデータを共有および永続化できるかどうかを確認する方法について説明します。

考慮事項

OSS は、Alibaba Cloud が提供する安全で費用対効果が高く、大容量で信頼性の高いクラウドストレージサービスです。これは、頻繁に変更されないデータや、イメージ、オーディオファイル、ビデオファイルなどの非構造化データに適しています。詳細については、「ストレージの概要」をご参照ください。

  • OSS は共有ストレージサービスです。 1 つの OSS バケットを複数のポッドにマウントできます。

  • マウントディレクトリには 1,000 ファイル以下を保存することをお勧めします。

    ossfs 1.0 を使用して ls などの操作を実行すると、ファイルメタデータを取得するために OSS に HTTP リクエストが送信されます。リストされたディレクトリに含まれるファイルが多すぎると、ossfs が過剰なシステムメモリを消費し、ポッドでメモリ不足 (OOM) エラーが発生する可能性があります。これを軽減するには、ディレクトリをパーティション化するか、OSS バケットのサブディレクトリをマウントします。

OSS バケットを作成し、バケット情報を取得する

  1. OSS バケットを作成します。

    1. OSS コンソール にログインします。左側のナビゲーションウィンドウで、[バケット] をクリックします。

    2. [バケットの作成] をクリックします。

    3. [バケットの作成] パネルで、パラメーターを構成し、[作成] をクリックします。

      次の表にパラメーターを示します。詳細については、「バケットの作成」をご参照ください。

      パラメーター

      説明

      バケット名

      OSS バケットのカスタム名を指定します。名前はすべての OSS バケットの中で一意である必要があります。バケットを作成した後は、名前を変更できません。コンソールに表示される形式の要件に従う必要があります。

      リージョン

      [特定のリージョン] を選択することをお勧めします。次に、ACS クラスタが存在するリージョンを選択して、ACS クラスタ内のポッドが内部ネットワーク経由でバケットにアクセスできるようにします。

  2. (オプション) OSS バケットのサブディレクトリをマウントするには、まずバケットにサブディレクトリを作成します。

    1. [バケット] ページで、作成した OSS バケットの名前をクリックします。

    2. バケット詳細ページの左側のナビゲーションウィンドウで、[オブジェクト管理] > [オブジェクト] を選択します。

    3. [ディレクトリの作成] をクリックします。

  3. OSS バケットのエンドポイントを取得します。

    1. [バケット] ページで、使用するバケットを見つけて、その名前をクリックします。

    2. バケット詳細ページで、[概要] タブをクリックします。[ポート] セクションで、次の説明に基づいてエンドポイントをコピーします。

      • バケットとクラスタが同じリージョンにデプロイされている場合は、内部エンドポイントをコピーします。

      • 異なるリージョンにデプロイされている場合は、パブリックエンドポイントをコピーします。

  4. OSS バケットにアクセスするために使用する AccessKey ペアを取得する

    説明

    別の Alibaba Cloud アカウントに属する OSS バケットをマウントするには、そのアカウントの AccessKey ペアが必要です。

静的にプロビジョニングされた OSS ボリュームをマウントする

手順 1:PV を作成する

  1. 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-pvname

    PV に追加するラベル。このラベルは、PVC を PV に選択してバインドするために使用されます。

    storageClassName

    この構成は、PVC を PV にバインドするためにのみ使用されます。StorageClass を PV に関連付ける必要はありません。

    storage

    OSS ボリュームの容量。

    説明

    静的にプロビジョニングされた OSS ボリュームの容量は参考値です。実際の容量は無制限です。OSS ボリュームの使用可能な容量は、OSS コンソールで確認できます。

    accessModes

    アクセスモード。

    persistentVolumeReclaimPolicy

    再利用ポリシー。

    driver

    ボリュームのプロビジョニングに使用するボリュームドライバのタイプ。この例では、パラメーターは ossplugin.csi.alibabacloud.com に設定されています。これは、Alibaba Cloud が OSS 用に提供する Container Storage Interface (CSI) プラグインが使用されていることを示します。

    volumeHandle

    PV の一意の識別子。値は metadata.name の値と同じである必要があります。

    nodePublishSecretRef

    権限付与のために AccessKey ペアが取得されるシークレット。

    bucket

    OSS バケットの名前。bucket の値を作成した OSS バケットの名前に置き換えます。

    url

    OSS バケットのエンドポイント。url の値を作成した OSS バケットのエンドポイントに置き換えます。

    • バケットとクラスタが同じリージョンにデプロイされている場合は、バケットの内部エンドポイントを指定します。例:oss-cn-shanghai-internal.aliyuncs.com

    • バケットとクラスタが異なるリージョンにデプロイされている場合は、バケットのパブリックエンドポイントを指定します。例:oss-cn-shanghai.aliyuncs.com

    otherOpts

    OSS バケットのマウントに必要なパラメーター。値は -o *** -o *** 形式である必要があります。例:-o max_stat_cache_size=0 -o allow_other

  2. シークレットと PV を作成します。

    kubectl create -f oss-pv.yaml
  3. PV を確認します。

    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 を作成する

  1. 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-pvname

    PV を PVC に選択してバインドするために使用されるラベル。値は、バインドする PV の metadata.labels.alicloud-pvname パラメーターと同じである必要があります。

  2. PVC を作成します。

    kubectl create -f oss-pvc.yaml
  3. PVC を確認します。

    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 ボリュームをマウントする

  1. 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
  2. デプロイメントを作成し、OSS ボリュームをデプロイメントにマウントします。

    kubectl create -f oss-test.yaml
  3. デプロイメントによって作成されたポッドのステータスを確認します。

    kubectl get pod | grep oss-test

    次の出力は、2 つのポッドが作成されたことを示しています。

    oss-test-****-***a   1/1     Running   0          28s
    oss-test-****-***b   1/1     Running   0          28s
  4. マウントパス内のファイルを表示します。

    次のコマンドを実行して、マウントパス内のファイルを表示します。OSS バケットのマウントディレクトリ内のデータが返されることが予期されます。デフォルトでは、データは返されません。

    kubectl exec oss-test-****-***a -- ls /data

OSS ボリュームがデータを共有および永続化できるかどうかを確認する

作成したデプロイメントは 2 つのポッドをプロビジョニングします。同じ OSS バケットが両方のポッドにマウントされています。OSS ボリュームがデータを共有および永続化できるかどうかを確認する方法は次のとおりです。

  • 方法 1:一方のポッドにファイルを作成し、もう一方のポッドからファイルにアクセスします。アクセスに成功した場合、データ共有は有効になっています。

  • 方法 2:デプロイメントを再作成します。再作成されたポッドから OSS ボリュームにアクセスして、元のデータが OSS バケットにまだ存在するかどうかを確認します。存在する場合は、データの永続性が有効になっています。

  1. 次のコマンドを実行して、ポッド情報を表示します。

    kubectl get pod | grep oss-test

    出力例:

    oss-test-****-***a   1/1     Running   0          40s
    oss-test-****-***b   1/1     Running   0          40s
  2. データ共有が有効になっているかどうかを確認します。

    1. ポッドにファイルを作成します。

      この例では、oss-test-****-***a ポッドが使用されます。

      kubectl exec oss-test-****-***a -- touch /data/test.txt
    2. もう一方のポッドから作成したファイルを表示します。

      この例では、oss-test-****-***b ポッドが使用されます。

      kubectl exec oss-test-****-***b -- ls /data

      次の出力は、oss-test-****-***a ポッドで作成した test.txt ファイルに oss-test-****-***b ポッドからアクセスできることを示しています。

      test.txt
  3. データの永続性が有効になっているかどうかを確認します。

    1. デプロイメントを再作成します。

      kubectl rollout restart deploy oss-test
    2. ポッドが再作成されたら、新しいポッドを確認します。

      kubectl get pod | grep oss-test

      出力例:

      oss-test-****-***c   1/1     Running   0          67s
      oss-test-****-***d   1/1     Running   0          49s
    3. 新しいポッドからファイルにアクセスして、データがファイルシステムにまだ存在するかどうかを確認します。

      この例では、oss-test-c*** ポッドが使用されます。

      kubectl exec oss-test-****-***c -- ls /data

      次の出力は、データがまだ OSS バケットに存在し、再作成されたポッドのマウントディレクトリからアクセスできることを示しています。

      test.txt