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

Container Service for Kubernetes:PVを動的に予約してディスクをマウントする

最終更新日:Oct 23, 2024

静的プロビジョニングに加えて、動的プロビジョニングを使用して、永続ボリュームクレーム (PVC) とStorageClassesに基づいて永続ボリューム (PV) を自動的に予約するようにシステムを構成できます。 動的プロビジョニングにより、アプリケーションの自動およびオンデマンドのボリューム作成が可能になります。 これにより、Container Service for Kubernetes (ACK) クラスターのストレージインフラストラクチャ構成の複雑さが軽減されます。

制限事項

  • ディスクが存在するゾーン以外のゾーンにデプロイされたポッドにはディスクをマウントできません。

  • マルチアタッチ機能が無効になっているディスクは、1つのポッドにのみマウントできます。

  • ポッドを起動する前に、ディスクのタイプがクラスターで使用されているElastic Compute Service (ECS) インスタンスタイプと一致している必要があります。 ディスクタイプとECSインスタンスタイプのマッチングルールの詳細については、「インスタンスファミリー」をご参照ください。

    重要

    クラスター内のECSインスタンスの課金方法を従量課金からサブスクリプションに変更した場合、ディスクの課金方法をサブスクリプションに変更することはできません。 それ以外の場合、ディスクはクラスターにマウントされません。 ストレージ容量ユニット (SCU) を購入して、ストレージコストを削減できます。 SCUの詳細については、「SCUの概要」をご参照ください。

前提条件

重要
  • Linuxカーネルバージョンが4.9より前のCentOS 7.9イメージまたはその他のOSイメージを使用するノードがクラスターに含まれており、xfsファイルシステムを使用してデータを永続化する場合 (fstypeパラメーターxfsに設定されている場合) 、CSIプラグインを1.24.7以降に更新しないでください。 4.9より前のLinuxカーネルバージョンは、CSI 1.24.7以降と互換性がありません。 この場合、CSIプラグインを1.24.7以降にアップデートすると、xfsファイルシステムがマウントされているポッドが起動しないことがあります。 他のファイルシステムは影響を受けません。 この問題を解決するには、チケットを起票します。

  • CSIプラグインを1.26.4に更新する場合、csi-pluginとcsi-provisionerの両方を更新する必要があります。

使用上の注意

  • アプリケーションをデプロイすると、システムは自動的にディスクを購入し、指定されたStorageClassに基づいてPVをプロビジョニングします。 すでにディスクがある場合は、静的ディスクボリュームの使用を推奨します。

  • ディスクを購入する際、指定したディスクサイズは、個々のディスクに対応する容量範囲を超えることはできません。 詳細については、「ボリュームとしての Alibaba Cloud ディスクの使用」をご参照ください。

  • システムがポッドを再作成すると、ポッドにマウントされた元のディスクが再マウントされます。 再作成中にシステムがポッドを元のゾーンにスケジュールできなかった場合、ポッドは保留状態のままになります。

  • 動的プロビジョニングは、従量課金ディスクのみをサポートします。 ディスクの課金可能な項目の詳細については、「ブロックストレージデバイスの課金」をご参照ください。 ディスクの料金の詳細については、Elastic Compute Service製品ページをご覧ください。

ACKコンソールまたはkubectlを使用して、StorageClass、PVC、およびアプリケーションを作成できます。

ACKコンソールで動的にプロビジョニングされたディスクボリュームを使用する

