问题描述
删除 namespace 一直处于 Terminating 状态
运行环境
- 容器服务 VKE
问题原因
可能原因1:资源发现
如果罗列资源发生报错,可能导致 namespace 卡主 Terminating 状态:
- 查看 namespace 卡在 Terminating 的原因 - Discovery failed for some groups
$ kubectl get namespace <name> -o yaml
conditions:
- lastTransitionTime: "2021-03-12T12:46:17Z"
message: 'Discovery failed for some groups, 1 failing: unable to retrieve the
complete list of server APIs: webhook.cert-manager.io/v1beta1: the server is
currently unable to handle the request'
reason: DiscoveryFailed
status: "True"
type: NamespaceDeletionDiscoveryFailure
- 查看 apiservice 的状态
$ kubectl get apiservice
NAME SERVICE AVAILABLE AGE
v1beta1.webhook.cert-manager.io cert-manager/cert-manager-webhook False (ServiceNotFound) 3d23h
解决方法:将异常的apiservice状态恢复成True或者删除不需要的apiservice,即可恢复。
可能原因2:finalizer
finalizer 导致 namespace Terminating 一般为以下两种情况: 1. namespace资源对象的spec.finalizer[] 列表中不为空 解决方法:手动清空finalizer列表
$ kubectl get ns demo -o json | jq '.spec.finalizers=[]' > ns-without-finalizers.json
cat ns-without-finalizers.json
$ kubectl proxy &
$ PID=$!
$ curl -X PUT http://localhost:8001/api/v1/namespaces/demo/finalize -H "Content-Type: application/json" --data-binary @ns-without-finalizers.json
$ kill $PID
2. namespace资源对象的metadata.finalizer[] 列表不为空 比如:将集群托管到 rancher 管理后,rancher 就会写 finalizer 到metadata.finalizer[] 列表,而当集群脱离 rancher 管理之后,手动删除namespace,往往就会发生 Terminating。 解决方法: 将 metadata.finalizer[]列表删除
$ kubelet edit ns <name>
如果您有其他问题,欢迎您联系火山引擎技术支持服务