问题描述:

namespace删除失败,并一直处于Terminating状态。

处理思路:

  1. 检查是否存在残留资源。(将以下namespace name替换为需要删除的namespace)
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n {namespace name}

有,则等待删除完成;无,则进行下一步排查。

  1. 检查APIService状态是否异常。
kubectl get APIService

有,则根据对应APIService的状态向下排查;无,则进行下一步。

  1. 检查资源对象是否配置Finalizers。
kubectl get ns {namespace name} -o yaml |grep finaliers

解决方法:

1.其他原因可先尝试添加强制删除参数

kubectl delete ns {namespace name} --force --grace-period=0

2.特殊原因,如资源对象配置了Finalizers
编辑namespace并将finalizers字段参数置空。

kubectl edit ns {namespace name}

注意:在对象卡在删除状态的情况下,要避免手动直接移除Finalizers。Finaliers通常由于特殊原因被添加到资源上,在未了解其被添加到资源的原因的情况下强行删除该字段内容可能会导致数据彻底丢失甚至整个集群都会出现意外的问题。

Kubernetes删除控制原理

1.级联和非级联删除
(1) k8s资源默认使用级联删除,当执行了删除一个Deployment的操作时,与其关联的ReplicaSet和Pod也会被删除。
(2)我们可以指定删除操作为非级联删除,则之后保留下来的资源被称为孤儿对象。

参考:ReplicaSet是Pod的owner,Deployment是ReplicaSet的owner,当ReplicaSet被级联删除时,那么从属于它的Pod也会被删除;同理,当Deployment被级联删除时,从属于它的ReplicaSet、Pod都会被删除。

2.级联删除的两种模式前台(Foreground)和后台(Background)

  • Foreground(整个删除过程完成之前,被删除对象一直是可见的)
    (1)api server将对象的metadata.deletionTimestamp字段设置为该对象被标记为要删除的时间点
    (2)api server将metadata.finalizers字段设置为foregroundDeletion
    (3)对象依赖项全部清理完成之后再清理对象自身,在依赖项被清理完成之前该对象会一直可见。
  • Background
    对象会被立即删除,controller会负责继续在后台清理其依赖项。
    3.Finalizers
    Finalizers是k8s的删除拦截机制。
    配置了Finalizers的对象的删除被分为三个步骤:
    (1)将被删除对象的metadata.deletionTimestamp更新为当前时间。
    (2)禁止对象被删除,直到metadata.finalizers字段为空。
    (3)返回状态码202
    简言之,添加了Finalizers的对象被执行删除操作后将删除时间戳更新为当前发生删除请求的时间来表示该资源已请求删除,但是在我们拿掉Finalizers配置之前etcd并不会真正删除该对象。
Logo

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

更多推荐