ステップ1: StorageClassの作成

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

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ボリューム] > [StorageClasses] を選択します。

  3. StorageClassesページの右上隅にある [作成] をクリックします。

  4. [作成] ダイアログボックスで、StorageClassのパラメーターを設定します。

    次の表に、主要なパラメーターを示します。

    パラメーター

    説明

    名前

    StorageClassの名前。

    PVタイプ

    [クラウドディスク] または [NAS] を選択できます。 この例では、[クラウドディスク] が選択されています。

    パラメーター

    ディスクの種類 デフォルトでは、typeパラメーターが追加され、cloud_essdに設定されます。 typeパラメータの有効値:

    • cloud_efficiency: ウルトラディスク。

    • cloud_auto: ESSD AutoPLディスク。

    • cloud_ssd: 標準SSD。

    • cloud_essd: ESSD。

    • cloud_essd_entry: ESSDエントリディスク。

    1つ以上の値を指定できます。 たとえば、このパラメーターをtype: cloud_efficiency, cloud_ssd, cloud_essdに設定できます。 指定されたタイプのディスクを順番に作成しようとします。 ディスクが作成されると、システムは試行を停止します。

    説明

    ECSインスタンスでサポートされるディスクタイプは、インスタンスタイプによって異なります。 詳細については、「EBSに関するFAQ」をご参照ください。

    [追加] をクリックして、カスタムパラメーターを追加できます。 次のカスタムパラメータがサポートされています。

    • resourceGroupId: ディスクが属するリソースグループ。 このパラメーターはオプションです。 デフォルト値: ""

    • regionId: ディスクが作成されたリージョンのID。 値は、クラスターのリージョンIDに設定する必要があります。 このパラメーターはオプションです。

    • zoneId: ディスクが作成されたゾーンのID。 このパラメーターはオプションです。

      • クラスターが単一のゾーンにデプロイされている場合は、値をゾーンのIDに設定します。

      • クラスターが複数のゾーンにデプロイされている場合は、ビジネス要件に基づいてzoneIdを複数のゾーンIDに設定できます。 例: cn-beijing-a, cn-beijing-b

    • fstype: ディスクのファイルシステム。 このパラメーターはオプションです。 有効な値: ext4およびxfs デフォルト値: ext4

    • mkfsOptions: ディスクのフォーマットに指定されたパラメーター。 このパラメーターはオプションです。 例: mkfsOptions: "-O project,quota"

    • diskTags: ディスクのカスタムタグ。 このパラメーターはオプションです。 例: diskTags: "a:b,b:c" diskTags/a: bの形式を使用することもできます (v1.30.3から開始) 。

    • encrypted: ディスクを暗号化するかどうかを指定します。 このパラメーターはオプションです。 デフォルト値はfalseです。これは、ディスクが暗号化されていないことを示します。

    • performanceLevel: ESSDのパフォーマンスレベル (PL) 。 有効な値: PL0PL1PL2PL3 このパラメーターはオプションです。 デフォルト値: PL1 詳細については、「容量とPL」をご参照ください。

    • volumeExpandAutoSnapshot: ディスクのサイズを変更する前に、ディスクに保存されているデータをバックアップするスナップショットを作成するかどうかを指定します。 このパラメーターはオプションです。 デフォルト値: closed。 有効な値:

      • forced: システムがスナップショットの作成に失敗した場合、ディスクのサイズ変更タスクをキャンセルします。

      • besteffort: システムがスナップショットの作成に失敗した場合、警告イベントを生成し、ディスクのサイズを変更します。

      • closed: 自動スナップショット機能を無効にします。

      データセキュリティの要件が高い場合は、システムがディスクのサイズ変更に失敗したときに発生する可能性のあるデータ損失を防ぐために、パラメーターを強制に設定することをお勧めします。

      説明

      このパラメーターは、ESSDのサイズ変更にのみ適用されます。 自動スナップショットは、システムがディスクのサイズを変更すると自動的に削除され、システムがディスクのサイズ変更に失敗した場合は24時間保持されます。

    • provisionedIops: ディスクのプロビジョニングされたパフォーマンス (ディスク入出力操作 /秒 (IOPS) など) 。 このパラメーターはオプションです。

      有効値: 0〜min{50,000, 1,000 × 容量ベースラインIOPS} 。

      ベースラインIOPS = min{1,800 + 50 × 容量、50,000} 。

      説明

      このパラメーターは、ESSD AutoPLディスクでのみサポートされます。 詳細については、「ESSD AutoPLディスクの仕様」をご参照ください。

    burstingEnabled: ディスクのパフォーマンスバーストを有効にするかどうかを指定します。 このパラメーターはオプションです。 デフォルト値:false 有効な値:

    • true: ディスクのパフォーマンスバーストを有効にします。

    • false: ディスクのパフォーマンスバーストを無効にします。

      説明

      このパラメーターは、ESSD AutoPLディスクでのみサポートされます。 詳細については、「ESSD AutoPLディスクの仕様」をご参照ください。

    • multiAttach: このパラメータはオプションです。 マルチアタッチを有効にするには、trueに設定します。 詳細については、「クラウドディスクのマルチアタッチ」をご参照ください。

    再利用ポリシー

    ディスクの再利用ポリシー。 デフォルト値: Delete。 有効な値:

    • 削除: PVCが削除されると、関連するPVとディスクも削除されます。

    • 保持: PVCが削除されると、関連するPVとディスクは保持されます。 PVとディスクデータは手動でのみ削除できます。

    データセキュリティの要件が高い場合は、ユーザーエラーによるデータ損失を防ぐために、保持ポリシーを使用することを推奨します。

    バインディングモード

    ディスクのバインドモード。 デフォルト値: Immediate。 有効な値:

    • Immediate: StorageClassを使用するPVCが作成されると、ディスクが作成されます。 このようにして、ディスクを使用するポッドを作成する前に、ディスクが作成され、PVがプロビジョニングされます。

    • WaitForFirstConsumer: PVCを使用するポッドが作成されるまで、PVのバインドとプロビジョニングを遅延させます。 ポッドがノードにスケジュールされると、ノードがデプロイされ、PVとしてプロビジョニングされるゾーンにディスクが作成されます。

  5. 設定が完了したら、[作成] をクリックします。

    StorageClassが作成されると、StorageClassesリストに表示されます。

