排查命名空间卡在终止状态的问题


本页面介绍如何解决命名空间卡在 Terminating 状态的问题。

命名空间使用 Kubernetes 终结器来防止在命名空间中的一个或多个资源仍然存在时进行删除。使用 kubectl delete 命令删除命名空间时,命名空间会进入 Terminating 状态。在 Kubernetes 删除其依赖资源并清除所有终结器之前,命名空间会一直处于 Terminating 状态。命名空间生命周期控制器首先会列出 GKE 需要删除的命名空间中的所有资源。

如果 GKE 无法删除某个依赖资源,或者命名空间生命周期控制器无法验证命名空间是否为空,则命名空间会一直保持 Terminating 状态,直到您解决问题为止。

如需解决命名空间卡在 Terminating 状态的问题,请确定并移除阻止删除的所有健康状况不佳组件。请按顺序尝试以下解决方案:

  1. 找到并移除不可用的 API 服务
  2. 找到并移除剩余资源
  3. 强制删除命名空间

找到并移除不可用的 API 服务

  1. 列出不可用的 API 服务:

    kubectl get apiservice | grep False
    
  2. 排查任何无响应服务的问题:

    kubectl describe apiservice API_SERVICE
    

    API_SERVICE 替换为无响应服务的名称。

  3. 检查命名空间的状态是否仍为 Terminating

    kubectl get ns | grep Terminating
    

找到并移除剩余资源

  1. 列出正在终止的命名空间中剩余的所有资源:

    kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n NAMESPACE
    

    NAMESPACE 替换为您要删除的命名空间的名称。

  2. 移除输出中显示的所有资源。

  3. 检查命名空间的状态是否仍为 Terminating

    kubectl get ns | grep Terminating
    

强制删除命名空间

移除阻止删除命名空间的终结器,以强制终止命名空间:

  1. 将命名空间清单保存为 YAML 文件:

    kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
    
  2. 在文本编辑器中打开清单,并移除 spec.finalizers 字段中的所有值:

    vi ns-terminating.yml
    
  3. 验证 finalizers 字段是否为空:

    cat ns-terminating.yml
    

    输出应类似如下所示:

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. 启动 HTTP 代理以访问 Kubernetes API:

    kubectl proxy
    
  5. 使用 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
    
  6. 检查命名空间的状态是否仍为 Terminating

    kubectl get ns | grep Terminating
    

后续步骤

如果您需要其他帮助,请与 Cloud Customer Care 联系。