Wil*_*son 6 kubernetes kubernetes-namespace
如何强制删除停留在终止中的命名空间?
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
- foregroundDeletion
Run Code Online (Sandbox Code Playgroud)
kubectl delete ns delete-me
无法删除delete-me。
我发现的唯一解决方法是销毁并重新创建整个集群。
这些都不起作用或修改命名空间。在所有这些之后,有问题的终结器仍然存在。
kubectl apply应用:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
finalizers:
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f tmp.yaml
namespace/delete-me configured
Run Code Online (Sandbox Code Playgroud)
该命令无错误地结束,但是名称空间未删除。
下面的YAML具有相同的结果:
apiVersion: v1
kind: Namespace
metadata:
name: delete-me
spec:
Run Code Online (Sandbox Code Playgroud)
kubectl editkubectl edit ns delete-me,然后删除终结器。同上完全删除列表。同上删除spec。同上替换finalizers为空列表。
$ kubectl edit ns delete-me
namespace/delete-me edited
Run Code Online (Sandbox Code Playgroud)
这不会显示任何错误信息,但不会更新命名空间。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.
Run Code Online (Sandbox Code Playgroud)
但是,它实际上没有任何作用。
在我为调试此问题而设置的测试集群中,我已经等待了一个多星期。即使命名空间最终可能决定删除,我也需要比一周快的时间删除它。
命名空间为空。
$ kubectl get -n delete-me all
No resources found.
Run Code Online (Sandbox Code Playgroud)
etcdctl$ etcdctl --endpoint=http://127.0.0.1:8001 rm /namespaces/delete-me
Error: 0: () [0]
Run Code Online (Sandbox Code Playgroud)
我很确定这是一个错误,但是我不知道如何解释。它也不起作用。还尝试了--dir和-r。
ctron/kill-kube-ns有一个用于强制删除命名空间的脚本。这也不起作用。
$ ./kill-kube-ns delete-me
Killed namespace: delete-me
$ kubectl get ns delete-me
NAME STATUS AGE
delete-me Terminating 1h
Run Code Online (Sandbox Code Playgroud)
POST将编辑的资源/ finalize返回405。我不确定这是否是POST到/ finalize的规范方法。
小智 22
将 Termination 中出现的两次 替换<NAME_OF_NAMESPACE>为命名空间的实际名称后应用此命令可以解决该问题:
kubectl get ns <NAME_OF_NAMESPACE> -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/<NAME_OF_NAMESPACE>/finalize" -f -
Run Code Online (Sandbox Code Playgroud)
大多数回复似乎都在做同样的事情;从命名空间中删除终结器。在本例中,分三步完成:
kubectl get ns <NAME_OF_NAMESPACE> -o json以 json 格式返回命名空间配置。这将通过管道传输到下一个命令中:jq '.spec.finalizers = []'从 json 配置中删除所有终结器。然后将生成的 json(不带终结器)通过管道传输到下一个命令:kubectl replace --raw "/api/v1/namespaces/<NAME_OF_NAMESPACE>/finalize" -f -,将更新后的 json 命名空间配置(不带终结器)注入到 k8s 中。dbu*_*osp 18
我喜欢从这里提取的这个答案
在一个终端中:
kubectl proxy
Run Code Online (Sandbox Code Playgroud)
在另一个终端:
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 @-
Run Code Online (Sandbox Code Playgroud)
小智 15
这里是对用户Ushakov Roman提供的命令的修改(详细解释参见那里)。与 Ushakov Roman 的解决方案相比,namespace在开头定义变量有助于减少实际需要键入名称空间名称的位置数量:
namespace=<NAME_OF_NAMESPACE> && kubectl get ns $namespace -o json | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -
Run Code Online (Sandbox Code Playgroud)
该kubectl proxy试几乎是正确的,但并不完全。可以使用JSON代替YAML来解决问题,但我不确定。
终结符列表为空的JSON:
~$ cat ns.json
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "delete-me",
"selfLink": "/api/v1/namespaces/delete-me",
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"delete-me\"},\"spec\":{\"finalizers\":[\"foregroundDeletion\"]}}\n"
}
},
"spec": {
"finalizers": [
]
},
"status": {
"phase": "Terminating"
}
}
Run Code Online (Sandbox Code Playgroud)
使用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"
}
}
Run Code Online (Sandbox Code Playgroud)
命名空间已删除!
~$ kubectl get ns delete-me
Error from server (NotFound): namespaces "delete-me" not found
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3172 次 |
| 最近记录: |