手順 2: PVC の作成

  1. 詳細ページの左側のナビゲーションウィンドウで、[ボリューム] > [ボリュームクレームの永続性] を選択します。

  2. [ボリュームクレームの永続化] ページの右上隅にある [作成] をクリックします。

  3. [PVCの作成] ダイアログボックスで、PVCのパラメーターを設定します。

    パラメーター

    説明

    PVCタイプ

    クラウドディスク、NAS、またはOSSを選択できます。 この例では、クラウドディスクが選択されています。

    名前

    PVCの名前。 名前は名前空間内で一意である必要があります。

    割り当てモード

    この例では、[StorageClassを使用] が選択されています。これは、StorageClassを使用してPVを動的にプロビジョニングすることを示します。

    既存のストレージクラス

    PVを動的にプロビジョニングするには、既存のStorageClassを選択します。

    容量

    PVCが主張する容量。

    アクセスモード

    ReadWriteOnceのみを使用できます。 詳細については、「kubectlを使用して動的にプロビジョニングされたディスクボリュームを使用する」をご参照ください。

  4. [作成] をクリックします。

    PVCが作成されると、PVCがPVCリストに表示されます。 PVCはPVに結合される。

ステップ3: アプリケーションのデプロイ

  1. 詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [StatefulSets] を選択します。

  2. StatefulSetsページの右上隅にある [画像から作成] をクリックします。

  3. アプリケーションパラメーターを設定します。

    この例では、ボリュームパラメーターの設定方法を示します。 その他のパラメーターの詳細については、「イメージを使用した StatefulSet アプリケーションの作成」をご参照ください。

  4. ACKクラスター用にローカルストレージボリュームとクラウドストレージボリュームを設定できます。 この例では、[クラウドストレージ] が選択されています。 作成したディスクボリュームをコンテナーの /tmpパスにマウントします。 ディスクボリュームがマウントされた後、/tmpパスに生成されたコンテナデータがディスクボリュームに格納されます。数据卷

  5. その他のパラメーターを設定し、[作成] をクリックします。

    アプリケーションの作成後、ボリュームを使用してアプリケーションデータを保存できます。

kubectlを使用して動的にプロビジョニングされたディスクボリュームを使用する

ステップ1: StorageClassの作成

マルチゾーンクラスターの場合、実際のシナリオに基づいて次の方法を選択してStorageClassesを作成できます。

遅延PVC-PVバインディング

