広告

kubernetes – PersistentVolume(PV)

infrastructure as code

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との関わりを持たせるためのリソースとなります。

コメント

  1. Art より:

    很好

タイトルとURLをコピーしました