Persistent Volumes
PersistentVolume 爲用戶和管理員提供了一組 API, 將存儲如何控制的細節從其如何被使用中抽象出來。
爲此,k8s 引入了兩個新的 API 資源,PersistentVolume 和 PersistentVolumeClaim
PersistentVolume
無 Namespace 隔離
PersistentVolume(PV) 是集羣中的一塊存儲,可以由管理員事先創建,配置。擁有獨立於任何使用 PV 的 Pod 的生命週期,抽象了存儲細節,PV 可能由NFS、iSCSI 或者特定於雲平臺的存儲系統組成。
PersistentVolumeClaim
Namespace 隔離
PersistentVolumeClaim(PVC) 表達是用戶對存儲的請求, PVC 也可以請求特定的大小和訪問模式的 PV 資源(要求 PV 卷能夠以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一來掛載)。
NFS 類型的 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
回收策略
persistentVolumeReclaimPolicy
- Retain 保留 PV 內容
- Recycle 回收,Pod 刪除之後會回收PV,清除 PV 的內容,目前只有 NFS 和 HostPath 支持
- Delete 刪除 PVC 後,綁定的 PV 會被刪除(PV需要支持,動態存儲默認方式)
PV 狀態
- Available:空閒的PV,沒有被任何PVC綁定。
- Bound:已經被PVC綁定
- Released:PVC被刪除,但是資源未被重新使用
- Failed:自動回收失敗。
PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
- resources 不能比需要綁定的 PV 大
- storageClassName 需要與 PV 相同
- accessModes 需要與 PV 相同
- selector 篩選 PV 標籤
POD 使用 PVC
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
常見問題
-
創建 PVC 之後,一直綁定不上 PV(Pending):
- PVC 的空間申請大小大於 PV 的大小
- PVC 的 storageClassName 沒有和 PV 的一致
- PVC 的 accessModes 和 PV 的不一致
-
創建掛載了 PVC 的 Pod 之後,一直處於 Pending 狀態:
- PVC 沒有被創建成功,或者被創建
- PVC 和 Pod 不在同一個 Namespace
-
刪除 PVC 後 K8S 會創建一個用於回收的 Pod 根據 PV 的回收策略進行PV 的回收。 回收完以後 PV 的狀態就會變成可被綁定的狀態,也就是空閒狀態。 其他的 Pending 狀態的 PVC 如果匹配到了這個 PV,就能和這個 PV 進行綁定。