遅延PVC-PVバインドモードは、既存のディスクが使用するECSインスタンスのゾーンに属していない場合に適用されます。 次の例では、storage-class-csi-wffc.yamlという名前のファイルを使用してStorageClassを作成します。

  1. storage-class-wffc.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-wait-for-first-consumer
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_auto,cloud_essd,cloud_ssd # The system attempts to create a disk of the specified types in sequence. The actual types of disks that are created depend on the instance types of the ECS instances to which the disks are mounted and the disk types supported by the zones where the ECS instances are deployed. 
      fstype: ext4
      diskTags: "a:b,b:c"
      encrypted: "false"
      performanceLevel: PL1
      volumeExpandAutoSnapshot: "forced" # This parameter takes effect only when the type parameter is set to cloud_essd. 
      provisionedIops: "40000"
      burstingEnabled: "false"
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Retain
    allowVolumeExpansion: true

    パラメーター

    説明

    メタデータ

    name

    StorageClassの名前。 名前は小文字で始まる必要があり、小文字、数字、ピリオド (.) 、およびハイフン (-) のみを使用できます。

    provisioner

    このパラメーターをdiskplugin.csi.alibabacloud.comに設定します。 これは、Alibaba Cloudディスクのプロビジョニングプラグインを使用してStorageClassを作成することを示します。

    パラメーター

    詳細については、「パラメーター」をご参照ください。

    volumeBindingMode

    ディスクのバインドモード。 デフォルト値: Immediate。 値をWaitForFirstConsumerに設定することもできます。

    • Immediate: StorageClassを使用するPVCが作成されると、ディスクが作成されます。 このようにして、ディスクを使用するポッドを作成する前に、ディスクが作成され、PVがプロビジョニングされます。

    • WaitForFirstConsumer: PVCを使用するポッドが作成されるまで、PVのバインドとプロビジョニングを遅延させます。 ポッドがノードにスケジュールされると、ノードがデプロイされ、PVとしてプロビジョニングされるゾーンにディスクが作成されます。

    reclaimPolicy

    ディスクの再利用ポリシー。 デフォルト値: Delete。 値を [保持] に設定することもできます。

    • 削除: PVCが削除されると、関連するPVとディスクも削除されます。

    • 保持: PVCが削除されると、関連するPVとディスクは保持されます。 PVとディスクデータは手動でのみ削除できます。

    データセキュリティの要件が高い場合は、ユーザーエラーによるデータ損失を防ぐために、保持ポリシーを使用することを推奨します。

    allowVolumeExpansion

    このパラメーターをtrueに設定すると、ディスクのサイズを自動的に変更できます。

  2. 次のコマンドを実行してStorageClassを作成します。

    kubectl apply -f storage-class-wffc.yaml
  3. 作成したStorageClassを表示します。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ボリューム] > [StorageClasses] を選択します。

ポッドを作成する前にディスクを作成する

  1. storage-class-immediate.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    メタデータ:
      名前: alicloud-disk-immediate
    provisioner: diskplugin.csi.alibabacloud.com
    パラメータ:
      type: cloud_essd,cloud_ssd,cloud_efficiency# システムは、指定されたタイプのディスクを順番に作成しようとします。 作成されるディスクの実際のタイプは、ディスクがマウントされているECSインスタンスのインスタンスタイプと、ECSインスタンスがデプロイされているゾーンでサポートされているディスクタイプによって異なります。
      regionId: cn-beijing
      zoneId: cn-beijing-b
      encrypted: "false"
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    volumeBindingMode: 即時 

    パラメーター

    説明

    メタデータ

    name

    StorageClassの名前。 名前は小文字で始まる必要があり、小文字、数字、ピリオド (.) 、およびハイフン (-) のみを使用できます。

    provisioner

    このパラメーターをdiskplugin.csi.alibabacloud.comに設定します。 これは、Alibaba Cloudディスクのプロビジョニングプラグインを使用してStorageClassを作成することを示します。

    パラメーター

    詳細については、「パラメーター」をご参照ください。

    reclaimPolicy

    ディスクの再利用ポリシー。 デフォルト値: Delete。 値を [保持] に設定することもできます。

    • 削除: PVCが削除されると、関連するPVとディスクも削除されます。

    • 保持: PVCが削除されると、関連するPVとディスクは保持されます。 PVとディスクデータは手動でのみ削除できます。

    データセキュリティの要件が高い場合は、[保持] ポリシーを使用して、ユーザーエラーによるデータ損失を防ぐことを推奨します。

    allowVolumeExpansion

    このパラメーターをtrueに設定すると、ディスクのサイズを自動的に変更できます。

    volumeBindingMode

    ディスクのバインドモード。 デフォルト値: Immediate。 値をWaitForFirstConsumerに設定することもできます。

    • Immediate: StorageClassを使用するPVCが作成されると、ディスクが作成されます。 このようにして、ディスクを使用するポッドを作成する前に、ディスクが作成され、PVがプロビジョニングされます。

    • WaitForFirstConsumer: PVCを使用するポッドが作成されるまで、PVのバインドとプロビジョニングを遅延させます。 ポッドがノードにスケジュールされると、ノードがデプロイされ、PVとしてプロビジョニングされるゾーンにディスクが作成されます。

  2. 次のコマンドを実行してStorageClassを作成します。

    kubectl apply -f storage-class-immediate.yaml
  3. 作成したStorageClassを表示します。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ボリューム] > [StorageClasses] を選択します。

