kubernetes里命名空间删不掉的问题

如果某个命名空间(此例里是ingress-nginx)迟迟删除不掉,状态一直是Terminating,然后在此命名空间里重新创建资源时报如下错误:

Error from server (Forbidden): error when creating “nginx-controller.yaml”: roles.rbac.authorization.k8s.io “ingress-nginx-admission” is forbidden: unable to create new content in namespace ingress-nginx because it is being terminated

解决办法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在第一个终端里运行
kubectl proxy

# 在第二个终端里执行
kubectl get namespace ingress-nginx -o json > xx.json
# 用 vim 编辑 xx.json
"spec": {
"finalizers": [
"kubernetes" # 这一行删掉
]
},

# 或者直接命令行删除
sed -i '/"finalizers"/{n;d}' xx.json

# 然后执行命令即可删除
curl -k -H "Content-Type: application/json" -X PUT --data-binary @xx.json \
http://127.0.0.1:8001/api/v1/namespaces/ingress-nginx/finalize

上面方法可能会残留一些其他资源,可以试一下这个

1
2
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>