Container Service for Kubernetes (ACK) は、クラスター、アプリケーション、ストレージ、ネットワーク、その他のモジュールの管理プラットフォームとしてKubernetesオーケストレーションシステムを使用します。 このトピックでは、ACKのコンテナストレージの基本について説明します。 このトピックを使用すると、ACKで提供されるストレージ機能を使用する際のストレージモジュールの基本と原則を理解するのに役立ちます。
ボリューム
コンテナ内のディスク上のファイルは一時的です。 Kubernetesボリュームの抽象化は、コンテナの再起動時にファイルが失われるという問題を解決します。 ボリュームは、ポッドと外部記憶装置との間のデータ転送チャネルである。 ボリュームは、ポッド内のコンテナ間、ポッド間、およびポッドと外部環境との間のデータ共有も可能にする。
ボリュームは外部ストレージの詳細を定義し、ポッドに埋め込まれます。 ボリュームは基本的に、Kubernetesシステムの外部ストレージへのリソースマッピングです。 ワークロードに外部ストレージが必要な場合、システムはボリューム内の関連情報を照会し、外部ストレージをマウントします。
ボリューム | 説明 |
ローカルストレージ | ローカルストレージは、HostPathやemptyDirボリュームなどのボリュームとしてマウントできます。 これらのボリュームは、クラスターの特定のノードにデータを格納し、アプリケーションとともにドリフトしません。 ノードがダウンすると、保存されたデータは使用できなくなります。 |
ネットワークストレージ | ネットワークストレージは、Ceph、GlusterFS、NFS、iSCSIボリュームなどのボリュームとしてマウントできます。 これらのボリュームは、リモートストレージサービスを使用してデータを保存します。 これらのボリュームを使用する場合は、ストレージサービスをローカルにマウントする必要があります。 |
秘密と構成マップ | SecretsとConfigMapsは、クラスターに関するオブジェクト情報を格納する特別なボリュームです。 オブジェクトデータは、アプリケーションが使用するためにノードにボリュームとしてマウントされます。 |
PVC | 永続的ボリュームクレーム (PVC) は、ボリュームを定義するためのメカニズムを提供します。 PVCは、ボリュームをポッドに依存しないオブジェクトに抽象化します。 このオブジェクトに対して定義または関連付けられているストレージ情報は、ボリュームに保存され、Kubernetesワークロードで使用するためにマウントされます。 |
- ポッドは複数のボリュームをマウントできます。
- ポッドは複数のタイプのボリュームをマウントできます。
- ポッドにマウントされたボリュームは、ポッド内のコンテナ間で共有できます。
- Kubernetesでボリュームをマウントするために、永続ボリューム (PV) とPVCを作成することを推奨します。
- 過剰な数のボリュームをポッドにマウントしないことを推奨します。
PVおよびPVC
PV
- PVは、persistent volumeの略である。 PVは、Kubernetesの特定のタイプのボリュームです。 PVオブジェクトは、特定のStorageClassとボリュームパラメータのセットを定義します。 ターゲットストレージサービスに関するすべての情報は、PVオブジェクトに格納されます。 Kubernetesは、PVオブジェクトに保存されている情報を参照してボリュームをマウントします。
PVC
- PVCは、persistent volume claimの略語です。 PVCは、Kubernetesの抽象ボリュームの一種であり、特定のStorageClassのデータボリュームを表します。 PVCは、アプリケーションオーケストレーションからストレージを分離するように設計されています。 PVCオブジェクトは、ストレージの詳細を抽象化し、ストレージオーケストレーションを実装します。 これにより、ストレージボリュームオブジェクトがKubernetesのアプリケーションオーケストレーションから独立し、オーケストレーションレイヤーでアプリケーションがストレージから切り離されます。
- PVとPVCのバインディング
1つのPVCオブジェクトは1つのPVオブジェクトにのみバインドされます。 1つのPVオブジェクトを複数のPVCオブジェクトにバインドすることはできません。 アプリケーションのストレージを構成するには、PVCオブジェクトを宣言する必要があります。 Kubernetesは、PVCオブジェクトに最適なPVオブジェクトを選択し、それらをバインドします。 PVCは、アプリケーションによって使用されるストレージオブジェクトのタイプであり、アプリケーションドメインに属します。 PVは、ストレージドメインに属するストレージオブジェクトの一種です。
PVCオブジェクトは、ポッドによって消費される前にPVオブジェクトにバインドする必要があります。 PVCオブジェクトをPVオブジェクトにバインドするプロセスは、PV消費のプロセスです。 次の要件を満たすPVオブジェクトのみをPVCオブジェクトにバインドできます。- VolumeMode: 消費されるPVオブジェクトは、PVCオブジェクトと同じボリュームモードである必要があります。
- AccessMode: 消費されるPVオブジェクトは、PVCオブジェクトと同じアクセスモードである必要があります。
- StorageClassName: このパラメーターがPVCオブジェクトに対して定義されている場合、対応するパラメーターが定義されているPVオブジェクトのみがこのPVCオブジェクトにバインドできます。
- LabelSelector: 適切なPVオブジェクトは、ラベルマッチングに基づいてPVリストから選択されます。
- size: 消費されるPVオブジェクトのストレージ容量は、PVCオブジェクトのストレージ容量以上でなければなりません。
- PVおよびPVC定義のサイズフィールドPVおよびPVC定義のsizeフィールドには、次の用途があります。
- システムは、サイズパラメータに基づいてPVオブジェクトとPVCオブジェクトをバインドできるかどうかを判断します。
- PVCオブジェクトとStorageClassに基づいてPVオブジェクトを動的に作成するには、一部のストレージタイプが、PVCオブジェクトのサイズに基づいてPVオブジェクトとバックエンドストレージの容量を決定します。
- サイズ変更操作をサポートするストレージタイプの場合、PVCオブジェクトのサイズは、スケールアウト後のPVオブジェクトとバックエンドストレージの容量として使用されます。
PVCオブジェクトおよびPVオブジェクトのサイズ値は、システムがPVCオブジェクトおよびPVオブジェクトに対して操作を実行するときに構成パラメータとして使用されます。
データがボリュームに書き込まれるとき、PVCオブジェクトおよびPVオブジェクトのサイズフィールドは参照されません。 代わりに、書き込み動作は、基礎となる記憶媒体の実際の容量に依存する。
ボリュームの使い方
- 静的ボリューム
静的ボリュームは、管理者によって作成されたPVオブジェクトです。 すべてのボリュームを静的ボリュームとして作成できます。
クラスタ管理者は、クラスタのストレージニーズを分析し、ディスクやNASファイルシステムなどのストレージメディアを事前に割り当てます。 管理者はまた、PVCオブジェクトによって消費されるPVオブジェクトを作成する。 ワークロードでPVCのニーズが定義されている場合、Kubernetesは関連するルールに基づいてPVCオブジェクトとPVオブジェクトをバインドします。 これにより、アプリケーションはストレージサービスにアクセスできます。
- 動的ボリューム
ダイナミックボリュームは、ストレージプラグインによって自動的に作成されるPVオブジェクトです。
クラスター管理者は、バックエンドストレージプールを構成し、StorageClassを作成します。 PVCオブジェクトがPVオブジェクトを使用する必要がある場合、ストレージプラグインはPVCのニーズとStorageClassの詳細に基づいてPVオブジェクトを動的に作成します。 StorageClassの定義は次のとおりです。- StorageClass
PVCオブジェクトを宣言すると、このPVCオブジェクトにStorageClassNameフィールドを追加できます。 これにより、クラスター内のPVオブジェクトが宣言されたPVCオブジェクトに適合しない場合、ProvisionerプラグインはStorageClassNameの定義に基づいて適切なPVオブジェクトを作成できます。 これにより、動的ボリュームが作成されます。
ダイナミックボリュームは、Provisionerプラグインによって作成され、StorageClassNameに基づいてPVCオブジェクトにバインドされます。
StorageClassは、PVオブジェクトを作成するために使用されるテンプレートです。 PVCオブジェクトが自動PV作成プロセスをトリガーすると、StorageClassのコンテンツに基づいてPVオブジェクトが作成されます。 次の例は、StorageClass: apiVersion:storage.k8s.io/v1のコンテンツを示しています。kind: StorageClass メタデータ: 名前: alicloud-disk-topology パラメータ: タイプ: cloud_ssd provisioner: diskplugin.csi.alibabacloud.com reclaimPolicy: 削除 allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer
パラメーター 説明 reclaimPolicy PVオブジェクトの作成に使用するpersistentVolumeReclaimPolicyフィールドの値を指定します。 有効な値: DeleteおよびRetain。 - Deleteは、バインドされたPVCオブジェクトがリリースされると、動的に作成されたPVオブジェクトが自動的にリリースされることを指定します。
- Retainでは、PVオブジェクトが動的に作成されますが、管理者がリリースする必要があることを指定します。
allowVolumeExpansion 現在のStorageClassに基づいて作成されたPVオブジェクトが動的スケールアウトを実行するかどうかを指定します。 デフォルト値: false
。 このパラメーターは、動的スケールアウトを有効または無効にするためにのみ使用されます。 この機能を有効にするかどうかは、基になるストレージプラグインによって決まります。volumeBindingMode PVオブジェクトが動的に作成される時刻を指定します。 有効な値: Immediate (即時作成) およびWaitForFirstConsumer (遅延作成) 。 - 遅延バインディングAlibaba Cloudディスクなどの特定のタイプのストレージは、マウント属性に制限を課します。 たとえば、ボリュームは、ボリュームと同じゾーン内のノードにのみマウントできます。 このタイプのボリュームでは、次の問題が発生します。
- ボリュームはゾーンAに作成されますが、ゾーンAには使用可能なノードリソースがありません。 そのため、作成したボリュームを起動時にポッドにマウントすることはできません。
- クラスタ管理者がPVCおよびPVオブジェクトを計画するとき、バックアップ用に複数のPVオブジェクトを作成できるゾーンを決定できません。
StorageClassテンプレートには、上記の問題を修正するためのvolumeBindingModeフィールドがあります。 volumeBindingModeがWaitForFirstConsumerに設定されている場合、ストレージプラグインはPVC保留状態を受け取るとボリュームの作成を遅らせます。 代わりに、ストレージプラグインは、PVCオブジェクトがポッドによって消費された後にのみボリュームを作成します。
説明遅延バインディングのプロセス:
Provisionerプラグインは、PVC保留状態を受け取ると、ボリュームの作成を遅らせます。 代わりに、プラグインは、PVCオブジェクトがポッドによって消費された後にのみボリュームを作成します。 ポッドがPVCオブジェクトを消費し、スケジューラがPVCオブジェクトが遅延バインディングを有効にしたと判断した場合、PVスケジューリングプロセスが続行されます。 スケジューラは、スケジューリング結果をPVCオブジェクトのメタデータにパッチする。 Provisionerプラグインは、スケジューリング情報がPVCオブジェクトに書き込まれたと判断すると、スケジューリング情報に基づいてゾーンやノードなどの位置情報を取得してボリュームを作成します。 次に、プラグインはPV作成プロセスをトリガーします。
マルチゾーンクラスターで動的ボリュームを作成する場合は、遅延バインディング機能を使用することを推奨します。 上記の設定プロセスはACKでサポートされています。
ダイナミックボリュームの利点- 動的ボリュームにより、Kubernetesは自動PVライフサイクル管理を実装できます。 PVオブジェクトは、Provisionerプラグインによって作成および削除されます。
- PVオブジェクトを自動的に作成できるため、構成が簡素化され、システム管理者の作業負荷が軽減されます。
- ダイナミックボリュームは、PVCに必要なストレージ容量と、Provisionerプラグインによって設定されたPV容量との間の一貫性を維持します。 これにより、ストレージ容量の計画が最適化されます。
- StorageClass
- マウントSubPathボリューム
Kubernetesには
volumeMounts.subPath
プロパティがあります。このプロパティを使用して、参照先ボリューム内のルートではなくサブパスを指定できます。説明 一部のKubernetesバージョンでは、SubPathボリュームのマウントとアンマウントがエラーを引き起こす可能性があるため、SubPathボリュームを使用しないことを推奨します。 Container Storage Interface (CSI) プラグインを使用して、NASファイルシステムやOSSバケットなどのサブディレクトリをマウントできます。
クォータ制限
- 特定のタイプのストレージは、ノードにマウントできるボリュームの数にクォータ制限を課します。 たとえば、ノードのボリュームとして最大16個のディスクをマウントできます。 ACKは、クォータ制限を満たすスケジューリングポリシーを提供します。 ノードにマウントされているボリュームの数がクォータに達すると、スケジューラは指定されたタイプのボリュームをこのノードにスケジュールしなくなります。
- ACKで提供されるCSIプラグインを使用すると、MAX_VOLUMES_PERNODEフィールドを使用してノードごとのボリューム数を設定できます。 CSIプラグインの詳細については、「CSIの概要」をご参照ください。