背景

在k8s中执行删除命名空间后,命名空间没有被删除而是处于Terminating状态,此时再执行删除仍然删除不掉
在这里插入图片描述

解决

将要删除的命名空间信息导出为json数据(下面traefik-v2 替换成你需要删除的命名空间名称)

kubectl get ns traefik-v2 -o json > tmp.json

编辑导出的tmp.json文件,删除其中的如下配置

vi tmp.json

删除标红的spec中所有内容在这里插入图片描述
删除后如下
在这里插入图片描述

开启代理

kubectl proxy

在这里插入图片描述

新开启一个终端执行如下命令(其中traefik-v2替换成你自己的命名空间名称)

注意:新终端的当前所在目录需要和之前终端一致,因为需要找到tmp.json文件

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/traefik-v2/finalize

在这里插入图片描述

如下图已经删除了

在这里插入图片描述

如果还是删除不掉,往下看,进行下面的操作将 “<namespace-name>” 替换成你自己的命名空间

1. 检查命名空间中是否有任何正在运行的资源

使用以下命令检查命名空间中是否存在任何正在运行的资源:

kubectl get pods --namespace <namespace-name>
kubectl get deployments --namespace <namespace-name>
kubectl get replicasets --namespace <namespace-name>

如果有正在运行的资源,需要先将其删除或终止。

2. 检查命名空间中是否有任何 Finalizer

Finalizer 是防止命名空间被删除的钩子。使用以下命令检查命名空间中是否存在任何 Finalizer:

kubectl get namespace <namespace-name> -o yaml

如果存在 Finalizer,需要手动将其删除。可以使用 kubectl 命令逐个删除 Finalizer,或者使用以下命令一次性删除所有 Finalizer:

kubectl patch namespace <namespace-name> --type=json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
3. 使用 --ignore-not-found 标志

在删除命名空间时,可以使用 --ignore-not-found 标志来忽略不存在的资源。这将强制删除命名空间,即使其中包含正在运行的资源或 Finalizer。

kubectl delete namespace <namespace-name> --ignore-not-found
4. 使用 --cascade=orphan 标志

–cascade=orphan 标志将删除命名空间及其所有内容,包括所有正在运行的资源和 Finalizer。

kubectl delete namespace <namespace-name> --cascade=orphan

**注意:**使用 --cascade=orphan 标志时要小心,因为它会删除命名空间中的所有内容,包括数据和配置。在使用此标志之前,请确保您已备份所有重要数据。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