那些用得多的 Kubernetes 资源清理命令,平时忘了也能快速找回来
- 问答
- 2026-01-19 16:25:08
- 4
清理所有已完成的 Pod
这个命令可能是最常用的,很多 Job 或 CronJob 运行后会留下状态为 Completed 的 Pod,如果积压太多会显得很乱。
命令是:kubectl delete pods --field-selector=status.phase==Completed
这个命令会一次性删除所有状态为“完成”的 Pod,让 Pod 列表清爽很多。(来源:Kubernetes 官方文档关于 kubectl delete 和字段选择器的说明)
清理所有已失败的 Pod
与上面类似,专门清理那些因为错误而停止、状态为 Error 或 CrashLoopBackOff 的 Pod。
命令是:kubectl delete pods --field-selector=status.phase==Failed
这样可以快速清除故障残留,便于查看当前正在运行或新出现的故障 Pod。(来源:Kubernetes 官方文档关于 Pod 生命周期的说明)
强制删除卡在“Terminating”状态的命名空间
有时候删除命名空间时,它会一直卡在 Terminating 状态,通常是因为某些资源没有被正确清理,这时需要一个强制手段。
导出命名空间的详细定义:kubectl get namespace <命名空间名称> -o json > temp.json
编辑 temp.json 文件,找到 "spec": 这一部分,将其值改为 ,也就是将 "spec": { ... } 替换为 "spec": {}。
开启一个代理(因为需要直接访问 API)并执行强制删除:kubectl proxy --port=8081 & (在后台运行代理)
接着用 curl 命令调用 API:curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json http://127.0.0.1:8081/api/v1/namespaces/<命名空间名称>/finalize
执行成功后,命名空间会被强制删除,这是一个“杀手锏”,请谨慎使用。(来源:Kubernetes GitHub Issue 讨论和社区常见问题解决方案)
强制删除卡在“Terminating”状态的 Pod
和命名空间类似,Pod 也可能因为 Finalizers(终结器)的问题而无法删除。
命令是:kubectl delete pod <Pod名称> --grace-period=0 --force --namespace <命名空间>
--grace-period=0 表示不等待,立即删除。--force 是强制标志,但有时候即使这样也不行,这时就需要像处理命名空间一样,编辑其 JSON 配置并移除 finalizers。
先获取 Pod 的 JSON:kubectl get pod <Pod名称> -o json > pod.json
编辑 pod.json,将 "metadata": {"finalizers": [...]} 中的 finalizers 数组清空,变成 "finalizers": []。
然后通过 kubectl replace 命令应用修改:kubectl replace --raw "/api/v1/namespaces/<命名空间>/pods/<Pod名称>/finalize" -f ./pod.json
之后 Pod 会立刻消失。(来源:Kubernetes 官方文档关于强制删除 Pod 的章节及社区经验)
清理 Evicted(被驱逐的)Pod
当节点资源(如磁盘空间)不足时,Kubernetes 会驱逐一些 Pod 以释放资源,这些 Pod 的状态会变为 Evicted,它们不会自动消失,需要手动清理。
命令是:kubectl get pods --all-namespaces | grep Evicted | awk '{print $2 " --namespace=" $1}' | xargs kubectl delete pod
这个命令组合做了以下几件事:
kubectl get pods --all-namespaces:获取所有命名空间的 Pod。grep Evicted:过滤出包含 “Evicted” 的行。awk '{print $2 " --namespace=" $1}':提取 Pod 名称(第二列)和其所在的命名空间(第一列),并格式化成pod名称 --namespace=命名空间的字符串。xargs kubectl delete pod:将前面生成的字符串作为参数传递给kubectl delete pod命令,从而批量删除。 这是一个非常实用的单行命令。(来源:Kubernetes 社区广泛流传的运维技巧)
清理孤立的 PVC(持久卷声明)和 PV(持久卷)
在删除 Deployment 或 StatefulSet 后,它们创建的 PVC 可能还会保留,进而导致与之绑定的 PV 也处于 Released 状态,无法被新的 PVC 使用,需要先删除 PVC 才能释放 PV。
查看所有 PVC:kubectl get pvc --all-namespaces
查看所有 PV:kubectl get pv
删除不再使用的 PVC:kubectl delete pvc <pvc名称> -n <命名空间>
删除后,对应的 PV 状态如果不再是 Bound,也会被回收(取决于其回收策略 reclaimPolicy)。(来源:Kubernetes 官方文档关于持久卷生命周期的说明)
清理无效的 Docker 镜像(在节点上执行)
这个命令不是在 kubectl 下执行,而是需要登录到各个工作节点上运行,长时间运行的集群,节点上会积累大量无用的镜像,占用磁盘空间。
命令是:docker image prune -a
-a 参数表示删除所有未被任何容器引用的镜像(而不仅仅是悬虚镜像),执行前会询问确认,也可以加 -f 参数强制直接删除。
注意:如果你使用的容器运行时是 containerd 而不是 Docker,这个命令就不适用了。(来源:Docker 官方文档)
根据时间筛选并删除资源
如果你想删除运行超过一定时间的 Pod,可以使用 --field-selector 结合时间戳。
删除运行超过一天的所有 Pod:kubectl get pods --all-namespaces --field-selector "status.phase!=Running" --no-headers | awk '$5 ~ /^[0-9]+d/{print $1, $2}' | while readme.md 空间)。 命令是:docker image prune -a或docker system prune -a`(后者更彻底,会清理镜像、容器、网络等所有未使用的资源)
在执行前,系统会询问你是否确认,请务必小心操作,避免删掉正在使用的基础镜像。(来源:Docker 官方文档)
一键清理测试用的命名空间(包括里面的所有资源)
在开发或测试时,我们经常会创建单独的命名空间,测试完成后,删除整个命名空间是最快的清理方式,因为它会删除其下的几乎所有资源。
命令很简单:kubectl delete namespace <命名空间名称>
如果命名空间卡住了,请参考上面的第3条。(来源:Kubernetes 基础操作)
根据标签批量删除资源
如果你给一组资源(如 Pods, Deployments, Services)打上了相同的标签(label),可以通过标签选择器来批量删除它们。
命令格式:kubectl delete <资源类型> -l <标签键>=<标签值>
删除所有带有 app=test 标签的 Pod:kubectl delete pods -l app=test
这个方法非常灵活,是日常管理中的高效工具。(来源:Kubernetes 官方文档关于标签和选择器的说明)
清理旧的或失败的 Job
和 Pod 类似,完成的 Job 也会保留历史记录。
查看所有 Job:kubectl get jobs --all-namespaces
删除特定的 Job:kubectl delete job <job名称> -n <命名空间>
你也可以通过设置 Job 的 .spec.ttlSecondsAfterFinished 字段,让 Kubernetes 在 Job 完成后自动清理它。(来源:Kubernetes 官方文档关于 Job 的自动清理说明)
希望这个列表能成为您手边的快速参考指南,尤其是在生产环境中,执行删除命令前务必再次确认资源列表,避免误删。

本文由瞿欣合于2026-01-19发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/83764.html
