前面提到,要使用容器作為服務的基礎設施,必須考慮資料儲存的形式。 常見的就是寫資料庫,或是存在 永久儲存中 (永久的相對是揮發性儲存,像是記憶體或是容器本身)。 而 PV (PersistentVolume) 和 PVC (PersistentVolumeClaim) 常常一起出現,以下將對比兩者間的差異,以及如何使用。
從安裝硬碟在 Worker Node 之後,還有些設定要進行,才能使用
oc get no
oc debug node/某worker-node名稱
chroot /host
chroot /host
後, lsblk
確認新掛載的儲存設備有出現就是在叢集中,建立 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
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
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: myproject
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: local-storage
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
查看儲存。項目 | 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 的策略影響 |
AccessMode | 縮寫 | 說明 | 適用場景 |
---|---|---|---|
ReadWriteOnce | RWO | 允許單一 Node 掛載,且可讀寫 | 最常見,像 AWS EBS、Azure Disk、GCP PD 都是這種模式 |
ReadOnlyMany | ROX | 允許多個 Node 掛載,但只能讀取 | 多 Pod 共用資料但不需要寫入 |
ReadWriteMany | RWX | 允許多個 Node 同時掛載且可讀寫 | NFS、CephFS、GlusterFS、ODF CephFS |