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

Container Service for Kubernetes:ストレージの基本

最終更新日:Mar 04, 2025

このトピックでは、Kubernetes コンテナーストレージに関連する基本的な概念について説明します。このトピックを読むことで、Container Service for Kubernetes (ACK) が提供するストレージ機能について包括的に理解できます。

ボリューム

コンテナー内のファイルは、ディスクに一時的に保存されます。コンテナーを再構築すると、コンテナー内のファイルが失われます。この問題に対処するために、Kubernetes はボリュームリソースを定義して、コンテナーの再起動によるファイルの損失を防ぎます。ボリュームは、ポッドと外部ストレージデバイス間のデータ転送チャネルです。ボリュームを使用すると、ポッド内のコンテナー間、ポッド間、およびポッドと外部環境間でデータを共有できます。

ボリュームは外部ストレージの詳細を定義し、ポッドに埋め込まれます。ボリュームは、本質的に Kubernetes システム内の外部ストレージへのリソースマッピングです。ワークロードが外部ストレージを必要とする場合、システムはボリューム内の関連情報をクエリし、外部ストレージをマウントします。

説明

ボリュームのライフサイクルは、そのボリュームを使用するポッドと同じです。ボリュームを使用するポッドが削除されたときにボリュームを削除するようにシステムを構成できます。ただし、ボリューム内のデータが保持されるかどうかは、ボリュームタイプとボリューム構成によって異なります。

ACK は、以下の一般的に使用されるボリュームタイプを提供します。

タイプ

説明

ローカルストレージ

hostPath ボリュームや emptyDir ボリュームなど、ローカルストレージをボリュームとしてマウントできます。これらのボリュームは、クラスターの特定のノードにデータを保存し、アプリケーションと共に移動しません。保存されたデータは、ノードがダウンすると使用できなくなります。

ネットワークストレージ

Ceph、GlusterFS、NFS、iSCSI ボリュームなど、ネットワークストレージをボリュームとしてマウントできます。これらのボリュームは、リモートストレージサービスを使用してデータを保存します。これらのボリュームを使用する場合は、ストレージサービスをローカルにマウントする必要があります。

Secret と ConfigMap

Secret と ConfigMap は、クラスターに関するオブジェクト情報を保存する特別なボリュームです。オブジェクトデータは、アプリケーションで使用するためにボリュームとしてノードにマウントされます。

PVC

PVC は、ボリュームを定義するためのメカニズムを提供します。 PVC は、ボリュームをポッドに依存しないオブジェクトに抽象化します。このオブジェクトに定義または関連付けられているストレージ情報はボリュームに保存され、Kubernetes ワークロードで使用するためにマウントされます。

ボリュームの使用手順

  • 1 つのポッドに複数のボリュームをマウントできます。ただし、過剰なボリュームをポッドにマウントすることはお勧めしません。

  • 1 つのポッドに複数のタイプのボリュームをマウントできます。

  • ポッドにマウントされたボリュームは、ポッド内のコンテナー間で共有できます。

  • データを永続化する場合は、PVC と PV を使用することをお勧めします。

PV と PVC

すべての Kubernetes ボリュームが永続的であるとは限りません。コンテナーストレージでは、データの永続性を有効にするためにリモートストレージサービスが必要です。これを実現するために、Kubernetes は PV と PVC という 2 つのリソースオブジェクトを導入しています。これらは、ストレージの実装方法の詳細を、使用方法から抽象化します。これにより、ユーザーはインフラストラクチャのオーケストレーションを気にする必要がなくなります。ストレージリソースを使用する必要がある場合は、ストレージ要件を要求するだけで済みます。

PV

PV は特定のタイプのボリュームを表し、ボリュームタイプ、ボリュームパラメーター、マウントされたストレージリソースに関する情報など、ボリュームの詳細を定義するために使用されます。 Kubernetes は、マウントのために PV のストレージ情報を使用します。 PV は、静的または動的にプロビジョニングできます。静的プロビジョニングを使用する場合は、PV を直接作成できます。動的プロビジョニングを使用する場合は、StorageClass を作成する必要があります。 csi-provisioner は、StorageClass に基づいて PV を自動的に作成し、PV をポッドにマウントします。

説明

PV は、ノードレベルではなくクラスターレベルで使用されます。 PV には独自のライフサイクルがあり、ポッドのライフサイクルとは無関係です。

apiVersion: v1
kind: PersistentVolume
metadata:
  namespace: default
  name: pv-example
