アプリケーションがログファイルやデータベースのデータなど、再起動しても失われては困るデータを扱うとき、Kubernetesでは PersistentVolumeClaim(PVC)
を使って「永続的なストレージ」を Pod に提供します。
この章では、「PVCって何?」「どうやって使うの?」という疑問に答えていきます。
💡 PVCって何?
PVC(PersistentVolumeClaim)は、Kubernetesリソースのひとつで、「○GBぐらいのストレージがほしい!」という**ユーザー側の要求(リクエスト)**を表します。
その要求に合う PersistentVolume(PV:実際の物理・仮想ストレージ)がクラスターに存在していれば、自動的にバインド(紐づけ)され、Podからそのストレージを使えるようになります。
🏗️ PVCを使う流れ
PVCの基本的な使い方は、次の3ステップです。
✅ ステップ1:PVCの定義を書く(YAML)
以下は 1Gi のストレージを要求するシンプルなPVCの例です。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
accessModes
: アクセス方法(ReadWriteOnce は 1 Pod から書き込み可能)resources.requests.storage
: ほしいサイズ
※ ストレージクラスを指定すれば、動的にPVが作られます(Cloud環境ではほぼ必須)
✅ ステップ2:Pod(やDeployment)からマウントする
上で作った PVC を Pod で使うには、YAMLの中で volumes
と volumeMounts
を指定します。
apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
containers:
- name: web
image: nginx
volumeMounts:
- name: my-volume
mountPath: /usr/share/nginx/html
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
この例では、Nginx の /usr/share/nginx/html
ディレクトリが PVC で指定したストレージにマウントされます。
✅ ステップ3:アプリの中でファイルを保存してみる
この状態でアプリケーション(たとえばNginxやSpring Bootなど)がファイルを書き込めば、それらはPodが削除された後も残り続けます。Podを再作成しても、同じPVCを使えば同じデータにアクセス可能です。
🔍 よくあるポイント・補足
▶ 動的プロビジョニングと StorageClass
クラウド環境やMinikubeでは、PVCを作成するだけで自動的にPVが生成されます(これを動的プロビジョニングと呼びます)。
spec:
storageClassName: standard
このように storageClassName
を指定することで、裏側でストレージが自動生成される仕組みです。
▶ PVCの状態確認
PVCが正しくPVとバインドされたかは以下で確認できます:
kubectl get pvc
kubectl describe pvc my-pvc
▶ Pod作成時にPVCがバインドされていないとどうなる?
Podは「PVCがバインドされるまで保留状態」になります。PVCに合うPVが見つからないと、Podも動き出しません。
🎯 実務での活用例
- データベース(MySQL、PostgreSQLなど)の
/var/lib/mysql
をPVCで永続化 - ファイルアップロードを受け付けるWebアプリの
/uploads
ディレクトリにマウント - キャッシュやセッションデータの保存場所としての活用
📋 まとめ
用語 | 内容 |
---|---|
PersistentVolume(PV) | 管理者が用意するストレージ本体 |
PersistentVolumeClaim(PVC) | 開発者・ユーザーが出すストレージ要求 |
Pod | PVCを介してストレージを使う |
- PVCは「ストレージ使わせて!」という宣言
- Podから簡単に使えるようになる
- 実運用では StorageClass とセットで動的プロビジョニングが基本