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

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 及其 Bound 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 上新增 finalizer external-provisioner.volume.kubernetes.io/finalizer 來實現的,finalizer 僅在從後端刪除儲存空間後才會移除。

具有 finalizer 的 PV 範例,請注意 finalizers 列表中的新 finalizer

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

finalizer 的存在可防止 PV 物件從叢集中移除。如先前所述,finalizer 僅在從儲存後端成功刪除 PV 物件後才會從 PV 物件中移除。若要深入了解 finalizers,請參閱使用 Finalizers 控制刪除

CSI 遷移磁碟區呢?

此修復程式也適用於 CSI 遷移磁碟區。但是,當在 1.23 上啟用功能 HonorPVReclaimPolicy 且停用 CSI 遷移時,如果 finalizer 存在,則會從 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 Storage 系統任何部分的人員,請加入Kubernetes Storage 特殊興趣小組 (SIG)。我們正在快速成長,並且隨時歡迎新的貢獻者。