1. 删除 Kubernetes 集群中所有命名空间下的所有 Pod

在 Kubernetes 中,当我们需要删除多个 Pod,尤其是在多个命名空间(namespace)中时,逐个删除效率低下且容易出错。幸运的是,Kubernetes 提供了批量删除的机制,可以通过简单的命令实现一次性删除所有 Pod。

本文将介绍如何删除所有命名空间中的 Pod、如何删除单个或多个命名空间中的 Pod,以及如何删除所有资源(包括 Deployment、Service 等)。


2. 删除所有命名空间下的所有 Pod

我们可以使用 kubectl delete pods 命令配合 --all--all-namespaces 参数来删除所有命名空间下的所有 Pod:

$ kubectl delete pods --all --all-namespaces

也可以使用更简短的写法 -A 来代替 --all-namespaces

$ kubectl delete pods --all -A

执行示例如下:

$ kubectl delete pods --all -A
pod "test-pod" deleted
pod "coredns-787d4945fb-w6j2h" deleted
pod "etcd-minikube" deleted
pod "kube-apiserver-minikube" deleted
pod "kube-controller-manager-minikube" deleted
pod "kube-proxy-7vm2m" deleted
pod "kube-scheduler-minikube" deleted
pod "storage-provisioner" deleted

⚠️ 注意:上述命令也会删除 kube-system 等系统命名空间中的 Pod。这些系统 Pod 通常会被自动重建,但删除它们可能导致集群短暂不稳定。因此,建议删除时排除系统命名空间

2.1. 使用 for 循环排除系统命名空间

通过 for 循环,我们可以排除 kube-systemkube-publickube-node-lease 等系统命名空间:

$ for ns in $(kubectl get namespaces -o name | grep -v kube- | cut -c 11-); do
  kubectl delete pods --all -n $ns;
done
pod "liveness-exec" deleted

该命令会获取所有命名空间,通过 grep -v kube- 排除所有以 kube- 开头的命名空间,再使用 cut 命令去掉前缀 namespace/,最后对每个非系统命名空间执行删除操作。

同样地,也可以删除这些命名空间下的所有 Deployment:

$ for ns in $(kubectl get namespaces -o name | grep -v kube- | cut -c 11-); do
  kubectl delete deploy --all -n $ns;
done
deployment.apps "app-deployment" deleted

2.2. 使用 --field-selector 排除系统命名空间

另一种更简洁的方式是使用 --field-selector 参数来排除特定命名空间:

$ kubectl delete pods -A --field-selector metadata.namespace!=kube-system,metadata.namespace!=kube-public,metadata.namespace!=kube-node-lease
pod "app-deployment-5dc467b756-pcfwk" deleted
pod "app-deployment-5dc467b756-qg9l2" deleted
pod "app-deployment-5dc467b756-nhc2k" deleted
pod "app-deployment-5dc467b756-r6jj2" deleted

该命令会排除 kube-systemkube-publickube-node-lease 命名空间下的 Pod。

同样可以用于删除 Deployment:

$ kubectl delete deploy -A --field-selector metadata.namespace!=kube-system,metadata.namespace!=kube-public,metadata.namespace!=kube-node-lease
deployment.apps "app-deployment" deleted
deployment.apps "app-deployment" deleted

3. 删除单个命名空间下的所有 Pod

如果你只想删除某个特定命名空间下的所有 Pod,可以使用如下命令:

$ kubectl delete pods --all -n [namespace]

例如删除 baeldung 命名空间下的所有 Pod:

$ kubectl delete pods --all -n baeldung
pod "app-deployment-5dc467b756-h4m9d" deleted
pod "app-deployment-5dc467b756-p46jq" deleted

推荐做法:这种方式更安全,避免误删系统命名空间中的 Pod。


4. 删除多个命名空间下的所有 Pod

使用 Bash 的 brace expansion(大括号展开)和 eval,我们可以一次性删除多个命名空间下的所有 Pod:

$ eval kubectl\ delete\ pods\ --all\ --namespace={namespace1,namespace2,namespace3}\;