手順 2: PVC の作成

  1. pvc-disk.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-wait-for-first-consumer 

    パラメーター

    説明

    name

    PVCの名前。

    accessModes

    PVCのアクセスモード。

    volumeMode

    ディスクのボリュームモード。 有効な値: [ファイルシステム] および [ブロック] このパラメーターはオプションです。 デフォルト値: Filesystem。

    storageClassName

    PVCに関連付けるStorageClassの名前。

    ストレージ

    PVCが主張するディスクサイズ。 最小容量は20 GiBです。

    使用可能なアクセスモードは、StorageClassのmultiAttachパラメーターとPVCのvolumeModeパラメーターによって異なります。 次の表では、仕様について説明します。

    パラメーター設定

    アクセスモード

    multiAttach

    volumeMode

    ReadWriteOnce

    ReadOnlyMany

    ReadWriteMany

    image.png

    Any

    image.png

    image.png

    image.png

    image.png

    ファイルシステム

    image.png

    image.png

    image.png

    image.png

    ブロック

    image.png

    image.png

    image.png

  2. 次のコマンドを実行してPVCを作成します。

    kubectl create -f pvc-disk.yaml
  3. 作成したPVCを表示します。

    ACKコンソールのクラスター詳細ページの左側のナビゲーションウィンドウで、[ボリューム] > [ボリュームクレームの永続化] を選択します。 作成したPVCは、[ボリュームクレームの永続化] ページで確認できます。

ステップ3: アプリケーションの作成

  1. 次のコマンドを実行して、MySQLアプリケーションのルートパスワードを設定するためのシークレットを作成します。 運用環境で作業している場合は、必ずパスワードを変更してください。

    kubectl create secret generic mysql-pass --from-literal=password=mypassword
  2. mysql.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: pvc-disk
              mountPath: /var/lib/mysql
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc

    パラメーター

    説明

    mountPath

    ディスクがマウントされるパス。

    claimName

    アプリケーションにマウントされているPVCの名前。

  3. 次のコマンドを実行してアプリケーションを作成し、PVCをアプリケーションにマウントします。

    kubectl create -f mysql.yaml
  4. アプリケーションを表示します。

    ACKコンソールのクラスター詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [StatefulSets] を選択します。 作成したアプリケーションは、StatefulSetsページで表示できます。

動的にプロビジョニングされたディスクボリュームを使用してデータを永続化できるかどうかのテスト

ポッドが削除されて再作成された後も、ポッドは削除される前に書き込まれたデータを保存します。 次の手順を実行して、データがディスクに永続化されているかどうかをテストします。

  1. 次のコマンドを実行して、新しいディスクが /var/lib /MySQLパスにマウントされているかどうかを確認して、ディスクがmysqlアプリケーションにマウントされていることを確認します。

    kubectl exec mysql-0 -- df -h /var/lib/mysql

    期待される出力:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdd         25G  213M   25G   1% /var/lib/mysql
  2. ディスクにファイルを作成します。

    1. 次のコマンドを実行して、/var/lib/mysqlパスにtest-persistentという名前のファイルを作成します。

      kubectl exec mysql-0 -- touch /var/lib/mysql/test-persistent
    2. 次のコマンドを実行して、ファイルが作成されていることを確認します。

      kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent

      期待される出力:

      /var/lib/mysql/test-persistent
  3. 次のコマンドを実行して、mysql-0という名前のポッドを削除します。

    kubectl delete pod mysql-0

    期待される出力:

    pod "mysql-0" deleted
  4. ポッドの削除後もファイルがまだ存在するかどうかをテストします。

    1. 次のコマンドを実行して、ポッドが期待どおりに実行されるかどうかを確認します。

      kubectl get pod mysql-0

      期待される出力:

      NAME      READY   STATUS    RESTARTS   AGE
      mysql-0   1/1     Running   0          12s
    2. 次のコマンドを実行して、作成されたファイルを照会します。

      kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent

      期待される出力:

      /var/lib/mysql/test-persistent

      test-persistentファイルはまだ存在します。 これは、データが動的にプロビジョニングされたディスクに保持されることを示します。

関連ドキュメント