Fehlerbehebung bei einem Namespace, der im Status „Beendigung“ hängt


Auf dieser Seite erfahren Sie, wie Sie Probleme mit einem Namespace beheben, der sich im Status Terminating befindet.

In Namespaces werden Kubernetes-Finalizer verwendet, um das Löschen zu verhindern, wenn eine oder mehrere Ressourcen in einem Namespace noch vorhanden sind. Wenn Sie einen Namespace mit dem kubectl delete-Befehl löschen, ändert sich sein Status in Terminating. Der Namespace bleibt im Status Terminating, bis Kubernetes die abhängigen Ressourcen löscht und alle Finalisierer beseitigt. Der Namespace-Lebenszykluscontroller listet zuerst alle Ressourcen im Namespace auf, die von GKE gelöscht werden müssen.

Wenn GKE eine abhängige Ressource nicht löschen kann oder der Namespace-Lebenszykluscontroller nicht prüfen kann, ob der Namespace leer ist, bleibt der Namespace im Status Terminating, bis Sie das Problem behoben haben.

Wenn Sie das Problem eines im Status Terminating festhängenden Namespace beheben möchten, identifizieren und entfernen Sie alle fehlerhaften Komponenten, die das Löschen blockieren. Probieren Sie die folgenden Lösungen in der angegebenen Reihenfolge aus:

  1. Nicht verfügbare API-Dienste finden und entfernen.
  2. Übriggebliebene Ressourcen finden und entfernen.
  3. Löschen eines Namespace erzwingen.

Nicht verfügbare API-Dienste finden und entfernen

  1. Nicht verfügbare API-Dienste auflisten:

    kubectl get apiservice | grep False
    
  2. Fehlerbehebung bei nicht reagierenden Diensten:

    kubectl describe apiservice API_SERVICE
    

    Ersetzen Sie API_SERVICE durch den Namen des nicht reagierenden Dienstes.

  3. Prüfen Sie, ob der Status des Namespaces weiterhin Terminating ist:

    kubectl get ns | grep Terminating
    

Übriggebliebene Ressourcen suchen und entfernen.

  1. Listen Sie alle Ressourcen auf, die im zu schließenden Namespace übriggeblieben sind:

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

    Ersetzen Sie NAMESPACE durch den Namen des Namespace, den Sie löschen möchten.

  2. Entfernen Sie alle in der Ausgabe angezeigten Ressourcen.

  3. Prüfen Sie, ob der Status des Namespaces weiterhin Terminating ist:

    kubectl get ns | grep Terminating
    

Löschen eines Namespace erzwingen

Entfernen Sie die Finalisierer, die das Löschen des Namespaces blockieren, um den Namespace zu beenden:

  1. Speichern Sie das folgende Manifest als YAML-Datei:

    kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
    
  2. Öffnen Sie das Manifest in einem Texteditor und entfernen Sie alle Werte aus dem spec.finalizers-Feld:

    vi ns-terminating.yml
    
  3. Prüfen Sie, ob das Feld „Finalizers“ leer ist:

    cat ns-terminating.yml
    

    Die Ausgabe sollte in etwa so aussehen:

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. Starten Sie einen HTTP-Proxy, um auf die Kubernetes API zuzugreifen:

    kubectl proxy
    
  5. Ersetzen Sie das Namespace-Manifest durch 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. Prüfen Sie, ob der Status des Namespaces weiterhin Terminating ist:

    kubectl get ns | grep Terminating
    

Nächste Schritte

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.