本頁說明如何解決命名空間停滯在 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
確認終結器欄位是否空白:
cat ns-terminating.yml
輸出內容應如下所示:
apiVersion: v1 kind: Namespace metadata: annotations: name: NAMESPACE spec: finalizers: status: phase: Terminating
啟動 HTTP Proxy,存取 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 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine
標記搜尋類似問題,向社群尋求支援。你也可以加入#kubernetes-engine
Slack 頻道,取得更多社群支援。 - 使用公開問題追蹤工具回報錯誤或提出功能要求。