spec:
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: diskplugin.csi.alibabacloud.com
    volumeHandle: <ディスク ID>
  volumeMode: Filesystem

PVC

PVC は永続ストレージの要求を表し、ボリューム容量や読み取り/書き込み権限など、ポッドの永続ストレージ要求の詳細を定義するために使用されます。 PVC は PV を消費します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  volumeName: pv-example

PV と PVC の使用手順

PVC と PV には 1 対 1 の関係があります。 1 つの PV を複数の PVC にバインドすることはできず、1 つの PVC を複数の PV にバインドすることはできません。アプリケーションのストレージを構成するには、PVC を宣言する必要があります。 Kubernetes は、PVC に最適な PV を選択し、それらをバインドします。 PVC は、ポッドで使用される前に PV にバインドされている必要があります。次のリストは、PV が PVC にバインドされる前に満たす必要がある要件を示しています。

  • VolumeMode: 消費される PV は、PVC と同じボリュームモードである必要があります。

  • AccessMode: 消費される PV オブジェクトは、PVC オブジェクトと同じアクセスモードである必要があります。

  • StorageClassName: このパラメーターが PVC オブジェクトに定義されている場合、対応するパラメーターが定義されている PV オブジェクトのみがこの PVC オブジェクトにバインドできます。

  • LabelSelector: ラベルマッチングに基づいて、PV リストから適切な PV オブジェクトが選択されます。

  • storage: 消費される PV は、PVC のストレージ容量以上のストレージ容量を持っている必要があります。

PV と PVC の storage フィールドの役割:

  • システムは、storage フィールドの値に基づいて、PV オブジェクトを PVC オブジェクトにバインドできるかどうかを判断します。

  • PVC と StorageClass に基づいて動的 PV プロビジョニングを使用する場合、PVC の storage フィールドは、PV と対応するバックエンドストレージ (ディスクなど) の容量を決定します。

  • サイズ変更操作をサポートするストレージタイプの場合、PVC オブジェクトの storage は、スケールアウト後の PV オブジェクトとバックエンドストレージの容量として使用されます。

データが PV に書き込まれるとき、PVC オブジェクトと PV オブジェクトの storage フィールドは考慮されません。代わりに、書き込み操作は基盤となる記憶媒体の実際の容量に依存します。

ボリュームアクセスモード

accessModes フィールドを使用して、ボリュームのアクセスモードを指定できます。

ReadWriteOnce (RWO)

ボリュームは、読み取り/書き込みモードでノードにマウントできます。たとえば、Alibaba Cloud ディスクをマウントするときにこの値を指定できます。

ReadOnlyMany (ROX)

ボリュームは、読み取り専用モードで複数のノードにマウントできます。たとえば、Object Storage Service (OSS) バケットをマウントするときにこの値を指定できます。

ReadWriteMany (RWX)

ボリュームは、読み取り/書き込みモードで複数のノードにマウントできます。たとえば、NAS ファイルシステム (NAS) をマウントするときにこの値を指定できます。

ポッドにボリュームをマウントする方法

静的にプロビジョニングされたボリューム

静的にプロビジョニングされたボリュームは、クラスター管理者によって作成されます。 Alibaba Cloud ディスク、NAS ファイルシステム、OSS バケットを静的にプロビジョニングされたボリュームとしてマウントできます。

  1. クラスター管理者は、クラスター内のポッドのストレージ要件を分析することにより、ディスクや NAS ファイルシステムなどの記憶媒体を事前に割り当てます。

  2. 管理者は、実際のストレージ状況に基づいて事前に複数の PV を手動で作成し、各 PV が提供できる特定のストレージ容量を定義します。 PV は PVC によって消費されます。

  3. ユーザーは PVC を作成して、ビジネスポッドのストレージ要件を宣言します。

  4. ワークロードが PVC 要件を定義している場合、Kubernetes はポッドの作成中に要件に一致する PV に PVC をバインドします。これにより、ワークロードによって作成されたポッドは、マウントされたストレージリソースにアクセスできます。

動的にプロビジョニングされたボリューム

