对象出现 deletionTimestamp 后长期存在,通常是 finalizer 对应的控制器没有完成清理。直接移除 finalizer 会让对象消失,但云资源、DNS 记录或存储卷可能仍留在外部系统。
确认阻塞责任
kubectl get widgets.example.io demo -o yaml
kubectl get widgets.example.io demo -o jsonpath='{.metadata.finalizers}'
kubectl get events --field-selector involvedObject.name=demo -n app
根据 finalizer 名称找到负责的 operator,检查其副本、leader election、RBAC 和 reconcile 日志。还要确认 CRD 版本升级后控制器是否仍能解析旧对象。
先恢复正常清理
kubectl get deploy,pods -n operator-system
kubectl logs -n operator-system deploy/widget-controller --since=30m
kubectl auth can-i update widgets/finalizers --as=system:serviceaccount:operator-system:widget-controller
若外部依赖暂时不可用,优先恢复依赖或控制器,让幂等清理逻辑自行完成。
强制解除的条件
- 已确认外部资源不存在或能被人工接管
- 保存对象 YAML、控制器日志和外部资源标识
- 使用精确 patch,仅移除目标 finalizer
- 删除后执行云资源、存储和网络泄漏检查
kubectl patch widgets.example.io demo -n app --type=json -p='[{"op":"remove","path":"/metadata/finalizers"}]'
收尾清单
修复控制器的超时、重试和幂等性,并为长期处于 terminating 的自定义资源建立告警。强制删除应是有审计记录的最后手段。