你是否曾经遇到过这样的问题?明明删除了 PVC,但是存储的可用空间没增加?Kubernetes团队在近期最新发布的Kubernetes v1.31中终于修复了这个 Bug,并且把它变成了一个“重磅功能”来发布!
PV策略升级,终结资源泄露
在 Kubernetes v1.31 中,有一项被宣传为“功能稳定”的改动,那就是对 PersistentVolumes (PV) 回收策略的改进。原文里说得非常体面:“Always Honor PersistentVolume Reclaim Policy 现在进入 Beta 阶段。”但是如果仔细了解这个“功能”,你会发现,原来这是个老问题:PV 的回收策略本来是为了在 PersistentVolumeClaim (PVC) 删除后能够正确处理其背后的存储资源。可是在特定情况下,Kubernetes 会无视这个策略,导致不该留着的底层的存储资源被莫名其妙地保留了下来。
举个例子,假设我们有一个 PV,回收策略设置为“Delete”,并且绑定了一个 PVC。当用户删除 PVC 时,按理说 PV 以及背后的存储资源也应该被删除。然而在早期版本的 Kubernetes 中,如果在 PVC 删除之前,PV 状态发生了某些变更,例如手动修改 PV 的元数据,或者集群中出现了短暂的网络分区,PVC 的删除事件可能无法正确触发 PV 的回收逻辑,导致存储资源未能按照预期被删除。换句话说,回收策略在这些边缘情况下被忽略了,最终导致了存储资源的泄漏。
此外,Kubernetes 的控制器本身存在一定的竞态条件问题,导致 PVC 和 PV 的状态更新在某些边缘情况下不一致。例如,当多个控制器同时尝试处理同一个 PV 或 PVC 时,可能会出现更新操作被覆盖或者遗漏,最终使得 PV 的回收策略被忽略。
这次改进的核心是在 Kubernetes 中引入了一项新机制,确保无论 PVC 和 PV 的删除顺序如何,Kubernetes 都会严格执行 PV 上设置的回收策略。特别是在 PV 的回收策略被设置为“Delete”时,系统将确保在 PVC 删除后,PV 以及其背后的存储资源都能够被正确地删除。
为了实现这一点,Kubernetes 对 PV 控制器的逻辑进行了改进,具体包括:
1. PV 与 PVC 状态的同步改进:引入了对 PV 和 PVC 状态更加严格的同步检查机制。在删除 PVC 时,控制器会确保相关联的 PV 的状态被及时更新,确保 PV 的回收策略能够正确生效。
2. 控制器事件驱动的触发机制:改进了 PV 和 PVC 之间的事件处理流程,使得 PVC 删除事件能够可靠地触发 PV 控制器的回收策略执行逻辑。即使在高负载或异常情况下,PVC 删除后的 PV 也能按照预期执行其回收策略,保证不会遗留存储资源。
3. 增强的垃圾收集逻辑:PV 控制器现在包含了一套增强的垃圾收集逻辑,确保在任何删除顺序下,系统都会重新检查 PV 的状态和其回收策略,并根据策略执行相应的操作。通过增加对不同状态的多次检查,系统可以保证即使出现网络抖动或节点异常,PV 的回收策略也不会被忽略。
4. 幂等性保证:新的实现确保回收逻辑是幂等的,即多次执行相同操作不会导致额外副作用。这对于保证集群在网络分区或节点故障恢复后,能够正确清理持久化存储资源至关重要。
该机制在 Kubernetes v1.23 中首次作为 Alpha 功能引入,并在 Kubernetes v1.31 中进入 Beta 阶段,默认开启。这意味着从 v1.31 开始,用户不需要额外配置就可以受益于这个改进。
给K8s用户的管理锦囊
如果你在管理 Kubernetes 集群时遇到过 PV 删除不彻底的问题,那么升级到 v1.31 是一个明智的选择,因为它默认启用了这一改进的回收策略。你可以确保集群中的 PV 和 PVC 在删除时按预期回收,避免存储资源的浪费。此外,v1.31 还带来了其他一些重要的改进,例如增强的节点健康检查、更好的控制器性能优化,以及对安全性和稳定性的大量改进,这些都将帮助你更高效地管理集群。
对于仍在使用旧版本 Kubernetes 的用户,可以采取以下补救措施来避免触发这个问题:
1. 谨慎管理 PVC 和 PV 的删除顺序:在删除 PVC 时,尽量确保 PV 不会被手动修改或发生状态变更,以减少由于状态不一致导致的回收策略失效问题。
2. 手动检查和清理未删除的存储资源:在删除 PVC 后,检查对应的 PV 是否仍存在,并手动执行删除操作,确保底层存储资源被正确释放。
3. 使用幂等脚本处理 PV 删除:编写脚本定期检查集群中是否存在未按预期删除的 PV,确保在 PVC 删除后,PV 和底层存储资源能够被及时清理。
4. 打开 HonorPVReclaimPolicy 功能开关:如果使用的是 Kubernetes v1.23 之后的版本,可以手动开启以确保 PV 的回收策略能够被更好地执行。
这件事告诉我们一个道理:有时候,一个顽固的 bug 改好了,也是值得拿出来吹嘘的“新功能”!