Chuyển đến nội dung chính

第8課:Persistent Volumes、PVCs & StorageClass

PV/PVC 生命週期、存取模式、回收政策。StorageClass 動態佈建。 CKA 考試中的儲存問題。

PersistentVolume、PVC 與 StorageClass 的關係

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. 存取模式

模式縮寫說明
ReadWriteOnceRWO只允許一個節點讀寫掛載
ReadOnlyManyROX多個節點只讀掛載
ReadWriteManyRWX多個節點讀寫掛載
ReadWriteOncePodRWOP只允許一個 Pod 讀寫掛載(K8s 1.27+)

3. 回收政策

政策PVC 刪除後的行為
RetainPV 保留資料,狀態變為 Released(需手動清理)
DeletePV 和底層儲存都被刪除
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. 速查表

任務指令
建立 PVkubectl apply -f pv.yaml
建立 PVCkubectl apply -f pvc.yaml
檢查 PV/PVC 狀態kubectl get pv,pvc
查看 StorageClasskubectl get storageclass
PVC 為何 Pendingkubectl 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(如雲端磁碟)非常重要。