Direkt zum Inhalt

Wie behebe ich hängen gebliebene Pods und Namespaces in Amazon-EKS-Clustern?

Lesedauer: 6 Minute
0

Ich kann meine Pods oder Namespaces in meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster nicht löschen. Die Pods oder Namespaces sind im Status „Wird beendet“ hängen geblieben.

Kurzbeschreibung

Nachdem du einen Pod oder Namespace in Amazon EKS gelöscht hast, wechselt die Ressource in den Status Wird beendet. Wenn dieser Vorgang nicht abgeschlossen wird, musst du das Problem manuell beheben.

Bei Pods kann es aus einem der folgenden Gründe zu Problemen bei der Beendigung kommen:

  • Finalizer verhindern das Löschen.
  • Pods reagieren nicht auf Beendigungssignale.
  • PreStop-Hooks schlagen fehl oder der TerminationGracePeriodSeconds-Service läuft zu lange.
  • Netzwerkstörungen blockieren die Worker-Knoten und die Kommunikation auf der Steuerebene.
  • Ein hoher Ressourcenverbrauch wirkt sich auf Worker-Knoten aus.

Bei Namespaces kann es aus einem der folgenden Gründe zu Problemen bei der Beendigung kommen:

  • Kubernetes kann bestimmte Ressourcen nicht löschen.
  • API-Server melden den Status Falsch.
  • Finalizer verhindern das Löschen.

Lösung

Verwende die folgenden Abschnitte, um Probleme mit dem hängen gebliebenen Pod oder Namespace zu beheben.

Probleme mit hängen gebliebenen Pods beheben

Führe die folgenden Aufgaben aus, um Probleme mit hängen gebliebenen Pods zu beheben.

Den Pod-Status überprüfen

Gehe wie folgt vor:

  1. Führe den folgenden Befehl aus, um die Kubelet-Protokolle auf dem betroffenen Knoten zu überprüfen:

    kubectl get pods -A --field-selector=status.phase==Terminating -o wide
  2. Überprüfe die KNOTEN-Spalte in der Ausgabe, um die betroffenen Knoten zu identifizieren. Wenn sich alle hängen gebliebenen Pods auf demselben Knoten befinden, führe den folgenden journalctl-Befehl aus, um die Kubelet-Protokolle auf dem betroffenen Knoten zu überprüfen:

    journalctl -u kubelet
  3. Starte das Kubelet neu.

Nach Pod-Finalizern suchen

Führe den folgenden Befehl aus, um nach Finalizern zu suchen:

kubectl get pod POD_NAME -n NAMESPACE -o yaml

Hinweis: Ersetze POD_NAME durch den Namen deines Pods. Ersetze NAMESPACE durch den Namen deines Namespaces, in dem sich dein Pod befindet.

Wenn Finalizer vorhanden sind, führe einen der folgenden Befehle aus:

Verwende zum einfachen Entfernen den folgenden Befehl:

kubectl patch pod POD_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}'

Wenn deine Umgebung JSON-Patch-Vorgänge erfordert oder du eine detailliertere Syntax bevorzugst, verwende alternativ den folgenden Befehl:

kubectl patch pod POD_NAME -n NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Hinweis: Ersetze POD_NAME durch den Namen deines Pods. Ersetze NAMESPACE durch den Namen deines Namespaces, in dem sich dein Pod befindet.

Löschen des Pods erzwingen

Wichtig: Es empfiehlt sich, diese Option nur zu verwenden, wenn mit anderen Methoden Datenverlust oder Beschädigung nicht vermieden werden können.

Führe den folgenden Befehl aus, um den Pod zu löschen:

kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force

Hinweis: Ersetze POD_NAME durch den Namen deines Pods und ersetze NAMESPACE durch den Namespace, in dem sich dein Pod befindet.

Probleme mit den hängen gebliebenen Namespaces beheben

Führe die folgenden Aufgaben aus, um Probleme mit hängen gebliebenen Namespaces zu beheben.

Den Namespace-Status überprüfen

Wenn ein Namespace im Status Wird beendet hängen bleibt, enthält der Namespace möglicherweise Ressourcen, die Kubernetes nicht löschen kann. Oder ein API-Service hat möglicherweise den Status Falsch.