動的にプロビジョニングされたボリュームは、ボリュームドライバーのプロビジョナーによって作成されます。 Alibaba Cloud ディスク、NAS ファイルシステム、OSS バケットを動的にプロビジョニングされたボリュームとしてマウントできます。

  1. クラスター管理者は、バックエンドストレージプールを構成し、さまざまなボリュームドライバープロビジョナーを選択して、さまざまなタイプのボリュームを作成します。たとえば、diskplugin.csi.alibabacloud.com は Alibaba Cloud ディスクのプロビジョナーを表します。

  2. クラスター管理者は、PV を手動で割り当てる必要はありません。代わりに、管理者は StorageClass を作成し、PVC が StorageClass を消費するのを待つだけです。

  3. ユーザーは PVC を作成して、ビジネスポッドのストレージ要件を宣言します。ユーザーは PVC で StorageClass を指定する必要があります。

  4. ワークロードが PVC 要件を定義している場合、ボリュームドライバープロビジョナーは、PVC に関連付けられた StorageClass の構成に基づいて PV を動的に作成します。これにより、ワークロードによって作成されたポッドは、マウントされたストレージリソースにアクセスできます。

動的プロビジョニングの利点:

  • 動的にプロビジョニングされたボリュームにより、Kubernetes は PV のライフサイクル管理を自動化できます。作成と削除はプロビジョナーによって処理されます。

  • PV は自動的に作成されるため、ボリューム構成の複雑さとクラスター管理者の作業負荷が軽減されます。

  • 動的にプロビジョニングされたボリュームは、PVC とプロビジョナーによって作成された PV 間の容量の整合性を確保し、最適なストレージ容量計画を可能にします。

StorageClass

StorageClass はストレージのクラスを定義し、動的プロビジョニングを可能にします。 StorageClass でさまざまなパラメーターを指定して、パラメーターに基づいてストレージリソースの供給と調整を自動化できます。 PVC で StorageClassName フィールドを指定すると、システムは StorageClassName フィールドで指定されたプロビジョナーをトリガーして、StorageClass に基づいて動的にプロビジョニングされた PV と基盤となるストレージリソースを自動的に作成します。これにより、PV の作成とメンテナンスの作業負荷が軽減されます。次の例は、Alibaba Cloud ディスクの StorageClass を作成する方法を示しています。 Alibaba Cloud ディスク、NAS ファイルシステム、OSS バケットのカスタム StorageClass の詳細については、「動的にプロビジョニングされたディスクボリュームを使用する」、「動的にプロビジョニングされた NAS ボリュームを使用する」、および「動的にプロビジョニングされた OSS ボリュームを使用する」をご参照ください。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-disk-topology-alltype
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_auto,cloud_essd,cloud_ssd,cloud_efficiency
  fstype: ext4
  diskTags/a: b
  encrypted: "false"
  performanceLevel: PL1
  provisionedIops: "40000"
  burstingEnabled: "false"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer  

主なパラメーター

パラメーター

説明

provisioner

ストレージリソースプロバイダー。有効な値:

  • diskplugin.csi.alibabacloud.com: Alibaba Cloud ディスクのプロビジョナーを使用して StorageClass を作成します。

  • nasplugin.csi.alibabacloud.com: NAS ファイルシステムのプロビジョナーを使用して StorageClass を作成します。

  • ossplugin.csi.alibabacloud.com: OSS バケットのプロビジョナーを使用して StorageClass を作成します。

parameters

クラウドディスクのパラメーター。

reclaimPolicy

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

  • Delete: PVC が削除されると、PV とクラウドディスクも削除されます。

  • Retain: PVC が削除されると、PV とクラウドディスクも削除されます。 PV とクラウドディスクを手動で削除する必要があります。

高いデータセキュリティが必要な場合は、誤って削除されないように値を Retain に設定することをお勧めします。

allowVolumeExpansion

ディスクボリュームの自動拡張を有効にするには、値を true に設定します。

volumeBindingMode

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

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

  • WaitForFirstConsumer: 遅延バインディング。スケジューラは最初にポッドをスケジュールし、ポッドの利用可能なゾーン情報に従ってディスクを作成します。マルチゾーンクラスターでの使用をお勧めします。

展開して、遅延バインディング WaitForFirstConsumer の説明を表示します

ストレージリソース (Alibaba Cloud ディスクなど) はゾーン間のマウントをサポートしていないため、使用時に次の問題が発生する可能性があります。

  • ゾーン A のストレージボリュームが作成されますが、ゾーン A のノードリソースが使い果たされているため、ポッドが起動に失敗し、マウントできません。

  • クラスター管理者は、PVC と PV を計画するときに、バックアップとして複数の PV を作成するゾーンを決定できません。

