如何强制删除 Kubernetes 命名空间?
How to force delete a Kubernetes Namespace?
如何强制删除卡在终止状态的命名空间?
重建步骤:
- 应用此 YAML
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
- foregroundDeletion
kubectl delete ns delete-me
无法删除delete-me
。
我发现的唯一解决方法是销毁并重新创建整个集群。
我尝试过的事情:
None 这些工作或修改命名空间。在任何这些之后,有问题的终结器仍然存在。
编辑 YAML 和 kubectl apply
申请:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
$ kubectl apply -f tmp.yaml
namespace/delete-me configured
命令完成且没有错误,但命名空间未更新。
下面的 YAML 具有相同的结果:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
kubectl edit
kubectl edit ns delete-me
,并移除终结器。同上完全删除列表。同上删除 spec
。同上用空列表替换 finalizers
。
$ kubectl edit ns delete-me
namespace/delete-me edited
这不会显示任何错误消息,但不会更新命名空间。 kubectl edit
再次访问对象显示终结器仍然存在。
kubectl proxy &
kubectl proxy &
curl -k -H "Content-Type: application/yaml" -X PUT --data-binary @tmp.yaml http://127.0.0.1:8001/api/v1/namespaces/delete-me/finalize
如上,成功退出但什么都不做。
强制删除
kubectl delete ns delete-me --force --grace-period=0
这实际上会导致错误:
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (Conflict): Operation cannot be fulfilled on namespaces "delete-me": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
然而,它实际上并没有做任何事情。
久等了
在我设置调试这个问题的测试集群中,我已经等了一个多星期了。即使命名空间最终可能决定删除,我也需要在一周内将其删除。
确保命名空间为空
命名空间为空。
$ kubectl get -n delete-me all
No resources found.
etcdctl
$ etcdctl --endpoint=http://127.0.0.1:8001 rm /namespaces/delete-me
Error: 0: () [0]
我很确定这是一个错误,但我不知道如何解释它。它也不起作用。还尝试使用 --dir
和 -r
.
ctron/kill-kube-ns
有一个script for force deleting Namespaces。这也不行。
$ ./kill-kube-ns delete-me
Killed namespace: delete-me
$ kubectl get ns delete-me
NAME STATUS AGE
delete-me Terminating 1h
POST
将编辑后的资源写入 /finalize
Returns a 405。我不确定这是否是 POST 到 /finalize 的规范方式。
链接
This
appears
to
be
a
recurring
problem
and
none
of
these
resources
helped.
kubectl proxy
尝试几乎正确,但不完全正确。可以使用 JSON 而不是 YAML 来解决问题,但我不确定。
具有空终结器列表的 JSON:
~$ cat ns.json
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "delete-me"
},
"spec": {
"finalizers": []
}
}
使用 curl
来 PUT
没有问题终结器的对象。
~$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8007/api/v1/namespaces/delete-me/finalize
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "delete-me",
"selfLink": "/api/v1/namespaces/delete-me/finalize",
"uid": "0df02f91-6782-11e9-8beb-42010a800137",
"resourceVersion": "39047",
"creationTimestamp": "2019-04-25T17:46:28Z",
"deletionTimestamp": "2019-04-25T17:46:31Z",
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"delete-me\"},\"spec\":{\"finalizers\":[\"foregroundDeletion\"]}}\n"
}
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}
命名空间已删除!
~$ kubectl get ns delete-me
Error from server (NotFound): namespaces "delete-me" not found
我喜欢这个摘自 here
的答案
在一个终端中:
kubectl proxy
在另一个终端:
kubectl get ns delete-me -o json | \
jq '.spec.finalizers=[]' | \
curl -X PUT http://localhost:8001/api/v1/namespaces/delete-me/finalize -H "Content-Type: application/json" --data @-
kubectl get ns delete-me -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/your-ns/finalize" -f -
此处修改用户提供的命令Ushakov Roman.
namespace=delet_ns && kubectl get ns $namespace -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -
这篇文章让我第二次来到这里,不过这次我们使用的是 Rancher (RKE2) Kubernetes 版.
这里的技巧是直接调用 rancher api 以传递删除请求...(使用代理的技巧不起作用)。希望这对某人有帮助
别忘了更改 Bearer Token
export NS='delete-me';
export YOURFQDN='rancher2.dev.prod.local';
export YOURCLUSTER='c-xxxx1';
kubectl get ns ${NS} -o json | jq '.spec.finalizers=[]' | \
curl -X PUT https://${YOURFQDN}/k8s/clusters/${YOURCLUSTER}/api/v1/namespaces/${NS}/finalize \
-H "Accept: application/json" \
-H "Authorization: Bearer token-xxxx:xxxxYOURxxxxTOKENxxxx" \
-H "Content-Type: application/json" --data @-
如何强制删除卡在终止状态的命名空间?
重建步骤:
- 应用此 YAML
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
- foregroundDeletion
kubectl delete ns delete-me
无法删除
delete-me
。
我发现的唯一解决方法是销毁并重新创建整个集群。
我尝试过的事情:
None 这些工作或修改命名空间。在任何这些之后,有问题的终结器仍然存在。
编辑 YAML 和 kubectl apply
申请:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
$ kubectl apply -f tmp.yaml
namespace/delete-me configured
命令完成且没有错误,但命名空间未更新。
下面的 YAML 具有相同的结果:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
kubectl edit
kubectl edit ns delete-me
,并移除终结器。同上完全删除列表。同上删除 spec
。同上用空列表替换 finalizers
。
$ kubectl edit ns delete-me
namespace/delete-me edited
这不会显示任何错误消息,但不会更新命名空间。 kubectl edit
再次访问对象显示终结器仍然存在。
kubectl proxy &
kubectl proxy &
curl -k -H "Content-Type: application/yaml" -X PUT --data-binary @tmp.yaml http://127.0.0.1:8001/api/v1/namespaces/delete-me/finalize
如上,成功退出但什么都不做。
强制删除
kubectl delete ns delete-me --force --grace-period=0
这实际上会导致错误:
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (Conflict): Operation cannot be fulfilled on namespaces "delete-me": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
然而,它实际上并没有做任何事情。
久等了
在我设置调试这个问题的测试集群中,我已经等了一个多星期了。即使命名空间最终可能决定删除,我也需要在一周内将其删除。
确保命名空间为空
命名空间为空。
$ kubectl get -n delete-me all
No resources found.
etcdctl
$ etcdctl --endpoint=http://127.0.0.1:8001 rm /namespaces/delete-me
Error: 0: () [0]
我很确定这是一个错误,但我不知道如何解释它。它也不起作用。还尝试使用 --dir
和 -r
.
ctron/kill-kube-ns
有一个script for force deleting Namespaces。这也不行。
$ ./kill-kube-ns delete-me
Killed namespace: delete-me
$ kubectl get ns delete-me
NAME STATUS AGE
delete-me Terminating 1h
POST
将编辑后的资源写入 /finalize
Returns a 405。我不确定这是否是 POST 到 /finalize 的规范方式。
链接
This appears to be a recurring problem and none of these resources helped.
kubectl proxy
尝试几乎正确,但不完全正确。可以使用 JSON 而不是 YAML 来解决问题,但我不确定。
具有空终结器列表的 JSON:
~$ cat ns.json
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "delete-me"
},
"spec": {
"finalizers": []
}
}
使用 curl
来 PUT
没有问题终结器的对象。
~$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8007/api/v1/namespaces/delete-me/finalize
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "delete-me",
"selfLink": "/api/v1/namespaces/delete-me/finalize",
"uid": "0df02f91-6782-11e9-8beb-42010a800137",
"resourceVersion": "39047",
"creationTimestamp": "2019-04-25T17:46:28Z",
"deletionTimestamp": "2019-04-25T17:46:31Z",
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"delete-me\"},\"spec\":{\"finalizers\":[\"foregroundDeletion\"]}}\n"
}
},
"spec": {
},
"status": {
"phase": "Terminating"
}
}
命名空间已删除!
~$ kubectl get ns delete-me
Error from server (NotFound): namespaces "delete-me" not found
我喜欢这个摘自 here
的答案在一个终端中:
kubectl proxy
在另一个终端:
kubectl get ns delete-me -o json | \
jq '.spec.finalizers=[]' | \
curl -X PUT http://localhost:8001/api/v1/namespaces/delete-me/finalize -H "Content-Type: application/json" --data @-
kubectl get ns delete-me -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/your-ns/finalize" -f -
此处修改用户提供的命令Ushakov Roman.
namespace=delet_ns && kubectl get ns $namespace -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -
这篇文章让我第二次来到这里,不过这次我们使用的是 Rancher (RKE2) Kubernetes 版.
这里的技巧是直接调用 rancher api 以传递删除请求...(使用代理的技巧不起作用)。希望这对某人有帮助
别忘了更改 Bearer Token
export NS='delete-me';
export YOURFQDN='rancher2.dev.prod.local';
export YOURCLUSTER='c-xxxx1';
kubectl get ns ${NS} -o json | jq '.spec.finalizers=[]' | \
curl -X PUT https://${YOURFQDN}/k8s/clusters/${YOURCLUSTER}/api/v1/namespaces/${NS}/finalize \
-H "Accept: application/json" \
-H "Authorization: Bearer token-xxxx:xxxxYOURxxxxTOKENxxxx" \
-H "Content-Type: application/json" --data @-