Namespace 中残留的资源存在 Finalizers 且相应软件已卸载
查看 namespace yaml:
$ kubectl get ns istio-system -o yaml
...
status:
conditions:
- lastTransitionTime: "2021-12-07T05:07:14Z"
message: 'Some resources are remaining: kialis.kiali.io has 1 resource instances'
reason: SomeResourcesRemain
status: "True"
type: NamespaceContentRemaining
- lastTransitionTime: "2021-12-07T05:07:14Z"
message: 'Some content in the namespace has finalizers remaining: kiali.io/finalizer
in 1 resource instances'
reason: SomeFinalizersRemain
status: "True"
type: NamespaceFinalizersRemaining
phase: Terminating
"Some content in the namespace has finalizers remaining: kiali.io/finalizer in 1 resource instances’"这句话是关键
去查找kiali.io资源
可以看到 SomeResourcesRemain 和 SomeFinalizersRemain,对应资源类型是 kialis.kiali.io,可以获取看一下:
$ kubectl -n istio-system get kialis.kiali.io
NAME AGE
kiali 5d23h
这个例子明显看是安装过 kiali,且有 kiali 残留的 crd 资源,但 kiali 已卸载。 清理 namespace 时清理 kiali 资源时,发现资源上存在 finilizer,需等待 kiali 本身进一步清理,由于 kiali 已卸载就无法清理,导致一直在等待。
这个时候我们可以手动删下资源上的 finalizer 即可:
kubectl -n istio-system edit kialis.kiali.io kiali
Metrics server 被删除
删除 ns 时,apiserver 会调注册上去的扩展 api 去清理资源,如果扩展 api 对应的服务也被删了,那么就无法清理完成,也就一直卡在 Terminating。
下面的例子就是使用 prometheus-adapter 注册的 resource metrics api,但 prometheus-adapter 已经被删除了:
$ kubectl get apiservice
...
v1beta1.metrics.k8s.io monitoring/prometheus-adapter False (ServiceNotFound) 75d
...
强删 namespace 方法
有时候实在找不到原因,也可以强删 namespace,以下是强删方法:
NAMESPACE=delete-me
kubectl get ns $NAMESPACE -o json | jq '.spec.finalizers=[]' > ns.json
kubectl proxy --port=8899 &
PID=$!
curl -X PUT http://localhost:8899/api/v1/namespaces/$NAMESPACE/finalize -H "Content-Type: application/json" --data-binary @ns.json
kill $PID
来源:https://imroc.cc/kubernetes-troubleshooting/methods/cluster/namespace-terminating