本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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-provisioner
和 kube-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 物件中移除。
一些注意事項
- 此修復程式僅適用於 CSI 磁碟區和遷移磁碟區。樹狀結構內磁碟區將展現較舊的行為。
- 此修復程式作為 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)。我們正在快速成長,並且隨時歡迎新的貢獻者。