K8S删除资源后一直处于Terminating状态无法删除解决方法

原因

使用kubectl delete 删除某命名空间是一直处于Terminating状态无法删除,首先排查了该命名空间下是否还存在deployment pod等资源发现没有后,等了很久还是无法删除后发现是因为该名称空间的"finalizers"字段有值导致

Finalizer(终结器)是Kubernetes中一种机制,用于确保在删除资源之前执行某些清理操作。Finalizer可以被资源对象的控制器(如Controller Manager)添加到资源的metadata.finalizers字段中。当删除资源时,Kubernetes会检查metadata.finalizers字段中的Finalizer列表,并确保在删除资源之前,所有Finalizer中定义的清理操作都已完成。

Finalizer的存在是为了保证资源的完整性和一致性。在资源删除的过程中,Finalizer可以执行一些清理操作,如释放关联的资源、撤销引用、通知其他系统等。这些清理操作可能需要一定的时间来完成,以确保资源被正确地清理和释放。

当一个资源被标记为删除时,Kubernetes会将该资源的状态设置为Terminating,并在metadata.finalizers字段中添加一个特殊的Finalizer。这个Finalizer的存在会阻止资源被立即删除,直到所有Finalizer中定义的清理操作都完成。

只有在所有Finalizer中定义的清理操作完成后,Kubernetes才会继续删除资源,将它从系统中完全移除。

Finalizer的使用可以确保资源在删除时进行必要的清理操作,以避免数据丢失或资源泄露等问题。它提供了一种可靠的机制,确保资源的删除过程是可控和可预测的。

需要注意的是,如果某个资源的Finalizer阻止了删除操作的完成,那么必须解决导致阻塞的问题或手动移除Finalizer,才能继续进行删除操作。这样可以确保资源在删除之前完成必要的清理操作,并避免潜在的数据损失或资源泄露问题。

解决方法如下

  1. 导出namespace资源对象
bash 复制代码
 # kubectl get namespaces ops -o json > ./ops.json
  1. 修改导出的文件将"finalizers"字段内的值清空
bash 复制代码
# vim ops.json


3.打开一个新的终端,使用kubectl起一个代理

bash 复制代码
# kubectl proxy 
Starting to serve on 127.0.0.1:8001

4.调用apiserver api删除该命名空间

bash 复制代码
curl -k -H "Content-Type: application/json" -X PUT --data-binary @ops.json http://127.0.0.1:8001/api/v1/namespaces/ops/finalize

5.到此成功删除

相关推荐
像风一样自由20205 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
陈陈CHENCHEN9 小时前
【Kubernetes】纯 IPv6 K8s 用 socat 打通 IPv4 服务
云原生·容器·kubernetes
CCblandy10 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
阿里云云原生11 小时前
阿里云 AgentCore 产品负责人解读产品全景
云原生·agent
阿里云云原生11 小时前
告别手动补索引:SLS 支持索引自动发现,让数据开箱即用、自由分析
云原生
阿里云云原生12 小时前
从 HTTP 200 到第一个有效输出:AI SSE 拨测如何量化流式体验
云原生
分布式存储与RustFS12 小时前
rclone 与 mc mirror:S3 对象存储同步,限速、过滤、断点续传实测对比
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
阿里云云原生12 小时前
Kitta:Code Review Agent,提升代码审查质量
云原生
灯澜忆梦14 小时前
【docker】#4 | Docker 自定义镜像与 Dockerfile
运维·docker·容器