本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.23:防止在亂序刪除時出現 PersistentVolume 洩漏

PersistentVolume(簡稱 PV)與回收策略相關聯。回收策略用於確定儲存後端在刪除 PV 時需要採取的操作。當回收策略為 Delete 時,預期儲存後端會釋放為 PV 分配的儲存資源。實質上,回收策略需要在 PV 刪除時得到遵守。

透過最近釋出的 Kubernetes v1.23,一個 Alpha 功能允許您配置叢集以這種方式執行並遵守配置的回收策略。

在以前的 Kubernetes 版本中,回收是如何工作的?

PersistentVolumeClaim(簡稱 PVC)是使用者對儲存的請求。如果建立了新的 PV 或找到了匹配的 PV,則 PV 和 PVC 被視為繫結。PV 本身由儲存後端分配的卷支援。

通常,如果要刪除卷,則預期是刪除繫結 PV-PVC 對的 PVC。但是,在刪除 PVC 之前刪除 PV 沒有限制。

首先,我將演示執行舊版本 Kubernetes 的叢集的行為。

檢索繫結到 PV 的 PVC

檢索現有的 PVC example-vanilla-block-pvc

kubectl get pvc example-vanilla-block-pvc

以下輸出顯示了 PVC 及其“已繫結”PV,PV 顯示在“VOLUME”列下

NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
example-vanilla-block-pvc   Bound    pvc-6791fdd4-5fad-438e-a7fb-16410363e3da   5Gi        RWO            example-vanilla-block-sc   19s

刪除 PV

當我嘗試刪除繫結的 PV 時,叢集會阻塞,並且 kubectl 工具不會將控制權返回給 Shell;例如

kubectl delete pv pvc-6791fdd4-5fad-438e-a7fb-16410363e3da
persistentvolume "pvc-6791fdd4-5fad-438e-a7fb-16410363e3da" deleted
^C

檢索 PV

kubectl get pv pvc-6791fdd4-5fad-438e-a7fb-16410363e3da

可以觀察到 PV 處於 Terminating 狀態

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                               STORAGECLASS               REASON   AGE
pvc-6791fdd4-5fad-438e-a7fb-16410363e3da   5Gi        RWO            Delete           Terminating   default/example-vanilla-block-pvc   example-vanilla-block-sc            2m23s

刪除 PVC

kubectl delete pvc example-vanilla-block-pvc

如果 PVC 成功刪除,則會看到以下輸出

persistentvolumeclaim "example-vanilla-block-pvc" deleted

叢集中的 PV 物件也被刪除。嘗試檢索 PV 時,會發現 PV 不再存在

kubectl get pv pvc-6791fdd4-5fad-438e-a7fb-16410363e3da
Error from server (NotFound): persistentvolumes "pvc-6791fdd4-5fad-438e-a7fb-16410363e3da" not found

儘管 PV 已刪除,但底層儲存資源未刪除,需要手動移除。

總而言之,與 Persistent Volume 關聯的回收策略在某些情況下會被忽略。對於 Bound PV-PVC 對,PV-PVC 刪除的順序決定了是否遵守 PV 回收策略。如果 PVC 首先刪除,則回收策略會得到遵守;但是,如果在刪除 PVC 之前刪除 PV,則不執行回收策略。由於這種行為,外部基礎設施中關聯的儲存資產不會被移除。

Kubernetes v1.23 中的 PV 回收策略

新行為確保當用戶手動刪除 PV 時,底層儲存物件會從後端刪除。

如何啟用新行為?

要使用新行為,您必須已將叢集升級到 Kubernetes 的 v1.23 版本。您需要確保正在執行 CSI external-provisioner 版本 4.0.0 或更高版本。您還必須為 external-provisionerkube-controller-manager 啟用 HonorPVReclaimPolicy 功能門控

如果您不使用 CSI 驅動程式與儲存後端整合,則此修復不可用。Kubernetes 專案目前沒有計劃修復樹記憶體儲驅動程式的錯誤:這些樹內驅動程式的未來是棄用並遷移到 CSI。

它是如何工作的?

新行為是透過在新的和現有 PV 上新增終結器 external-provisioner.volume.kubernetes.io/finalizer 來實現的,該終結器僅在後端儲存被刪除後才移除。

一個帶有終結器的 PV 示例,注意終結器列表中的新終結器

kubectl get pv pvc-a7b7e3ba-f837-45ba-b243-dec7d8aaed53 -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: csi.vsphere.vmware.com
  creationTimestamp: "2021-11-17T19:28:56Z"
  finalizers:
  - kubernetes.io/pv-protection
  - external-provisioner.volume.kubernetes.io/finalizer
  name: pvc-a7b7e3ba-f837-45ba-b243-dec7d8aaed53
  resourceVersion: "194711"
  uid: 087f14f2-4157-4e95-8a70-8294b039d30e
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: example-vanilla-block-pvc
    namespace: default
    resourceVersion: "194677"
    uid: a7b7e3ba-f837-45ba-b243-dec7d8aaed53
  csi:
    driver: csi.vsphere.vmware.com
    fsType: ext4
    volumeAttributes:
      storage.kubernetes.io/csiProvisionerIdentity: 1637110610497-8081-csi.vsphere.vmware.com
      type: vSphere CNS Block Volume
    volumeHandle: 2dacf297-803f-4ccc-afc7-3d3c3f02051e
  persistentVolumeReclaimPolicy: Delete
  storageClassName: example-vanilla-block-sc
  volumeMode: Filesystem
status:
  phase: Bound

終結器的存在會阻止 PV 物件從叢集中移除。如前所述,終結器僅在 PV 物件成功從儲存後端刪除後才從 PV 物件中移除。要了解有關終結器的更多資訊,請參閱使用終結器控制刪除

CSI 遷移的卷呢?

此修復也適用於 CSI 遷移的卷。但是,當在 1.23 上啟用 HonorPVReclaimPolicy 功能且停用 CSI 遷移時,如果 PV 物件存在終結器,則會將其移除。

一些注意事項

  1. 此修復僅適用於 CSI 卷和已遷移的卷。樹內卷將表現出舊行為。
  2. 此修復作為 Alpha 功能引入到 external-provisioner 中,位於功能門控 HonorPVReclaimPolicy 下。此功能預設停用,需要顯式啟用。

參考資料

我如何參與?

Kubernetes Slack 頻道 SIG Storage 通訊渠道是聯絡 SIG Storage 和遷移工作組團隊的絕佳媒介。

特別感謝以下人員的深刻見解、周詳考慮和寶貴貢獻

  • Jan Šafránek (jsafrane)
  • Xing Yang (xing-yang)
  • Matthew Wong (wongma7)

有興趣參與 CSI 或 Kubernetes 儲存系統任何部分設計和開發的人士,請加入 Kubernetes 儲存特別興趣小組 (SIG)。我們正在快速成長,並始終歡迎新的貢獻者。