Container Service for Kubernetes (ACK) は、クラスター内で実行されるワークロードにマウント可能な複数のストレージバックエンド(クラウドディスク、File Storage NAS (NAS) ファイルシステム、Object Storage Service (OSS) バケット)をサポートしています。本トピックでは、永続ストレージを設定する前に理解しておくべきコアストレージ概念——ボリューム、永続ボリューム (PV)、永続ボリューム要求 (PVC)、およびストレージクラス (StorageClass) ——について説明します。
ボリューム
コンテナのファイルシステムは一時的です。コンテナ内に書き込まれたファイルは、コンテナが再起動すると失われます。Kubernetes では、この課題を解決するためにボリュームという抽象化概念が導入されています。ボリュームは Pod を外部ストレージに接続し、Pod の存続期間中はコンテナの再起動を経ても保持され、同一 Pod 内の複数コンテナ間や、Pod と外部環境との間で共有できます。
ACK では、以下のボリュームタイプをサポートしています:
| タイプ | 説明 |
|---|---|
| ローカルストレージ | hostPath や emptyDir などのノードローカルボリュームです。データは特定のノードに紐づくため、そのノードが停止すると利用できなくなります。再スケジュールが発生する可能性のあるステートフルワークロードには不適切です。 |
| ネットワークストレージ | Ceph、GlusterFS、NFS、iSCSI などのリモートストレージボリュームです。データは特定のノードではなくリモートサービス上に保存されますが、ストレージサービスはローカルにマウントする必要があります。 |
| Secret および ConfigMap | 認証情報や構成など、クラスター内のオブジェクトデータをファイルとして Pod に公開する特殊なボリュームです。 |
| PVC | 永続ボリューム要求 (PVC) によって裏付けられたボリュームです。これは基盤となるストレージを独立したオブジェクトとして抽象化します。耐久性・移植性を要するワークロードには PVC を使用してください。 |
使用上の注意事項:
1 つの Pod は複数のボリューム(異なるタイプを同時に含む)をマウントできます。
Pod にマウントされたボリュームは、その Pod 内のすべてのコンテナで共有されます。
ボリュームは Pod のライフサイクルと同期します。Pod 削除後に基盤となるデータが保持されるかどうかは、ボリュームの種類およびその構成に依存します。
耐久性のあるデータには、PVC および PV を使用してください。
PV と PVC
Kubernetes のすべてのボリュームが永続的であるわけではありません。耐久性のあるストレージを実現するために、Kubernetes では「*ストレージのプロビジョニング方法*」と「*ストレージの消費方法*」を分離する 2 つのオブジェクトが導入されています:
永続ボリューム (PersistentVolume: PV) は、クラスター内で事前にプロビジョニングされたストレージ領域です。PV をノードと同様に考えると理解しやすいでしょう。つまり、Pod がノードから CPU やメモリを消費するように、PVC が PV からストレージリソースを消費します。PV は、任意の Pod とは独立した独自のライフサイクルを持ちます。
永続ボリューム要求 (PersistentVolumeClaim: PVC) は、ストレージの使用を要求するオブジェクトです。PVC を Pod と同様に考えると理解しやすいでしょう。つまり、Pod がノードから CPU やメモリを要求するように、PVC は PV からストレージ容量およびアクセスモードを要求します。
この分離により、アプリケーション開発者は必要なストレージ(PVC)を宣言するだけで済み、クラスター管理者はそのストレージの提供方法(PV)を管理できます。
PV の例
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: default
name: pv-example
spec:
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
csi:
driver: diskplugin.csi.alibabacloud.com
volumeHandle: <disk ID>
volumeMode: FilesystemPVC の例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
volumeName: pv-exampleバインドルール
PV と PVC は 1 対 1 の関係を持ちます。つまり、1 つの PV は 1 つの PVC にのみバインドされます。PVC を Pod で使用可能にするには、Kubernetes が以下のすべての条件を満たす PV を見つける必要があります:
| フィールド | 要件 |
|---|---|
volumeMode | PVC の volumeMode と一致する必要があります |
accessModes | PVC が要求するアクセスモードを含む必要があります |
storageClassName | PVC で指定されている場合、PV は同じストレージクラスを持つ必要があります |
| ラベルセレクター | PV は PVC で定義されたラベルセレクターに一致する必要があります |
storage | PV の容量は、PVC が要求する容量以上である必要があります |
storage フィールドの動作:
Kubernetes は
storageを使用して PV と PVC のマッチングおよびバインドを行います。動的プロビジョニングでは、PVC の
storage値がプロビジョニングされる PV および基盤となるストレージリソース(例:クラウドディスク)の容量を決定します。リサイズをサポートするストレージタイプでは、PVC の
storage値がスケールアウト後のターゲット容量を設定します。storageは論理的な容量制限であり、実際の書き込みスループットは基盤となるストレージ媒体(storageフィールドとは無関係)に依存します。
ボリュームのアクセスモード
accessModes フィールドを使用して、ボリュームのマウント方法を定義します:
| アクセスモード | 略称 | 説明 | 例 |
|---|---|---|---|
| ReadWriteOnce | RWO | 単一ノードによる読み取り/書き込み | Alibaba Cloud ディスク |
| ReadOnlyMany | ROX | 複数ノードによる読み取り専用 | OSS バケット |
| ReadWriteMany | RWX | 複数ノードによる読み取り/書き込み | NAS ファイルシステム |
ボリュームのプロビジョニング方法
ACK では、静的プロビジョニングと動的プロビジョニングの 2 種類のプロビジョニングワークフローをサポートしています。
静的プロビジョニング
静的プロビジョニングでは、クラスター管理者が事前に PV を作成します。クラウドディスク、NAS ファイルシステム、OSS バケットを静的にプロビジョニングできます。
管理者が Pod のストレージ要件を分析し、ストレージリソース(例:クラウドディスクや NAS ファイルシステム)を事前に割り当てます。
管理者が、それらリソースの容量および構成を含む PV を作成します。
開発者が、ワークロードの要件を宣言する PVC を作成します。
Pod が作成されると、Kubernetes が PVC を一致する PV にバインドし、Pod にストレージへのアクセスを付与します。
動的プロビジョニング
動的プロビジョニングでは、CSI プロビジョナーが PVC が提出された際に自動的に PV を作成します。クラウドディスク、NAS ファイルシステム、OSS バケットを動的にプロビジョニングできます。
管理者が、ストレージタイプおよびプロビジョナーを定義するストレージクラス (StorageClass) を作成します。たとえば、
diskplugin.csi.alibabacloud.comはクラウドディスクをプロビジョニングします。開発者が、ストレージクラスを参照する PVC を作成します。手動での PV 作成は不要です。
Pod が作成されると、CSI プロビジョナーがストレージクラスを読み取り、PV および基盤となるストレージリソースを作成し、PV を PVC にバインドします。
動的プロビジョニングには、静的プロビジョニングに対する以下の 3 つの利点があります:
自動化されたライフサイクル管理:プロビジョナーが PV の作成および削除を自動的に処理します。
運用負荷の軽減:管理者は個別の PV ではなくストレージクラスを管理します。
容量の一貫性:PV および基盤となるストレージリソースは、常に PVC が要求する容量に一致してプロビジョニングされます。
ストレージクラス
ストレージクラス (StorageClass) は、動的プロビジョニングで使用されるストレージタイプ、プロビジョナー、およびパラメーターを定義します。PVC がストレージクラスを参照し、一致する PV が存在しない場合、Kubernetes はプロビジョナーをトリガーして PV および基盤となるストレージを自動的に作成します。
ストレージクラスの例
以下の StorageClass は、Alibaba Cloud ディスクをプロビジョニングします。
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 | ストレージリソースを作成する CSI ドライバーです。diskplugin.csi.alibabacloud.com をクラウドディスク、nasplugin.csi.alibabacloud.com を NAS ファイルシステム、ossplugin.csi.alibabacloud.com を OSS バケットに使用します。 |
parameters | ディスクタイプ、ファイルシステムタイプ、パフォーマンス設定など、ドライバー固有のパラメーターです。 |
reclaimPolicy | PVC が削除された際の PV および基盤となるストレージの処理方法です。Delete(デフォルト)では PV およびクラウドディスクの両方が削除されます。Retain では両方を保持し、手動で削除する必要があります。データセキュリティが最優先事項である場合は、Retain を設定してください。 |
allowVolumeExpansion | true を設定すると、オンラインディスク拡張が有効になります。 |
volumeBindingMode | PV が作成されるタイミングです。下記の表をご参照ください。 |
volumeBindingMode の選択:
| モード | PV の作成タイミング | 推奨される用途 |
|---|---|---|
Immediate(デフォルト) | PVC 作成時(Pod のスケジュール前) | シングルゾーンクラスター |
WaitForFirstConsumer | PVC を使用する Pod がノードにスケジュールされた後 | マルチゾーンクラスター |
マルチゾーンクラスターでは WaitForFirstConsumer を使用してください。クラウドディスクはゾーンを跨いでマウントできません。PV がゾーン A でプロビジョニングされたにもかかわらず Pod がゾーン B にスケジュールされた場合、Pod は起動に失敗します。WaitForFirstConsumer を使用すると、プロビジョナーは Pod のスケジュールを待ってから、Pod が実行されるゾーンにディスクを作成します。
WaitForFirstConsumer の動作:
PVC が作成されても、プロビジョナーは即座に PV を作成しません。代わりに、PVC を使用する Pod がスケジュールされるまで待ちます。スケジューラが Pod をノードに配置すると、そのスケジューリング結果(リージョンおよびノード)が PVC のメタデータに書き込まれます。プロビジョナーはこの情報を読み取り、正しいゾーンに PV および基盤となるディスクを作成します。
デフォルトのストレージクラス
Kubernetes では、ストレージクラス名を指定しない PVC に対して自動的に PV をプロビジョニングするデフォルトのストレージクラスをサポートしています。
ACK クラスターでは、初期状態でデフォルトのストレージクラスは設定されていません。デフォルトのストレージクラスは、storageClassName を省略したすべてのPVC に適用されます。クラスターで複数のストレージタイプを使用している場合、デフォルトのストレージクラスが PVC に対して誤ったストレージタイプをプロビジョニングする可能性があります。すべての PVC が同じストレージタイプを使用する場合にのみ有効化してください。
デフォルトのストレージクラスを設定する:
以下のコマンドを実行して、alicloud-disk-topology-alltype をデフォルトとしてマークします:
kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class=true変更を確認する:
kubectl get sc期待される出力:
NAME PROVISIONER AGE
alicloud-disk-topology-alltype (default) diskplugin.csi.alibabacloud.com 96mストレージクラスを指定せずに PVC を作成する:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: disk-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Giクラスターは、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-ACK が提供するストレージクラス
| ストレージクラス | ディスクタイプ | 備考 |
|---|---|---|
alicloud-disk-efficiency | Ultra ディスク | 旧世代のクラウドディスク |
alicloud-disk-ssd | 標準 SSD | 旧世代のクラウドディスク |
alicloud-disk-essd | ESSD | パフォーマンスレベル 1 (PL1) のエンタープライズ SSD |
alicloud-disk-topology-alltype | マルチタイプ | ESSD を最初に試行し、次に標準 SSD、最後に Ultra ディスクを試行します。マルチゾーンクラスターに推奨されます。 |
alibabacloud-cnfs-nas | NAS(Container Network File System) | コンテナネットワークファイルシステム (CNFS) で管理される NAS ボリュームを作成します。 |
alicloud-disk-topology-alltype ストレージクラスは、プロビジョニング時に利用可能な最適なディスクタイプを選択します:
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次のステップ
利用可能なストレージオプションの完全な一覧および操作手順については、「ストレージ」をご参照ください。
特定のストレージタイプのプロビジョニング手順については、以下をご参照ください: