Kubernetes v1.33:防止在乱序删除时出现 PersistentVolume 泄漏的功能进阶至 GA

我很高兴地宣布,在 Kubernetes v1.33 中,防止乱序删除时 PersistentVolume(简称 PV)泄露的功能已进阶至正式发布(GA)!这项改进最初在 Kubernetes v1.31 中作为 Beta 功能引入,旨在确保您的存储资源被正确回收,防止不必要的泄露。

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

PersistentVolumeClaim(简称 PVC)是用户对存储的请求。如果一个新创建的 PV 或一个匹配的 PV 被找到,那么这个 PV 和 PVC 就被视为已绑定(Bound)。PV 本身由存储后端分配的卷提供支持。

通常情况下,如果要删除一个卷,期望的操作是先删除已绑定的 PV-PVC 对中的 PVC。然而,并没有限制在删除 PVC 之前删除 PV。

对于一个状态为 Bound 的 PV-PVC 对,PV-PVC 的删除顺序决定了 PV 的回收策略是否被遵守。如果 PVC 先被删除,回收策略会得到遵守;然而,如果 PV 在 PVC 之前被删除,回收策略就不会被执行。这种行为的后果是,外部基础设施中关联的存储资产不会被移除。

Kubernetes v1.33 中的 PV 回收策略

随着在 Kubernetes v1.33 中进阶至 GA,这个问题现已得到解决。现在,即使 PV 在其绑定的 PVC 之前被删除,Kubernetes 也能可靠地遵守所配置的 Delete 回收策略。这是通过使用 Finalizer 实现的,确保存储后端按预期释放已分配的存储资源。

它是如何工作的?

对于 CSI 卷,这一新行为是通过在新旧 PV 上添加一个 Finalizer external-provisioner.volume.kubernetes.io/finalizer 来实现的。只有在后端的存储被删除后,这个 Finalizer 才会从 PV 中移除。Finalizer 的添加或移除由 external-provisioner ` 处理。

一个带有终结器的 PV 示例,注意终结器列表中的新终结器

kubectl get pv pvc-a7b7e3ba-f837-45ba-b243-dec7d8aaed53 -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: csi.example.driver.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.example.driver.com
    fsType: ext4
    volumeAttributes:
      storage.kubernetes.io/csiProvisionerIdentity: 1637110610497-8081-csi.example.driver.com
      type: CNS Block Volume
    volumeHandle: 2dacf297-803f-4ccc-afc7-3d3c3f02051e
  persistentVolumeReclaimPolicy: Delete
  storageClassName: example-vanilla-block-sc
  volumeMode: Filesystem
status:
  phase: Bound

Finalizer 会阻止这个 PersistentVolume 从集群中被移除。如前所述,只有在 PV 成功地从存储后端删除后,Finalizer 才会从 PV 对象中移除。要了解更多关于 Finalizer 的信息,请参阅使用 Finalizer 控制删除

同样,Finalizer kubernetes.io/pv-controller 会被添加到动态供应的树内(in-tree)插件卷中。

重要提示

此修复不适用于静态供应的树内插件卷。

如何启用新行为?

要利用这一新行为,您必须将集群升级到 Kubernetes v1.33 版本,并运行 CSI external-provisioner5.0.1 或更高版本。该功能在 Kubernetes v1.31 版本中作为 Beta 发布,当时是默认启用的。

参考资料

我如何参与?

Kubernetes Slack 频道 SIG Storage 通信渠道是联系 SIG Storage 和迁移工作组团队的绝佳媒介。

特别感谢以下人员的深刻见解、周详考虑和宝贵贡献

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

如果您有兴趣参与 CSI 或 Kubernetes 存储系统任何部分的设计和开发,欢迎加入 Kubernetes 存储特别兴趣小组 (SIG)。我们正在迅速发展,并随时欢迎新的贡献者。