本页面介绍如何解决命名空间卡在 Terminating
状态的问题。
命名空间使用 Kubernetes 终结器来防止在命名空间中的一个或多个资源仍然存在时进行删除。使用 kubectl delete
命令删除命名空间时,命名空间会进入 Terminating
状态。在 Kubernetes 删除其依赖资源并清除所有终结器之前,命名空间会一直处于 Terminating
状态。命名空间生命周期控制器首先会列出 GKE 需要删除的命名空间中的所有资源。
如果 GKE 无法删除某个依赖资源,或者命名空间生命周期控制器无法验证命名空间是否为空,则命名空间会一直保持 Terminating
状态,直到您解决问题为止。
如需解决命名空间卡在 Terminating
状态的问题,请确定并移除阻止删除的所有健康状况不佳组件。请按顺序尝试以下解决方案:
找到并移除不可用的 API 服务
列出不可用的 API 服务:
kubectl get apiservice | grep False
排查任何无响应服务的问题:
kubectl describe apiservice API_SERVICE
将
API_SERVICE
替换为无响应服务的名称。检查命名空间的状态是否仍为
Terminating
:kubectl get ns | grep Terminating
找到并移除剩余资源
列出正在终止的命名空间中剩余的所有资源:
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n NAMESPACE
将
NAMESPACE
替换为您要删除的命名空间的名称。移除输出中显示的所有资源。
检查命名空间的状态是否仍为
Terminating
:kubectl get ns | grep Terminating
强制删除命名空间
移除阻止删除命名空间的终结器,以强制终止命名空间:
将命名空间清单保存为 YAML 文件:
kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
在文本编辑器中打开清单,并移除
spec.finalizers
字段中的所有值:vi ns-terminating.yml
验证 finalizers 字段是否为空:
cat ns-terminating.yml
输出应类似如下所示:
apiVersion: v1 kind: Namespace metadata: annotations: name: NAMESPACE spec: finalizers: status: phase: Terminating
启动 HTTP 代理以访问 Kubernetes API:
kubectl proxy
使用
curl
替换命名空间清单:curl -H "Content-Type: application/yaml" -X PUT --data-binary @ns-terminating.yml http://127.0.0.1:8001/api/v1/namespaces/NAMESPACE/finalize
检查命名空间的状态是否仍为
Terminating
:kubectl get ns | grep Terminating
后续步骤
如果您需要其他帮助,请与 Cloud Customer Care 联系。