namespace Terminating 问题

问题现象是运行下面命令卡住的情况,具体看https://github.com/kubernetes/kubernetes/issues/60807

kubectl delete ns XXXXX

网上绝大部分关于namespace Terminating的解决方式来自于github

但是这个方法有陷阱,通过删除finalize,确实可以删除namespace。但是这个也破坏了kubernetes的级联删除。导致该namespace的下属资源依旧存在。如果大量的使用这种删除方式,则会导致etcd数据量大等一系列问题。如下结果。

资源回收

kubernetes 的资源有三种删除方式,也叫kubernetes资源回收

  • 直接删除。运行kubelet delete时,立刻删除资源,不管资源的下属资源

  • 前台级联删除。运行kubelet delete时,先删除下属资源,最后删除本资源

  • 后台级联删除。运行kubelet delete时,先删除本资源,然后删除下属资源

前台级联删除

当运行kubelet delete时,步骤如下

  1. kubernetes会给本资源打上两个标签:finalize、deletetimestamp。
  2. 删除下属资源,如果下属资源删除完成,就删除finalize标签
  3. 因为finalize标签没有,deletetimestamp标签有。所以删除本资源

当资源上有finalize标签时,就不能删除资源。

所以当你通过删除finalize来删除namespace就会出现问题。你的namespace下属资源没有删除干净。这将会导致两个问题:1. 无效的资源不断的集聚。2. 更深层次的原因不及时发现。几乎所有的Terminating都不是资源本身的问题。

目前已知的namespace Terminating 问题方向为两个,1. pod Terminating 2. webhook 的验证不通过

4 个月 后

您好,我遇到了这个问题,我的现象是:可以创建namespace,但却删除不了。

参考issue60807几种解决方式,问题依旧。

请问有排查的方向或者思路吗?

  • Jeff 回复了此帖

    Jeff 谢谢,解决了。
    原因:删除kubevirt资源对象时,方式不对

    我的方式

    kubectl delete -f kubevirt-operator.yaml
    kubectl delete -f kubevirt-cr.yaml

    官方方式

    $ export RELEASE=v0.17.0
    $ kubectl delete -n kubevirt kubevirt kubevirt --wait=true # --wait=true should anyway be default
    $ kubectl delete apiservices v1alpha3.subresources.kubevirt.io # this needs to be deleted to avoid stuck terminating namespaces
    $ kubectl delete mutatingwebhookconfigurations virt-api-mutator # not blocking but would be left over
    $ kubectl delete validatingwebhookconfigurations virt-api-validator # not blocking but would be left over
    $ kubectl delete -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml

    Note: The apiservice and the webhookconfigurations need to be deleted manually due to a bug.

    $ kubectl -n kubevirt patch kv kubevirt --type=json -p '[{ "op": "remove", "path": "/metadata/finalizers" }]'

    官方样例基于v0.17.0,本地环境基于v0.35.0同样生效。

    执行完毕后,命名空间可以正常删除。

    关联issue