1. PV / PVC 生命週期
管理員建立 PV ──────► PVC 請求綁定 ──────► Pod 掛載 PVC
│ │ │
Available ──► Bound ──► Released / Reclaim
│
Retain / Delete / Recycle
# PersistentVolume(管理員建立)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-data
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data/pv-data
---
# PersistentVolumeClaim(使用者建立)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # ≤ PV 的 10Gi → 可以綁定
2. 存取模式
| 模式 | 縮寫 | 說明 |
|---|---|---|
| ReadWriteOnce | RWO | 只允許一個節點讀寫掛載 |
| ReadOnlyMany | ROX | 多個節點只讀掛載 |
| ReadWriteMany | RWX | 多個節點讀寫掛載 |
| ReadWriteOncePod | RWOP | 只允許一個 Pod 讀寫掛載(K8s 1.27+) |
3. 回收政策
| 政策 | PVC 刪除後的行為 |
|---|---|
| Retain | PV 保留資料,狀態變為 Released(需手動清理) |
| Delete | PV 和底層儲存都被刪除 |
| Recycle(已棄用) | 清除資料(rm -rf /volume/*) |
4. StorageClass — 動態佈建
# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer # 等到 Pod 排程後才建立 PV
---
# PVC 使用 StorageClass(不需要手動建立 PV)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
storageClassName: fast-ssd # 參照 StorageClass
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
考試重點:PVC 維持 Pending 的常見原因:(1) 沒有符合大小/存取模式的 PV、(2) StorageClass 設定錯誤或 provisioner 不存在、(3) volumeBindingMode: WaitForFirstConsumer 時還沒有 Pod 參照 PVC。
5. Pod 掛載 PVC
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-data
6. 速查表
| 任務 | 指令 |
|---|---|
| 建立 PV | kubectl apply -f pv.yaml |
| 建立 PVC | kubectl apply -f pvc.yaml |
| 檢查 PV/PVC 狀態 | kubectl get pv,pvc |
| 查看 StorageClass | kubectl get storageclass |
| PVC 為何 Pending | kubectl describe pvc NAME(看 Events) |
7. 練習題
Q1:PVC 建立後狀態一直是 Pending。可能的原因是?
- A) 沒有符合容量和存取模式的 PV ✓
- B) Pod 還沒啟動
- C) 該 PVC 的 Namespace 不正確
- D) kubelet 還沒準備好
解析:PVC 的 Pending 狀態通常表示沒有可綁定的 PV。檢查 PV 的 capacity 和 accessModes 是否與 PVC 的請求匹配。如果使用 StorageClass 且 provisioner 正常,PV 應該會自動建立。
Q2:persistentVolumeReclaimPolicy: Retain 的 PV,PVC 被刪除後會發生什麼?
- A) PV 和資料都被刪除
- B) PV 保留,狀態變為 Released,資料保留但無法被新 PVC 自動綁定 ✓
- C) PV 回到 Available 狀態
- D) PV 被回收並清空
解析:Retain 政策保留 PV 和資料。但狀態是 Released,不能自動綁定新 PVC。管理員需要手動刪除 PV(保留底層儲存),或修改 PV 移除 claimRef 使其變回 Available。
Q3:volumeBindingMode: WaitForFirstConsumer 有什麼效果?
- A) PVC 會立即綁定到 PV
- B) 等到使用該 PVC 的 Pod 被排程後,才在 Pod 所在節點的可用區佈建 PV ✓
- C) PVC 需要手動批准
- D) 只有第一個使用者可以建立 PVC
解析:WaitForFirstConsumer 延遲 PV 綁定,直到 Pod 被排程到特定節點。這確保 PV 在 Pod 所在的可用區建立,避免跨可用區的儲存問題。對於拓撲相關的 provisioner(如雲端磁碟)非常重要。