iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
Cloud Native

駕馭商用容器叢集,汪洋漂流術系列 第 22

【Day 22】 使用 PV 和 PVC 保存永久資料

  • 分享至 

  • xImage
  •  

前言

前面提到,要使用容器作為服務的基礎設施,必須考慮資料儲存的形式。 常見的就是寫資料庫,或是存在 永久儲存中 (永久的相對是揮發性儲存,像是記憶體或是容器本身)。 而 PV (PersistentVolume) 和 PVC (PersistentVolumeClaim) 常常一起出現,以下將對比兩者間的差異,以及如何使用。

1. 在 Worker Node 掛載儲存資源

從安裝硬碟在 Worker Node 之後,還有些設定要進行,才能使用

  1. 查看叢集中節點 oc get no
  2. 連到該節點上 oc debug node/某worker-node名稱
    • 這會啟用一個臨時的 Pod 來當作偵錯環境使用
    • 提示文字會告訴你如果要使用宿主主機上的命令,要用 chroot /host
  3. 在該節點上 chroot /host 後, lsblk 確認新掛載的儲存設備有出現

2. 將實體儲存資源抽象化 / 建立 PV

就是在叢集中,建立 PV。 讓叢集取用。

建立 PV 設定

  • 指定容量 (capacity):可用的大小,例如 10Gi
  • 存取模式 (accessModes):
    • ReadWriteOnce (RWO) → 單 Node 可讀寫
    • ReadOnlyMany (ROX) → 多 Node 可讀
    • ReadWriteMany (RWX) → 多 Node 可讀寫
  • 儲存來源 (storage backend):
    • 本地目錄 (Local Path)
    • NFS
    • iSCSI
    • Ceph RBD / CephFS
    • 雲端磁碟(AWS EBS、GCP PD、Azure Disk)
  • 回收策略 (reclaimPolicy):PVC 釋放後 PV 的命運
    • Retain → 保留資料,管理員手動處理
    • Recycle → 清空再利用(K8s 新版不建議)
    • Delete → 直接刪除底層磁碟(常用於雲端動態配置)

建立 NFS PV 的範例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /exports/data
    server: 192.168.1.100

建立 本地磁碟 PV 的範例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-local
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  persistentVolumeReclaimPolicy: Retain
  local:
    path: /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-1

3. 使用者向叢集取用儲存資源 / 建立 PVC

  • 開發者撰寫下列配置,或者利用 OCP console 在網頁介面上按按按。

建立 PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: myproject
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: local-storage

Deployment / Pod 掛載 PVC

  • 需要再 spec.volumes 中加入 pvc ,如下面範例:
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pvc
  namespace: demo
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html   # 容器內目錄
      name: nginx-storage
  volumes:
  - name: nginx-storage
    persistentVolumeClaim:
      claimName: mypvc   # 指向剛建立的 PVC

  • 最後要驗證的話,可以用 oc rsh -n <所在命名空間> <pod名稱> 連入 Pod 後,用 df -h 查看儲存。

比較表

  • PersistentVolume 字面上意思就是 「永久儲存」,以下簡稱 PV
    • PersistentVolumeClaim 字面上意思就是 「永久儲存的宣告」,以下簡稱 PVC
  • 兩者主要被設計出來的差異,在於 PV 通常都是叢集管理者建立出來,可以在整座叢集中流通; PVC 則通常由開發者向叢集要儲存資源,並且只能在相同 namespace 中流通。
項目 PV (PersistentVolume) PVC (PersistentVolumeClaim)
角色 叢集管理員提供的儲存資源 使用者向叢集申請的儲存需求
建立者 系統管理員手動建立,或由 StorageClass 動態建立 開發者 / 使用者在 Pod/Deployment 中宣告
範疇 Cluster-level(全叢集可用) Namespace-level(限該命名空間使用)
生命週期 與實際儲存資源綁定(NFS、EBS、Ceph …) 與 Pod 相關,PVC 綁定後可重複使用
容量 PV 宣告可提供的大小(ex: 10Gi) PVC 申請需要的大小(ex: 1Gi)
存取模式 定義存取方式(ReadWriteOnce, ReadOnlyMany, ReadWriteMany) 申請時需符合 PV 的模式
綁定方式 被 PVC 消費(Bound)後即被佔用 綁定到某個 PV 後才算可用
刪除影響 刪除 PV → 可能會釋放或保留底層資料(依 ReclaimPolicy) 刪除 PVC → 是否刪底層資料取決於 PV 的 ReclaimPolicy
ReclaimPolicy Retain(保留資料)、Recycle(清空再利用)、Delete(直接刪除) 不直接控制,受 PV 的策略影響

結論

  • 針對各種形態的儲存設備,有各自的特性。 在速度,價格,容錯,聯網能力等,進行取捨。
  • PVC 的三種存取模式,如下表呈現。
    • RWO 就是模擬成裝載機器上的儲存設備,允許單一寫入單一讀取。
    • ROX 是為了避免資料不同步,所以單一節點可寫入,但是多個節點可同時掛載讀取。
    • RWX 都是網路儲存,大家可以同時讀寫這個網路磁帶。
AccessMode 縮寫 說明 適用場景
ReadWriteOnce RWO 允許單一 Node 掛載,且可讀寫 最常見,像 AWS EBS、Azure Disk、GCP PD 都是這種模式
ReadOnlyMany ROX 允許多個 Node 掛載,但只能讀取 多 Pod 共用資料但不需要寫入
ReadWriteMany RWX 允許多個 Node 同時掛載且可讀寫 NFS、CephFS、GlusterFS、ODF CephFS

上一篇
【Day 21】 認識叢集的四大監控與觀測工具
下一篇
【Day 23】 管理叢集流量 - NetworkPolicy / EgressFirewall / EgressIP
系列文
駕馭商用容器叢集,汪洋漂流術26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言