Wie behebe ich hängen gebliebene Pods und Namespaces in Amazon-EKS-Clustern?
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:
-
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 -
Ü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 -
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:
- Führe den folgenden Befehl aus, um die Namespace-Konfigurationsdatei zu erstellen:
Hinweis: Ersetze TERMINATING_NAMESPACE durch den Namen deines hängen gebliebenen Namespaces.kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json - Entferne das Finalizer-Array aus dem Bereich „spec“ (Spezifikation) der JSON-Datei.
- Führe den folgenden Befehl aus, um die Änderungen zu übernehmen:
Hinweis: Ersetze TERMINATING_NAMESPACE durch den hängen gebliebenen Namespace-Namen.kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json - 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.
- Themen
- Containers
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 7 Monaten
AWS OFFICIALAktualisiert vor einem Jahr