このトピックでは、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 バケットを静的にプロビジョニングされたボリュームとしてマウントできます。
クラスター管理者は、クラスター内のポッドのストレージ要件を分析することにより、ディスクや NAS ファイルシステムなどの記憶媒体を事前に割り当てます。
管理者は、実際のストレージ状況に基づいて事前に複数の PV を手動で作成し、各 PV が提供できる特定のストレージ容量を定義します。 PV は PVC によって消費されます。
ユーザーは PVC を作成して、ビジネスポッドのストレージ要件を宣言します。
ワークロードが PVC 要件を定義している場合、Kubernetes はポッドの作成中に要件に一致する PV に PVC をバインドします。これにより、ワークロードによって作成されたポッドは、マウントされたストレージリソースにアクセスできます。
動的にプロビジョニングされたボリューム
動的にプロビジョニングされたボリュームは、ボリュームドライバーのプロビジョナーによって作成されます。 Alibaba Cloud ディスク、NAS ファイルシステム、OSS バケットを動的にプロビジョニングされたボリュームとしてマウントできます。
クラスター管理者は、バックエンドストレージプールを構成し、さまざまなボリュームドライバープロビジョナーを選択して、さまざまなタイプのボリュームを作成します。たとえば、
diskplugin.csi.alibabacloud.com
は Alibaba Cloud ディスクのプロビジョナーを表します。クラスター管理者は、PV を手動で割り当てる必要はありません。代わりに、管理者は StorageClass を作成し、PVC が StorageClass を消費するのを待つだけです。
ユーザーは PVC を作成して、ビジネスポッドのストレージ要件を宣言します。ユーザーは PVC で StorageClass を指定する必要があります。
ワークロードが 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
主なパラメーター
パラメーター | 説明 | |
| ストレージリソースプロバイダー。有効な値:
| |
| クラウドディスクのパラメーター。 | |
| クラウドディスクの再利用ポリシー。デフォルト値:
高いデータセキュリティが必要な場合は、誤って削除されないように値を | |
| ディスクボリュームの自動拡張を有効にするには、値を | |
| ディスクのバインディングモード。デフォルト値:
|
デフォルトの StorageClass
Kubernetes はデフォルトの StorageClass メカニズムを提供します。 PVC が StorageClassName を指定しない場合、デフォルトの StorageClass を使用してストレージボリュームを作成できます。詳細については、「デフォルトの StorageClass」を参照してください。
デフォルトの StorageClass はすべての PVC に影響を与えるため、多様なストレージボリューム機能を持つクラスターでは慎重に使用する必要があります。たとえば、NAS タイプの PVC と PV を生成してバインドする場合、デフォルトの StorageClass によってディスク PV が自動的に作成される可能性があります。 ACK クラスターは、デフォルトではデフォルトの StorageClass を提供しません。デフォルトの StorageClass を使用する場合は、次の構成を検討してください。
デフォルトの 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
デフォルトの StorageClass を使用する
次のテンプレートを使用して、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 | 前世代のクラウドディスク | |
alicloud-disk-ssd | 前世代のクラウドディスク | |
alicloud-disk-essd | この StorageClass を介してデフォルトで作成される ESSD クラウドディスクは PL1 レベルです。 | |
alicloud-disk-topology-alltype | 高可用性オプションを提供します。このモードでは、システムは最初に ESSD の作成を試みます。
| マルチゾーンシナリオに推奨 |
alibabacloud-cnfs-nas | クラスターを作成するときに、CNFS によってホストされる NAS ストレージクラスをデフォルトで作成できます。 CNFS によってホストされる NAS を使用する場合、このストレージクラスを直接使用できます。詳細については、「CNFS を使用して NAS ストレージボリュームを管理する」をご参照ください。 | CNFS でホストされる NAS の使用シナリオ |
参考資料
Container Service for Kubernetes ストレージソリューションの詳細については、「ストレージドキュメント」をご参照ください。