第19章:永続化(PV / PVC / StorageClass)💾🪴
「Podは消える🫥」「でもデータは残したい😇」——ここを解決するのが PV / PVC / StorageClass です。 この章は、次の第20章(StatefulSetでDB系🗃️)に入る前の“土台づくり”だよ〜!✨
この章でできるようになること ✅🎯
- PV / PVC / StorageClass の役割を、図がなくても説明できる 🧠✨ (Kubernetes)
- PVCを作るだけでPVが自動で生える(Dynamic Provisioning) を体験する 🌱➡️🌳 (Kubernetes)
- Podを消しても、ファイルが残ってる! を自分の手で確認する 🥳
- ありがちな詰まり(PVCがPending😇、Podが起動しない😇)を describeで切り分け できる 🔎
1) まず“超ざっくり世界観”🗺️✨(駐車場たとえ🚗)
- PV:クラスタに存在する“駐車場(実体)”🚗🅿️ → 管理者が作るか、仕組みで自動作成される (Kubernetes)
- PVC:ユーザーが出す“駐車券(この条件の場所ほしい)”🎫 → 「容量◯Gi」「アクセスモード」など条件を書く (Kubernetes)
- StorageClass:駐車場の“作り方テンプレ(種類)”🏗️ → どのprovisioner(作成係)で、どんなパラメータで作るか (Kubernetes)
イメージはこれ👇
- Pod 📦 → (使いたい!)→ PVC 🎫 → (束縛/Bind)→ PV 🅿️ → (実体)→ ストレージ💾
- StorageClass 🏗️ → (自動作成係)→ PV 🅿️ が“勝手に生える”🌱
2) 2026ストレージ事情の“ここだけ”メモ 🧠⚠️
- Dynamic Provisioning は「PVCを作ったらストレージが自動で用意される」仕組み。手でPVを量産しなくてOK👌 (Kubernetes)
- StorageClassの
volumeBindingMode: WaitForFirstConsumerは超重要! PVの確保/バインドを“Podがどこに置かれるか”が決まるまで待てる(ゾーン/トポロジ系の事故が減る)⏳🧭 (Kubernetes) - “ローカル(ノードのディスク)”系は便利だけど、マルチノードでは置き場所(ノード)が大事。
hostPathは特に「単一ノード向け」扱いの注意があるよ⚠️ (Kubernetes)
3) ハンズオン①:PVC→Pod→書き込み→Pod削除→復活🥳💾
3-1. まず、クラスタにStorageClassがあるか確認👀
(最初に“ある前提”で進めないのがコツ!)
kubectl get sc
standardとかlocal-pathとかが見えたらOK🙆♂️- もし default なStorageClassがあるなら、PVC側で
storageClassNameを省略しても自動で補われることが多いよ🧠 (Kubernetes)
ここで
scが0件だったら、後ろの「kind向けプランB」へGO👉
3-2. PVC(駐車券🎫)を作る
chapter19-pvc.yaml を作って貼り付け👇
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: chapter19-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
適用!
kubectl apply -f chapter19-pvc.yaml
kubectl get pvc
STATUSがBoundになったら最高🎉- この時点で PVが自動作成されてる ことが多い(Dynamic Provisioning)🌱 (Kubernetes)
PVも見てみよ👇
kubectl get pv
3-3. PodからPVCをマウントして、ファイルを書く📝
chapter19-pod.yaml を作って貼り付け👇
apiVersion: v1
kind: Pod
metadata:
name: chapter19-writer
spec:
containers:
- name: writer
image: busybox:1.36
command: ["sh", "-c", "echo hello-pv > /data/hello.txt && sleep 3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: chapter19-pvc
適用&確認👇
kubectl apply -f chapter19-pod.yaml
kubectl get pod
kubectl exec -it chapter19-writer -- cat /data/hello.txt
hello- pv が出たら成功〜!🥳🎉
3-4. Podを消して作り直す(データ残ってる?)🫣➡️😇
まず消す👇
kubectl delete pod chapter19-writer
kubectl get pod
もう一回作る👇
kubectl apply -f chapter19-pod.yaml
kubectl exec -it chapter19-writer -- cat /data/hello.txt
同じファイルが残ってたら勝ち🏆💾 これが「Podは消えてもデータは残る」感覚だよ〜! (Kubernetes)
4) “アクセスモード”でハマらないための最低限🧠🧷
PVCでよく使うやつ👇(雰囲気だけでOK!)
ReadWriteOnce (RWO):基本これ。1つのノードに読み書きでマウント(クラスタによって細部が違うこともあるけど、最初はこの理解でOK) (Kubernetes)ReadWriteMany (RWX):複数ノードから同時マウントできるタイプ(NFSみたいな仕組みが必要なことが多い)ReadWriteOncePod (RWOP):さらに厳しめ。「1 Podだけ」に近い制約で安全側に寄せるやつ🛡️ (Kubernetes)
⚠️超大事: アクセスモードは“読み取り専用を強制する”みたいな万能ロックじゃないよ。仕組み上の注意もあるので、過信しないのが吉🙏 (Kubernetes)
5) トラブルシュート道場🥋(PVCがPendingのとき)
5-1. まずこれだけやればいい👍
kubectl describe pvc chapter19-pvc
kubectl get sc
kubectl get pv
5-2. ありがち原因トップ3 😇
- StorageClassが無い / defaultが無い → PVCが「どこに作っていいか分からん…」で止まる🫠
- 容量やaccessModesが合うPVが存在しない(手動PV運用のとき) → 条件一致がなくてずっと待つ⏳ (Kubernetes)
- トポロジ問題(マルチゾーンやローカルストレージ)
→
WaitForFirstConsumerが効くケースが多い!🧭 (Kubernetes)
6) kindでStorageClassが無い場合の“プランB”🛠️(ローカル学習用)
まずは kubectl get sc を必ず確認ね👀
もし0件だったら、ローカル学習では Rancher の Local Path Provisioner が定番ルートのひとつだよ🚀
(各ノードのローカル領域に hostPath / local のPVを“自動で”作ってくれるタイプ) (GitHub)
インストール例(READMEのStable)👇
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.34/deploy/local-path-storage.yaml
kubectl get sc
入ったら、さっきのハンズオン①をそのまま再実行すればOK🙆♂️ (このProvisionerは“ローカルストレージを簡単に使う”ための仕組みだよ) (GitHub)
7) minikubeの補足メモ(動きが分かると気持ちいい😆)
minikube は hostPath 系PVを扱えて、永続化されるディレクトリの例も案内されてるよ📁
また、よりマルチノード向きのアドオン(CSI hostpath driver)にも触れてる🧩 (minikube)
8) AI(Copilot/Codex)に手伝わせるおすすめプロンプト🤖✨
- 「このPVCがPendingなんだけど、
kubectl describe pvcの出力から原因候補を3つ、優先度順で出して」🔎 - 「このStorageClassの
volumeBindingModeって何?“初心者向けのたとえ”で説明して」🧠 - 「Deploymentでレプリカ増やしたらRWOで詰まりそう?どう設計すると安全?」🧯
9) まとめ🎉
- PV=実体🅿️ / PVC=要求🎫 / StorageClass=自動生成テンプレ🏗️ (Kubernetes)
- Dynamic Provisioning があると「PVC作るだけ」でだいぶラク😇 (Kubernetes)
- マルチノードになるほど
WaitForFirstConsumerが効いてくる🧭 (Kubernetes) - 次章のStatefulSetで「DBらしさ🗃️」を出すために、ここは絶対押さえる価値アリ💪
次(第20章)では、この永続化を“DB運用っぽく”進化させて StatefulSet に入るよ〜!🧱🗃️✨