volumeBindingMode パラメーターは、この問題を解決するために使用されます。 volumeBindingModeWaitForFirstConsumer として構成されている場合、ストレージプラグインプロビジョナーが PVC Pending を受信したときに、すぐに PV ストレージボリュームを作成するのではなく、PVC がポッドによって消費されるまで作成プロセスを実行するのを待ちます。

実装の原則

ストレージプラグインプロビジョナーが PVC Pending ステータスを受信すると、すぐにストレージボリュームを作成するのではなく、PVC がポッドによって消費されるまで待ちます。ポッドがこの PVC を消費する場合、スケジューラは PVC が遅延バインディングモードに属することを認識した後もスケジューリング操作を実行し続け、patch コマンドを介してスケジューリング結果を PVC の metadata に書き込みます。プロビジョナーは、PVC に書き込まれたスケジューリング情報を検出した後、スケジューリング情報に従ってターゲットストレージボリュームを作成するための場所情報 (リージョンとノード情報) を取得し、PV 作成プロセスをトリガーします。

デフォルトの StorageClass

Kubernetes はデフォルトの StorageClass メカニズムを提供します。 PVC が StorageClassName を指定しない場合、デフォルトの StorageClass を使用してストレージボリュームを作成できます。詳細については、「デフォルトの StorageClass」を参照してください。

デフォルトの StorageClass はすべての PVC に影響を与えるため、多様なストレージボリューム機能を持つクラスターでは慎重に使用する必要があります。たとえば、NAS タイプの PVC と PV を生成してバインドする場合、デフォルトの StorageClass によってディスク PV が自動的に作成される可能性があります。 ACK クラスターは、デフォルトではデフォルトの StorageClass を提供しません。デフォルトの StorageClass を使用する場合は、次の構成を検討してください。

  1. デフォルトの StorageClass を構成します。

    次のコマンドを実行して、StorageClass (alicloud-disk-topology-alltype) をデフォルトの StorageClass として設定します。

    説明

    この例では、alicloud-disk-topology-alltype を例として使用しています。

    kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class=true

    コマンドを実行した後、クラスター内の StorageClass をクエリすると、alicloud-disk-topology-alltype の名前に (default) という単語が含まれていることがわかります。

    kubectl get sc

    次の結果が返されます。

    NAME                                        PROVISIONER                       AGE
    alicloud-disk-topology-alltype (default)    diskplugin.csi.alibabacloud.com   96m
  2. デフォルトの StorageClass を使用する

    1. 次のテンプレートを使用して、StorageClass を指定せずに PVC を作成します。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-pvc
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi

      クラスターは、デフォルトの StorageClass (alicloud-disk-topology-alltype) を使用して、ディスクストレージボリューム (PV) を自動的に作成します。

      kubectl get pvc

      次の結果が返されます。

      NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES    STORAGECLASS                      AGE
      disk-pvc   Bound    d-bp18pbai447qverm****   20Gi       RWO             alicloud-disk-topology-alltype    49s

デフォルトのストレージタイプの構成を取り消すには、次のコマンドを使用します。

kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class-

Container Service for Kubernetes StorageClass テンプレートの説明

StorageClass

一致するディスクタイプ

説明

alicloud-disk-efficiency

Ultra ディスク

前世代のクラウドディスク

alicloud-disk-ssd

標準 SSD

前世代のクラウドディスク

alicloud-disk-essd

ESSD クラウドディスク

この StorageClass を介してデフォルトで作成される ESSD クラウドディスクは PL1 レベルです。

alicloud-disk-topology-alltype

高可用性オプションを提供します。このモードでは、システムは最初に ESSD の作成を試みます。

  • ESSD が売り切れの場合、または現在のノードが ESSD をサポートしていない場合、システムは標準 SSD の作成を試みます。

  • 標準 SSD が売り切れの場合、または現在のノードが標準 SSD をサポートしていない場合、システムは Ultra ディスクの作成を試みます。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-topology-alltype
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer

マルチゾーンシナリオに推奨

alibabacloud-cnfs-nas

クラスターを作成するときに、CNFS によってホストされる NAS ストレージクラスをデフォルトで作成できます。 CNFS によってホストされる NAS を使用する場合、このストレージクラスを直接使用できます。詳細については、「CNFS を使用して NAS ストレージボリュームを管理する」をご参照ください。

CNFS でホストされる NAS の使用シナリオ

参考資料

Container Service for Kubernetes ストレージソリューションの詳細については、「ストレージドキュメント」をご参照ください。