嘗試刪除Kubernetes命名空間后,長(zhǎng)時(shí)間停留在終止?fàn)顟B(tài)。本文介紹如何解決命名空間處于終止?fàn)顟B(tài)的問題。

問題現(xiàn)象

嘗試刪除Kubernetes命名空間后,長(zhǎng)時(shí)間停留在終止?fàn)顟B(tài)。
kubectl delete ns <namespacename>
Error from server (Conflict): Operation cannot be fulfilled on namespaces "<namespacename>": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system. 

kubectl describe ns <namespacename>
Name: <namespacename> 
Labels: <none> 
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"<namespacename>","namespace":""}} 

Status: Terminating 

可能原因

通常是因?yàn)閺募褐袆h除的這些命名空間下存在資源。

解決方案

刪除命名空間的finalizers。

該選項(xiàng)將會(huì)快速清除處于終止?fàn)顟B(tài)的命名空間,但可能會(huì)導(dǎo)致屬于該命名空間的資源留在集群中,因?yàn)闊o法自動(dòng)刪除它們。在finalizers數(shù)組為空并且狀態(tài)為終止之后,Kubernetes將刪除命名空間。

  1. 打開Shell終端,為您的Kubernetes集群創(chuàng)建一個(gè)反向代理。
    kubectl proxy
    輸出示例如下:
    Starting to serve on 127.0.0.1:8001
  2. 打開一個(gè)新的Shell終端,通過定義環(huán)境變量來連接到Kubernetes集群,使用curl測(cè)試連接性和授權(quán)。
    export TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t')
    curl http://localhost:8001/api/v1/namespaces --header "Authorization: Bearer $TOKEN" --insecure
  3. 獲取命名空間定義的內(nèi)容,以命名空間istio-system為例。
    kubectl get namespace istio-system -o json > istio-system.json
  4. 將finalizers數(shù)組置為空,并重新保存文件。
        "spec": {
            "finalizers": [
            ]
        },
  5. 執(zhí)行以下命令去除finalizers,以命名空間istio-system為例。
    curl -X PUT --data-binary @istio-system.json http://localhost:8001/api/v1/namespaces/istio-system/finalize -H "Content-Type: application/json" --header "Authorization: Bearer $TOKEN" --insecure