PersistentVolumeとは
公式ドキュメントでは以下の定義があります。
A PersistentVolume (PV) is a piece of storage in the cluster that has been provisioned by an administrator or dynamically provisioned using Storage Classes. It is a resource in the cluster just like a node is a cluster resource. PVs are volume plugins like Volumes, but have a lifecycle independent of any individual Pod that uses the PV. This API object captures the details of the implementation of the storage, be that NFS, iSCSI, or a cloud-provider-specific storage system.
PersistentVolumeは、基本的にネットワーク越しに接続するタイプのディスクと考えればいいでしょう。イメージとしては、ネットワーク越しの外付けハードディスクみたいなものです。
Volumeとの違いは、PresistentVolumeは明示的にmanifestでリソースを作成が必要のところです。
現時点、k8sでは様々なPresistentVolumeプラグインを実装されています。
一部は以下となります。
- GCEPersistentDisk:GCPのデータディスク
- AWSElasticBlockStore:AWSのデータディスク
- AzureFile:Azureのファイルサービス
- AzureDisk:Azureのデータディスク
- iSCSI
- NFS
- OpenStack Cinder
- Ceph
PresistentVolumeの作成
PresistentVolumeをk8sで使うには、事前に該当のリソースを用意しないといけません。
GCPを例にすると、GCEPersistentDiskを事前に作成しておくことが必要です。
各種プラグインは特有な設定はありますが、以下の設定は基本共通です。
- ラベル:
metadata.label
- 基本は省略可能です。用途を分けたい時に使います。PresistentVolumeClaimと一緒に使用する場合は基本必要ない。
- 容量:
spec.capacity
- アクセスモード:
spec.accessModes
- ReadWriteOnce(RWO):単一Nodeで読み取り/書き込みとしてマウント可能
- ReadOnlyMany(ROX):複数Nodeから読み取り専用としてマウント可能
- ReadWriteMany(RWX):複数Nodeから読み取り/書き込みとしてマウント可能
- Reclaim Policy:
spec.persistentVolumeReclaimPolicy
- Delete:PVCが削除された時に、PVはReleased状態で残るが、Diskは削除される。データ消える。
- Retain:PVCが削除された時に、PVはReleased状態で残るが、Diskは削除されない。データは残る。
- ただ、Diskをもう一回使うには、PVを削除して、最初から関連付けをする必要がある。
- マウントオプション:一部のプラグインに追加オプションの指定は可能です。
- StorageClass:
spec.storageClassName
- storageClassは、storageを分類してポリシーを定義するためのものです。
- GKE(GCPのk8s)のデフォルトでは、
kubernetes.io/gce-pd
というProvisionerが設定されたStorageClassが定義されている - GKEでディフォルトのままで、PVCを利用すると、Dynamic Provisioningが行われる。※後述
- 各プラグインの特有設定
※ ボリュームは、多数のモードをサポートしていても、一度に1つのアクセスモードでしかマウントできません。たとえば、GCEPersistentDiskは、単一NodeではReadWriteOnceとして、または多数のNodeではReadOnlyManyとしてマウントできますが、同時にマウントすることはできません。
PresistentVolumeの作成例
GCPの場合を例として、以下のようにmanifestを作成します。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-demo # PV名
spec:
storageClassName: "example-storageclass" # StorageClassの指定
capacity: # 容量
storage: 500G
accessModes: # アクセスモード
- ReadWriteOnce
claimRef: # PVCと関連付けするための設定
namespace: default
name: pv-claim-demo
gcePersistentDisk: # プラグインの種類と内容
pdName: pd-name # GCEPersistentDisk名を指定
fsType: ext4 # ファイルシステム指定
---
# よくPVはPVCと一緒使うので、連携して使う例を採用しました。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim-demo
spec:
storageClassName: "example-storageclass"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500G
最後に
今回PresistentVolumeについて、簡単にご紹介しました。
PresistentVolumeはk8sのリソースとして存在していても、Podにそのまま使えるわけではありません。
次回で紹介する予定のPresistentVolumeClaimがPodとの関わりを持たせるためのリソースとなります。
コメント
很好