Kubernetes

PersistentVolume ぱーしすてんとぼりゅーむ

ストレージKubernetesPVCPodマウントクラウドストレージ
PersistentVolumeについて教えて

簡単に言うとこんな感じ!

Kubernetesでアプリが使えるストレージの「駐車スペース」みたいなものだよ!アプリ(Pod)は一時的に消えても、ここにデータを預けておけばちゃんと残り続けるんだ。コンテナが再起動されてもデータが消えない仕組みってこと!


PersistentVolumeとは

PersistentVolume(PV) とは、Kubernetesクラスター上でアプリケーションが利用できる永続的なストレージリソースのことです。通常、コンテナはその生存期間中だけデータを保持しますが、コンテナが停止・再起動・削除されるとデータも失われてしまいます。PVはその問題を解決するために設計された仕組みです。

PVはクラスター管理者(インフラ担当者)が事前に用意する「ストレージの器」であり、AWS EBS・Google Persistent Disk・NFS・Azure Diskといった実際のストレージインフラを抽象化して表現します。アプリ開発者はストレージの種類や設定を詳しく知らなくても、後述の PersistentVolumeClaim(PVC) を通じて安全にストレージを要求・利用できます。

ビジネス的な観点では、PVはデータベースのデータファイル・アップロードされたファイル・ログなど、「消えてはいけないデータ」を扱うすべてのシステムで必須の概念です。PVを正しく設計しないと、システム障害時にデータが丸ごと消えるリスクがあります。


PersistentVolumeの仕組みと構造

Kubernetesのストレージは「管理者が用意する側」と「アプリが使う側」を明確に分離しています。

登場人物役割担当者
PersistentVolume(PV)ストレージリソースそのもの(駐車スペース)クラスター管理者
PersistentVolumeClaim(PVC)ストレージの利用申請(駐車券)アプリ開発者
StorageClassストレージの種類・品質を定義(駐車場の等級)クラスター管理者
Pod実際にストレージを使うアプリ本体アプリ開発者

PVのライフサイクル

PVには明確なライフサイクルがあり、状態(Phase)で管理されます。

Available(利用可能)
  ↓ PVCにバインド(割り当て)される
Bound(使用中)
  ↓ PVCが削除される
Released(解放済み・未クリーン)
  ↓ 再利用ポリシーに従って処理
Available または Deleted(終了)

アクセスモードの種類

アクセスモード略称説明用途例
ReadWriteOnceRWO1つのNodeのみ読み書き可DB、単一サーバー
ReadOnlyManyROX複数Nodeから読み取りのみ可共有設定ファイル
ReadWriteManyRWX複数Nodeから読み書き可共有ファイルサーバー
ReadWriteOncePodRWOP1つのPodのみ読み書き可(v1.22以降)排他制御が必要なDB

回収ポリシー(reclaimPolicy)

PVCが削除されたあと、PVをどう扱うかを決めるルールです。

ポリシー動作データ用途
RetainPVは残る(手動で回収)保持される本番DBなど重要データ
DeletePVとストレージ両方削除消える開発・テスト環境
Recycle(非推奨)データ消去後に再利用消える古い構成(現在非推奨)

歴史と背景

  • 2014年 — Kubernetesプロジェクトがオープンソース化。当初はコンテナの「使い捨て」前提の設計で、永続ストレージの仕組みが不十分だった
  • 2015年 — Kubernetes v1.0正式リリース。PersistentVolumeとPersistentVolumeClaimの概念が導入され、ステートフル(状態を持つ)アプリへの対応が始まる
  • 2016年StorageClass が導入され、管理者が事前にPVを手動作成しなくても、PVCの要求に応じてストレージを自動作成できる「動的プロビジョニング」が実用化
  • 2018年CSI(Container Storage Interface) が安定版に。AWS・Google・Azureなど各クラウドやストレージベンダーが統一インターフェースでドライバーを提供できるようになる
  • 2020年 — CSIがデフォルト推奨となり、旧来のin-treeプラグイン(Kubernetes本体に組み込まれたストレージドライバー)から移行が進む
  • 2022年〜 — ReadWriteOncePod(RWOP)アクセスモード追加など、より細かいアクセス制御が可能に

PV・PVC・StorageClassの関係と動的プロビジョニング

従来の「静的プロビジョニング」と、現在主流の「動的プロビジョニング」では、PVの作られ方が大きく異なります。

PV・PVC・StorageClassの関係(動的プロビジョニング) 開発者 PVC PersistentVolumeClaim 「10GB欲しい」と申請 Pod(アプリ) PVCをマウントして ストレージを利用 管理者 StorageClass ストレージの種類を定義 例: SSD / HDD / NFS Kubernetes PV PersistentVolume 自動作成・バインド 申請 参照 実ストレージ AWS EBS GCP Disk Azure Disk NFS / Ceph プロビジョニング マウント 実線: 通常の関係 破線: 論理的な関係(マウント・参照)

YAMLで見るPVとPVCの対応

# PersistentVolume(管理者が定義)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi          # ストレージ容量
  accessModes:
    - ReadWriteOnce        # 1 Node から読み書き可
  reclaimPolicy: Retain    # PVC削除後もデータ保持
  storageClassName: ssd    # StorageClassの名前
  hostPath:
    path: /data/my-pv      # 実際のストレージパス(例)

---
# PersistentVolumeClaim(開発者が定義)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi        # 10GB を要求
  storageClassName: ssd    # 上のPVと一致 → 自動バインド

StatefulSetとの関係

StatefulSet(ステートフルセット)は、データベースのようにデータを持つアプリを管理するKubernetesのリソースです。StatefulSetは volumeClaimTemplates を使って、各Podに自動的にPVCを作成・割り当てる機能を持っています。MySQL・PostgreSQL・MongoDBなどのKubernetes上への展開では、StatefulSet + PVの組み合わせが定番です。


関連する規格・RFC

規格内容
CSI Spec(Container Storage Interface)Kubernetesとストレージプロバイダーを接続するための標準インターフェース仕様。OSSで管理されており、RFCではなくGitHub上で公開

関連用語

  • PersistentVolumeClaim — PVを利用するためにアプリ側から行うストレージ申請リソース
  • StorageClass — ストレージの種類・品質・プロビジョナーを定義するKubernetesリソース
  • Pod — Kubernetesで最小のデプロイ単位。PVCをマウントしてストレージを利用する
  • StatefulSet — データベースなどステートフルなアプリを管理するKubernetesリソース
  • CSI(Container Storage Interface) — ストレージプロバイダーがKubernetesに対応するための標準インターフェース
  • Kubernetes — コンテナの自動管理・スケーリングを行うオーケストレーションプラットフォーム
  • コンテナ — アプリとその実行環境をパッケージ化した軽量な実行単位
  • 動的プロビジョニング — PVCの申請に応じてPVを自動作成する仕組み