- 一、概述
- 1、PV
- 2、PVC
- 二、狀態變化
- 三、例項
- 1、單獨建立 PV
- 1.1、建立並應用 PV
- 1.2、檢視剛建立的 PV 狀態
- 2、單獨建立 PVC
- 2.1、建立並應用 PV
- 2.2、檢視剛建立的 PVC 狀態
- 3、等待繫結
- 4、刪除 PV
- 4.1、檢視 PV,PVC 狀態
- 4.2、真正刪除 PV
- 4.3、檢視PV PVC 狀態
- 5、重新建立 PV
- 5.1、重新建立之前與 PVC 繫結的 PV
- 6、刪除 PVC
- 6.1、persistentVolumeReclaimPolicy: Retain 時刪除 PVC 檢視 PV 狀態
- 6.2、persistentVolumeReclaimPolicy: Delete 時刪除 PVC 檢視 PV 狀態
- 6.3、persistentVolumeReclaimPolicy: Recycle 時刪除 PVC 檢視 PV 狀態
- 7、手動刪除 PVC 引用
- 7.1、檢視 PV 的 claimRef 屬性
- 7.2、刪除 claimRef 對 PVC 的引用
- 7.3、重建之前的 PVC 進行繫結
- 1、單獨建立 PV
- 四、狀態遷移圖
- 1、PV 狀態遷移圖
- 2、PVC 狀態遷移圖
一、概述
1、PV
定義:叢集級別的資源。是叢集中的一塊儲存,可以由管理員事先製備, 或者使用儲存類(Storage Class)來動態製備。 持久卷是叢集資源,就像節點也是叢集資源一樣。與節點相繫結。PV 持久卷和普通的 Volume 一樣, 也是使用卷外掛來實現的,只是它們擁有獨立於任何使用 PV 的 Pod 的生命週期。 此 API 物件中記述了儲存的實現細節,無論其背後是 NFS、iSCSI 還是特定於雲平臺的儲存系統。
用途:PV 為應用提供持久化的儲存空間,即使 Pod 被銷燬或重新建立,資料仍然保留。
2、PVC
定義:名稱空間(namespace)級別的資源。PVC 是使用者對儲存的請求。概念上與 Pod 類似。 Pod 會耗用節點資源,而 PVC 申領會耗用 PV 資源。 PVC 申領會請求特定的大小和訪問模式
用途:PVC 允許使用者請求特定大小和特性的儲存空間,Kubernetes 自動將合適的 PV 與 PVC 匹配起來。
二、狀態變化
操作 | PV 狀態 | PVC 狀態 |
---|---|---|
建立 PV (單獨) | Available | --- |
建立 PVC (單獨) | --- | Pending |
等待繫結 | Bound | Bound |
刪除 PV(delete命令 --> 真正刪除) | Bound --> Terminating --> --- | Bound --> Lost |
重新建立 PV | Available --> Bound | Lost --> Bound |
刪除 PVC | Released(Retain)/ Failed(Delete/Recycle)清理失敗 | --- |
刪除 PV 的 claimRef | Released(Retain)--> Available | --- |
重建 PVC | Available --> Bound | Bound |
三、例項
1、單獨建立 PV
1.1、建立並應用 PV
kubectl apply -f task-pv.yaml
cat << EOF > task-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
local:
path: /mnt/data/my-pv
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node1
EOF
1.2、檢視剛建立的 PV 狀態
Available(可用): 表示可用狀態,PV 剛被建立出來還未被任何 PVC 繫結
kubectl get pv task-pv
2、單獨建立 PVC
2.1、建立並應用 PV
kubectl apply -f task-pvc.yaml
cat << EOF > task-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: manual
EOF
2.2、檢視剛建立的 PVC 狀態
Pending (待定):當 PVC 被建立時,它會處於 Pending 狀態,等待與合適的 PV 匹配。
kubectl get pvc task-pvc
3、等待繫結
PVC --- Bound (已繫結):當 PVC 成功與 PV 匹配並繫結時,PVC 的狀態變為 Bound。這意味著 PVC 已經準備好被 Pod 使用。
PV --- Bound(已繫結): 表示 PV 已經被 PVC 繫結
kubectl get pv task-pv
kubectl get pvc task-pvc
4、刪除 PV
當我們嘗試刪除正在繫結的 PV 時會發現 delete 操作會一直卡住
因為 Kubernetes 試圖保持 PV 和 PVC 之間的繫結關係,直到 PVC 被刪除或者 PV 的狀態被顯式地更改
kubectl delete pv task-pv
4.1、檢視 PV,PVC 狀態
PV 沒有被真正刪除時,PV 處於 Terminating 狀態,對 PVC 無影響 還是 Bound 狀態
kubectl get pvc task-pvc
kubectl get pv task-pv
4.2、真正刪除 PV
想要真正刪除 PV 需要修改 PV 中的 Finalizer 屬性強制刪除
kubectl edit pv task-pv
註釋掉 finalizers: 及其值 |
---|
4.3、檢視PV PVC 狀態
當編輯 PV 並刪除 PV 中的 Finalizer 屬性強制刪除 PV 時 PVC 會變為 Lost 狀態
kubectl get pvc task-pvc
kubectl get pv task-pv
5、重新建立 PV
5.1、重新建立之前與 PVC 繫結的 PV
PV 由 剛建立的 Available --> Bound 繫結狀態
PVC 由之前的 Lost 狀態 --> Bound 繫結狀態
過一會,會發現 PVC 和 PV 都變為 Bound 狀態
kubectl apply -f task-pv.yaml
kubectl get pv task-pv
kubectl get pvc task-pvc
6、刪除 PVC
這個時候的 PV 狀態由自己定義的 persistentVolumeReclaimPolicy
欄位來決定
6.1、persistentVolumeReclaimPolicy: Retain 時刪除 PVC 檢視 PV 狀態
persistentVolumeReclaimPolicy: Retain
時刪除 PVC 與其繫結的 PV 處於Released 狀態
kubectl delete pvc task-pvc
kubectl get pv task-pv
6.2、persistentVolumeReclaimPolicy: Delete 時刪除 PVC 檢視 PV 狀態
persistentVolumeReclaimPolicy: Delete
時刪除 PVC 與其繫結的 PV 處於 Failed 狀態(清理失敗)
kubectl get pv
6.3、persistentVolumeReclaimPolicy: Recycle 時刪除 PVC 檢視 PV 狀態
persistentVolumeReclaimPolicy: Recycle
時刪除 PVC 與其繫結的 PV 處於 Failed 狀態(清理失敗)
kubectl get pv
7、手動刪除 PVC 引用
7.1、檢視 PV 的 claimRef 屬性
透過檢視 PV 的 claimRef 屬性,會發現其中還保留著 PVC 的繫結資訊
kubectl get pv task-pv -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"task-pv"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"1Gi"},"local":{"path":"/mnt/data/my-pv"},"nodeAffinity":{"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["k8s-node1"]}]}]}},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"manual"}}
pv.kubernetes.io/bound-by-controller: "yes"
creationTimestamp: "2024-08-13T08:38:42Z"
finalizers:
- kubernetes.io/pv-protection
name: task-pv
resourceVersion: "98232"
uid: 74442248-2aea-436d-9e66-45af7b36405a
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: task-pvc
namespace: default
resourceVersion: "98206"
uid: e0cb8efc-68a5-4044-8b63-9c633eeb4e6f
local:
path: /mnt/data/my-pv
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node1
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
volumeMode: Filesystem
status:
phase: Released
7.2、刪除 claimRef 對 PVC 的引用
由於PVC只能和Available的狀態的PV進行繫結。刪除 claimRef 對 PVC 的引用,這個時候 Kubernetes 的 PV Controller watch 到 PV 變化後,就會將 PV 修改為 Available 狀態,Available 狀態的 PV 就可以被其他 PVC 繫結了。
刪除 claimRef 部分
PV 會從 Released 狀態變為 Available 狀態
kind: PersistentVolume
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"task-pv"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"1Gi"},"local":{"path":"/mnt/data/my-pv"},"node
Affinity":{"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["k8s-node1"]}]}]}},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"manu
al"}}
pv.kubernetes.io/bound-by-controller: "yes"
creationTimestamp: "2024-08-13T08:52:58Z"
finalizers:
- kubernetes.io/pv-protection
name: task-pv
resourceVersion: "99447"
uid: f89d6765-88fb-4b33-8dc1-157f25c7d798
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
local:
path: /mnt/data/my-pv
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node1
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
volumeMode: Filesystem
status:
phase: Released
7.3、重建之前的 PVC 進行繫結
會發現叢集中的 PV 與 PVC 立即進行了繫結都變為 Bound 狀態
kubectl apply -f task-pvc.yaml
kubectl get pvc,pv
四、狀態遷移圖
1、PV 狀態遷移圖
1、建立好一個 PV 後 PV 就處於一個 Available 狀態,當一個 PV 與 一個 PVC 繫結的時候,這個 PV 就會進入 Bound 狀態
2、一個處於 Bound 狀態且回收策略時 Retain 的 PV ,其關聯的 PVC 刪除後,變為 Released ;回收策略為 Recycle/Delete 時清理失敗會變為 Failed 狀態
3、當刪除 PV 的 claimRef (對 PVC 的引用)時,PV 由 Released 變為 Available
4、當 Recycle 失敗時狀態變為 Failed
5、透過手動刪除 PVC 資訊,狀態由 Failed 變為 Available
2、PVC 狀態遷移圖
1、當 PVC 被建立時會短暫處於 Pending 狀態等待叢集中由匹配的 PV 與其繫結。當一個 Pending 的 PVC 成功與 PV 繫結時 PVC 的狀態變為 Bound
2、當刪除 PV 時分兩種情況:第一種沒有刪除 PV 中的 Finalizer 屬性時 PV 不會被刪除 PVC 仍處於 Bound 狀態;第二種刪除了 PV 中的 Finalizer 屬性時 PV 被強制刪除導致 PVC 由 Bound 狀態變為 Lost 狀態
3、處於 Lost 狀態的 PVC 再次與一個 PV 繫結後變為 Bound 狀態