Führe den folgenden Befehl aus, um den Status des Namespaces zu überprüfen:

kubectl describe namespace NAMESPACE

Hinweis: Ersetze NAMESPACE durch den Namen deines hängen gebliebenen Namespaces.

Verbleibende Ressourcen finden und entfernen

Wenn Ressourcen im Namespace verbleiben, erhältst du die folgende Fehlermeldung:

„NamespaceContentRemaining: Some resources are remaining: serviceaccounts has 2 resource instances“

Führe den folgenden Befehl aus, um die verbleibenden Ressourcen aufzulisten:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Hinweis: Ersetze NAMESPACE durch den Namen deines Namespaces.

Führe dann den folgenden Befehl aus, um die identifizierten Ressourcen zu entfernen:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Hinweis: Ersetze RESOURCE_TYPE durch den Ressourcentyp, RESOURCE_NAME durch den Namen der Ressource und ersetze NAMESPACE durch deinen Namespace.

Namespace-Finalizer entfernen

Wenn Finalizer immer noch angefügt sind, erhältst du die folgende Fehlermeldung:

„NamespaceFinalizersRemaining: Some content in the namespace has finalizers remaining: kubernetes.io/persistent-volume-provisioner in 1 resource instance“

Um Namespace-Finalizer zu entfernen, kannst du einen Patch-Befehl ausführen, eine JSON-Datei verwenden oder das Löschen des Namespaces erzwingen.

Führe den folgenden Befehl aus, um Finalizer mit einem Patch-Vorgang zu entfernen:

kubectl patch namespace NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Hinweis: Ersetze NAMESPACE durch den Namen deines hängen gebliebenen Namespaces.

Gehe wie folgt vor, um eine JSON-Datei zu verwenden:

  1. Führe den folgenden Befehl aus, um die Namespace-Konfigurationsdatei zu erstellen:
    kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json
    Hinweis: Ersetze TERMINATING_NAMESPACE durch den Namen deines hängen gebliebenen Namespaces.
  2. Entferne das Finalizer-Array aus dem Bereich „spec“ (Spezifikation) der JSON-Datei.
  3. Führe den folgenden Befehl aus, um die Änderungen zu übernehmen:
    kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json
    Hinweis: Ersetze TERMINATING_NAMESPACE durch den hängen gebliebenen Namespace-Namen.
  4. Stelle sicher, dass der Namespace entfernt wurde. Führe den folgenden Befehl aus:
    kubectl get namespaces

Führe den folgenden Befehl aus, um das Löschen des Namespaces zu erzwingen:

kubectl delete namespace NAMESPACE --grace-period=0 --force

Hinweis: Ersetze NAMESPACE durch den Namen deines hängen gebliebenen Namespaces. Es empfiehlt sich, diese Option nur zu verwenden, wenn mit anderen Methoden Datenverlust oder Beschädigung nicht vermieden werden können.

Benutzerdefinierte Ressourcen bereinigen

Wenn Ressourcen im Namespace verbleiben, führe den folgenden Befehl aus:

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Hinweis: Ersetze NAMESPACE durch den Namen deines Namespaces.

Wenn du benutzerdefinierte Ressourcen identifizierst, führe den folgenden Befehl aus, um sie zu entfernen:

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Hinweis: Ersetze RESOURCE_TYPE durch den Ressourcentyp, RESOURCE_NAME durch den Namen der Ressource und ersetze NAMESPACE durch deinen Namespace.

Führe den folgenden Befehl aus, um benutzerdefinierte Ressourcen-Finalizer zu entfernen:

kubectl patch RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}' --type=merge

Hinweis: Ersetze RESOURCE_TYPE durch den Ressourcentyp. Ersetze RESOURCE_NAME durch den Namen der Ressource. Ersetze NAMESPACE durch deinen Namespace.

Führe dann den folgenden Befehl aus, um CustomResourceDefinitions zu entfernen:

kubectl delete crd CRD_NAME

Hinweis: Ersetze CRD_NAME durch den Namen deiner CustomResourceDefinition. Entferne nur CustomResourceDefinitions, die du nicht mehr benötigst.

AWS OFFICIALAktualisiert vor 6 Monaten