例如删除 defaultbaeldung 命名空间下的所有 Pod:

$ eval kubectl\ delete\ pods\ --all\ --namespace={default,baeldung}\;
pod "app-deployment-5dc467b756-4bk98" deleted
pod "app-deployment-5dc467b756-mlnq6" deleted
pod "liveness-exec" deleted
pod "app-deployment-5dc467b756-scchm" deleted
pod "app-deployment-5dc467b756-z2h8v" deleted
pod "liveness-exec" deleted

⚠️ 注意:使用 eval 时要格外小心,确保命令结构正确,否则可能导致语法错误或执行意外命令。


5. 删除所有命名空间下的所有资源

除了 Pod,我们还可以删除所有资源类型(如 Service、Deployment、DaemonSet 等):

$ kubectl delete all --all --all-namespaces

简写形式:

$ kubectl delete all --all -A

执行示例:

$ kubectl delete all --all -A
pod "app-deployment-5dc467b756-kmr6k" deleted
...truncated...
pod "kube-apiserver-minikube" deleted
...truncated...
service "kube-dns" deleted
daemonset.apps "kube-proxy" deleted
deployment.apps "app-deployment" deleted
...truncated...

⚠️ 警告:此命令会删除包括 kube-system 在内的所有资源,可能导致集群无法正常运行。除非你打算销毁整个集群,否则不建议使用。


6. 删除单个命名空间下的所有资源

为了更安全地操作,建议只删除单个命名空间下的所有资源:

$ kubectl delete all --all -n [namespace]

例如删除 baeldung 命名空间下的所有资源:

$ kubectl delete all --all -n baeldung
pod "app-deployment-5dc467b756-8vwgq" deleted
pod "app-deployment-5dc467b756-jtw7c" deleted
pod "liveness-exec" deleted
deployment.apps "app-deployment" deleted
replicaset.apps "app-deployment-5dc467b756" deleted

优点:不会影响其他命名空间,尤其是系统命名空间,安全性更高。


7. 删除多个命名空间下的所有资源

同样可以使用 eval 和 brace expansion 删除多个命名空间下的所有资源:

$ eval kubectl\ delete\ all\ --all\ --namespace={namespace1,namespace2}\;

例如删除 defaultbaeldung 命名空间下的所有资源:

$ eval kubectl\ delete\ all\ --all\ --namespace={default,baeldung}\;
pod "app-deployment-5dc467b756-r9x6r" deleted
pod "app-deployment-5dc467b756-zb59m" deleted
pod "liveness-exec" deleted
service "kubernetes" deleted
deployment.apps "app-deployment" deleted
replicaset.apps "app-deployment-5dc467b756" deleted
pod "app-deployment-5dc467b756-5grpz" deleted
pod "app-deployment-5dc467b756-wjbgd" deleted
pod "liveness-exec" deleted
deployment.apps "app-deployment" deleted
replicaset.apps "app-deployment-5dc467b756" deleted

8. 总结

操作 命令
删除所有命名空间下的所有 Pod kubectl delete pods --all -A
排除系统命名空间删除 Pod kubectl delete pods -A --field-selector metadata.namespace!=kube-system,...
删除单个命名空间下的 Pod kubectl delete pods --all -n <namespace>
删除多个命名空间下的 Pod eval kubectl\ delete\ pods\ --all\ --namespace={<ns1>,<ns2>}\;
删除所有命名空间下的所有资源 kubectl delete all --all -A
删除单个命名空间下的所有资源 kubectl delete all --all -n <namespace>
删除多个命名空间下的所有资源 eval kubectl\ delete\ all\ --all\ --namespace={<ns1>,<ns2>}\;

建议:除非你明确知道自己在做什么,否则不要轻易删除系统命名空间中的资源。使用 --field-selectorfor 循环可以有效避免误操作。

如果你希望自动化清理集群,可以将这些命令封装为脚本,便于复用和维护。


原始标题:How to Delete All Pods in All Kubernetes Namespaces