ACK で永続ストレージを構成するには、ボリューム、PV、PVC、StorageClass を理解する必要があります。
ボリューム
コンテナのファイルシステムはエフェメラルです。再起動するとファイルは失われます。ボリュームは Pod spec で外部ストレージを定義します。Kubernetes は実行時にコンテナにマウントします。
ACK は次のボリュームタイプをサポートします:
|
タイプ |
説明 |
|
ローカルストレージ |
|
|
ネットワークストレージ |
Ceph、GlusterFS、NFS、iSCSI などのリモートボリュームです。データはリモートサービス上に存在しますが、サービスをローカルにマウントする必要があります。 |
|
Secret と ConfigMap |
クラスターオブジェクトのデータ (認証情報、設定) をファイルとして Pod に公開する特殊なボリュームです。 |
|
PVC |
ストレージを独立したオブジェクトとして抽象化する PersistentVolumeClaim に基づくボリュームです。耐久性があり、可搬性の高いストレージに使用します。 |
使用上の注意:
-
Pod は、異なるタイプを含めて複数のボリュームをマウントできます。
-
Pod 内のすべてのコンテナは、マウントされたボリュームを共有します。
-
ボリュームは Pod のライフサイクルを共有します。Pod の削除後にデータが永続化されるかどうかは、ボリュームタイプと設定に依存します。
-
データを永続化するには、PVC と PV を使用します。
PV と PVC
Kubernetes のボリュームがすべて永続的であるとは限りません。耐久性のあるストレージを実現するために、Kubernetes は次の 2 つのオブジェクトを導入し、 ストレージのプロビジョニング方法 と ストレージの利用方法 を分離します:
-
PV はクラスターのストレージリソースであり、ノードに似ています。Pod がノードを使用するのと同様に、PVC は PV を使用します。PV には独自のライフサイクルがあり、いずれの Pod にも依存しません。
-
PVC はストレージ要求であり、Pod に似ています。Pod がノードに対して CPU とメモリを要求するのと同様に、PVC は PV に対して容量とアクセスモードを要求します。
開発者はストレージ要件 (PVC) を宣言し、管理者はプロビジョニング (PV) を管理します。
PV の例
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 20 Gi # 実際のクラウドディスクのサイズに合わせて調整します
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
csi:
driver: diskplugin.csi.alibabacloud.com
volumeHandle: <disk ID>
volumeMode: Filesystem
PVC の例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20 Gi
volumeName: pv-example
バインドルール
PV と PVC は 1 対 1 の関係にあります。各 PV には、1 つの PVC のみがバインドされます。PVC を Pod で使用する前に、Kubernetes は次の条件を満たす PV を見つける必要があります:
|
フィールド |
要件 |
|
|
PVC の volume mode と一致している必要があります |
|
|
PVC が要求するアクセスモードを含む必要があります |
|
|
PVC で指定されている場合、PV は同じ StorageClass を持つ必要があります |
|
ラベルセレクター |
PV は PVC で定義されたラベルセレクターに一致する必要があります |
|
|
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 にバインドします。
動的プロビジョニング
動的プロビジョニングでは、PVC が作成されると CSI プロビジョナーが PV を自動的に作成します。クラウドディスク、NAS ファイルシステム、OSS バケットは動的プロビジョニングをサポートします。
-
管理者は、ストレージタイプとプロビジョナーを定義する StorageClass を作成します。例えば、
diskplugin.csi.alibabacloud.comはクラウドディスクをプロビジョニングします。 -
開発者は、StorageClass を参照する PVC を作成します。PV を手動で作成する必要はありません。
-
Pod が作成されると、CSI プロビジョナーが StorageClass を読み取り、PV と基盤ストレージリソースを作成し、PV を PVC にバインドします。
動的プロビジョニングには 3 つの利点があります:
-
ライフサイクル管理の自動化:プロビジョナーが PV の作成と削除を自動的に処理します。
-
運用負荷の軽減:管理者は個々の PV ではなく StorageClass を管理します。
-
容量の整合性:PV と基盤リソースは常に PVC が要求した容量と一致します。
StorageClass
StorageClass は、動的プロビジョニングに使用されるストレージタイプ、プロビジョナー、およびパラメータを定義します。PVC が StorageClass を参照し、一致する PV が存在しない場合、Kubernetes はプロビジョナーを起動し、PV と基盤ストレージを自動的に作成します。
StorageClass の例
次の 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
主要パラメータ
|
パラメータ |
説明 |
|
|
ストレージをプロビジョニングする CSI ドライバーです。クラウドディスクには |
|
|
ディスクタイプ、ファイルシステムタイプ、パフォーマンス設定など、ドライバー固有のパラメータです。 |
|
|
PVC が削除されたときに PV と基盤ストレージをどう扱うかを指定します。 |
|
|
|
|
|
PV をプロビジョニングするタイミングです。次の表をご参照ください。 |
volumeBindingMode の選択:
|
モード |
PV が作成されるタイミング |
推奨 |
|
|
PVC の作成時 (Pod がスケジュールされる前) |
シングルゾーンクラスター |
|
|
PVC を使用する Pod がノードにスケジュールされた後 |
マルチゾーンクラスター |
マルチゾーンクラスターでは WaitForFirstConsumer を使用します。クラウドディスクはゾーンを跨いでマウントできません。PV がゾーン A にあり、Pod がゾーン B にスケジュールされると、Pod は起動に失敗します。WaitForFirstConsumer を使用すると、プロビジョナーは Pod のスケジュールを待機し、その後 Pod がスケジュールされたゾーンにディスクを作成します。
WaitForFirstConsumer の仕組み:
PVC が作成されると、プロビジョナーは Pod によって使用されるまで待機します。Scheduler は Pod をノードに配置し、結果 (リージョンとノード) を PVC metadata に書き込みます。その後、プロビジョナーが正しいゾーンに PV とディスクを作成します。
デフォルトの StorageClass
デフォルトの StorageClass は、StorageClass 名を省略した PVC に対して PV を自動的にプロビジョニングします。
ACK クラスターにはデフォルトの StorageClass が含まれていません。デフォルトの StorageClass は、storageClassName を指定しない すべて の PVC に適用されます。クラスターで複数のストレージタイプを使用している場合、意図しないタイプがプロビジョニングされる可能性があります。すべての PVC が同じストレージタイプを使用する場合にのみ有効化してください。
デフォルトの StorageClass の設定:
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
StorageClass を指定せずに PVC を作成:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: disk-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20 Gi
クラスターは alicloud-disk-topology-alltype を使用してクラウドディスク PV を自動的に作成します。
kubectl get pvc
想定される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
disk-pvc Bound d-bp18pbai447qverm**** 20 Gi RWO alicloud-disk-topology-alltype 49s
デフォルトの StorageClass の解除:
kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class-
ACK が提供する StorageClass
|
StorageClass |
ディスクタイプ |
注記 |
|
|
旧世代のクラウドディスク |
|
|
|
旧世代のクラウドディスク |
|
|
|
Performance Level 1 (PL1) ESSD |
|
|
|
マルチタイプ |
まず ESSD を試行し、次に標準 SSD、最後に Ultra disk を試行します。マルチゾーンクラスターに推奨します。 |
|
|
CNFS 管理の NAS |
Container Network File System (CNFS) 管理の NAS ボリュームを作成します |
alicloud-disk-topology-alltype StorageClass は、利用可能な最適なディスクタイプを選択します:
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
次のステップ
すべてのストレージタイプとガイドについては、「ストレージ」をご参照ください。
特定のストレージタイプをプロビジョニングするには: