有时候删除k8s集群中的namespace,发现过了很长时间后ns的状态显示Terminating。原因是创建ns的时候集群会在ns的资源清单中加入finalizers字段。如下:

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2021-12-25T09:55:49Z"
  labels:
    kubernetes.io/metadata.name: default
  name: default
  resourceVersion: "5"
  uid: eafdb6ed-9afa-4ae8-9bf1-a2440ff0c7fc
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

Finalizers 是带有命名空间的键,告诉 k8s 等到特定的条件被满足后, 再完 全删除被标记为删除的资源。 Finalizers 提醒控制器清理被删除的对象拥有的资源。当告诉 k8s 删除一个指定了 Finalizer 的对象时, Kubernetes API 通过填充 .metadata.deletionTimestamp 来标记要删除的对象, 并返回202状态码 (HTTP “已接受”) 使其进入只读状态。 此时控制平面或其他组件会采取 Finalizers 所定义的行动, 而目标对象仍然处于终止中(Terminating)的状态。 这些行动完成后,控制器会删除目标对象相关的 Finalizers。 当 finalizers 字段为空时,k8s 认为删除已完成。
因此,可以更新ns的yaml文件,将finalizers字段去掉。下面我们采用调用API接口的方法更新yaml文件。
首先将k8s的API服务器的代理打开

kubectl proxy

根据打印的信息获取代理端口。

kubectl get ns xxx -o json > tmp.json

打开tmp.json文件,删除finalizers字段,然后保存退出。
接着调用接口

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/xxx/finalize

调用成功会返回2XX。

Logo

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

更多推荐