PV 與 PVC 狀態遷移

misakivv發表於2024-08-14

目錄
  • 一、概述
    • 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 狀態遷移圖
    • 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

image-20240813144053580

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

image-20240813144840356

3、等待繫結

PVC --- Bound (已繫結):當 PVC 成功與 PV 匹配並繫結時,PVC 的狀態變為 Bound。這意味著 PVC 已經準備好被 Pod 使用。

PV --- Bound(已繫結): 表示 PV 已經被 PVC 繫結

kubectl get pv task-pv
kubectl get pvc task-pvc

image-20240813145424026

4、刪除 PV

當我們嘗試刪除正在繫結的 PV 時會發現 delete 操作會一直卡住

因為 Kubernetes 試圖保持 PV 和 PVC 之間的繫結關係,直到 PVC 被刪除或者 PV 的狀態被顯式地更改

kubectl delete pv task-pv

image-20240813150657114

4.1、檢視 PV,PVC 狀態

PV 沒有被真正刪除時,PV 處於 Terminating 狀態,對 PVC 無影響 還是 Bound 狀態

kubectl get pvc task-pvc
kubectl get pv task-pv

image-20240813151335163

4.2、真正刪除 PV

想要真正刪除 PV 需要修改 PV 中的 Finalizer 屬性強制刪除

kubectl edit pv task-pv
註釋掉 finalizers: 及其值
image-20240813152308596

4.3、檢視PV PVC 狀態

當編輯 PV 並刪除 PV 中的 Finalizer 屬性強制刪除 PV 時 PVC 會變為 Lost 狀態

kubectl get pvc task-pvc
kubectl get pv task-pv

image-20240813152554408

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

image-20240813153936058

6、刪除 PVC

這個時候的 PV 狀態由自己定義的 persistentVolumeReclaimPolicy欄位來決定

6.1、persistentVolumeReclaimPolicy: Retain 時刪除 PVC 檢視 PV 狀態

persistentVolumeReclaimPolicy: Retain 時刪除 PVC 與其繫結的 PV 處於Released 狀態

image-20240813160158969

kubectl delete pvc task-pvc

kubectl get pv task-pv

image-20240813154855214

6.2、persistentVolumeReclaimPolicy: Delete 時刪除 PVC 檢視 PV 狀態

persistentVolumeReclaimPolicy: Delete 時刪除 PVC 與其繫結的 PV 處於 Failed 狀態(清理失敗)

image-20240813162911550

kubectl get pv

image-20240813162712773

6.3、persistentVolumeReclaimPolicy: Recycle 時刪除 PVC 檢視 PV 狀態

persistentVolumeReclaimPolicy: Recycle 時刪除 PVC 與其繫結的 PV 處於 Failed 狀態(清理失敗)

image-20240813163024825

kubectl get pv

image-20240813163206818

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

image-20240813164406341

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

image-20240813165501372

7.3、重建之前的 PVC 進行繫結

會發現叢集中的 PV 與 PVC 立即進行了繫結都變為 Bound 狀態

kubectl apply -f task-pvc.yaml

kubectl get pvc,pv

image-20240813165809504

四、狀態遷移圖

1、PV 狀態遷移圖

image-20240814001106256

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 狀態遷移圖

image-20240813232801201

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 狀態

相關文章