一、资源无法正常删除
在 Kubernetes 中,Finalizers 是一种机制,用于确保资源在删除之前完成特定的清理操作。它们主要用于防止资源被意外删除,直到所有依赖的资源或操作都已完成。
Finalizers 的作用
-
资源清理 在删除资源(如 Pod、Namespace、PersistentVolume 等)时,Finalizers 会确保相关的清理操作(如释放存储、断开网络、删除依赖资源等)已完成。
-
防止意外删除 Finalizers 可以防止资源被意外删除,直到所有依赖的资源或操作都已完成。
-
顺序删除 在复杂的资源依赖关系中,Finalizers 可以确保资源按正确的顺序删除。
Finalizers 的工作原理
-
资源删除流程
-
当用户请求删除一个资源时,Kubernetes 会检查该资源是否包含 Finalizers。
-
如果存在 Finalizers,Kubernetes 会将该资源标记为
Terminating状态,但不会立即删除。 -
Kubernetes 会等待所有 Finalizers 被移除后,才会真正删除该资源。
-
-
Finalizers 的移除
-
Finalizers 通常由控制器(Controller)或 Operator 负责移除。
-
控制器会在完成清理操作后,从资源的
metadata.finalizers字段中移除对应的 Finalizer。
-
Finalizers 的常见场景
-
Namespace 删除 在删除 Namespace 时,Kubernetes 会确保该 Namespace 下的所有资源(如 Pod、Service、ConfigMap 等)都已被删除。
-
PersistentVolume 删除 在删除 PersistentVolume 时,Kubernetes 会确保关联的存储资源已被释放。
-
自定义资源(CRD) 在删除自定义资源时,Operator 可能会使用 Finalizers 来确保相关的清理操作已完成。
Finalizers 的示例
查看 Finalizers
kubectl get namespace <namespace-name> -o json | jq '.metadata.finalizers'
手动移除 Finalizers
如果 Finalizers 卡住导致资源无法删除,可以手动移除 Finalizers:
-
导出资源定义:
kubectl get namespace <namespace-name> -o json > ns.json -
编辑
ns.json,移除spec.finalizers字段:{ "metadata": { "finalizers": [] } } -
更新资源:
kubectl replace --raw "/api/v1/namespaces/<namespace-name>/finalize" -f ns.json
Finalizers 的注意事项
-
不要随意移除 Finalizers 手动移除 Finalizers 可能会导致资源未完成清理就被删除,从而引发问题(如资源泄漏)。
-
Finalizers 卡住的原因 如果 Finalizers 长时间未移除,可能是控制器未正常运行,或者清理操作未完成。需要检查相关控制器的日志。
-
Finalizers 的设计 在开发自定义控制器或 Operator 时,应合理设计 Finalizers,确保清理操作的原子性和可靠性。
总结
Finalizers 是 Kubernetes 中用于资源清理和删除顺序控制的重要机制。它们确保资源在删除之前完成所有必要的操作,避免资源泄漏或不一致的状态。然而,如果 Finalizers 未正确移除,可能会导致资源卡在 Terminating 状态,此时需要手动干预。