排解命名空間停滯在「Terminating」狀態的問題


本頁說明如何解決命名空間停滯在 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. 確認終結器欄位是否空白:

    cat ns-terminating.yml
    

    輸出內容應如下所示:

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. 啟動 HTTP Proxy,存取 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
    

後續步驟