Pods stecken im Beendigungsstatus fest

244

Ich habe versucht, eine zu löschen ReplicationController mit 12 Pods und ich konnte sehen, dass einige der Pods im TerminatingStatus stecken bleiben .

Mein Kubernetes-Cluster besteht aus einem Steuerebenenknoten und drei Arbeitsknoten, die auf virtuellen Ubuntu-Maschinen installiert sind.

Was könnte der Grund für dieses Problem sein?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h
Dimuthu
quelle
Laufen der Scheduler und der Controller-Manager?
Antoine Cotten

Antworten:

471

Mit dem folgenden Befehl können Sie den POD zwangsweise löschen.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Nitin
quelle
3
Dies war die Lösung für mich auf einem 1.2.4. Pods hatten die ganze Nacht beendet
tback
6
In meinem Fall muss ich noch eine Option hinzufügen: --forceum die Pods teminieren zu lassen.
BMW
17
Ich habe dies in meinem Cluster getan und der Pod schien entfernt zu sein, aber als ich den Knoten überprüfte, lief sein Container noch. Am Ende habe ich Docker auf dem Knoten selbst neu gestartet. github.com/kubernetes/kubernetes/issues/25456 Achten Sie nur darauf, dass Sie mit diesem Befehl kein systemisches Problem verbergen.
mqsoh
4
@mqsoh: Beim erzwungenen Löschen wird es einfach aus dem API-Server-Speicher (etcd) entfernt. Die tatsächlich gelöschte Ressource wird möglicherweise auf unbestimmte Zeit ausgeführt.
Bits
8
"Warnung: Das sofortige Löschen wartet nicht auf die Bestätigung, dass die laufende Ressource beendet wurde. Die Ressource wird möglicherweise auf unbestimmte Zeit auf dem Cluster weiter ausgeführt." Welche Ressourcen?
Akshay
57

Löschen des Pods erzwingen:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

Die --forceFlagge ist obligatorisch.

Joan
quelle
41
Aber die eigentliche Frage für mich ist: "Warum müssen wir überhaupt darauf zurückgreifen?" Welche Art von Dingen führen dazu, dass Pods unter ansonsten normalen Betriebsbedingungen in diesen festsitzenden Zustand geraten?
Neverfox
2
Nun, ich kann Ihnen ein Beispiel geben: Wir hatten einen Java-Container, der ordnungsgemäß heruntergefahren wurde, sich aber selbst zu Tode sammelte und somit nicht auf Signale reagierte.
Aurelia
1
Es ist gut, den Namespace anzugeben. Andernfalls wird Ihr Pod in einer Umgebung mit mehreren Namespaces nicht gefunden. Standardmäßig wird er im kube-systemNamespace angezeigt .
Daniel Andrei Mincă
Um das Löschen aller Pods in einem Namesapce auf einmal zu erzwingenktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
Deepdive
21

Löschen Sie den Finalizer-Block aus der Ressource (Pod, Bereitstellung, DS usw.). Yaml:

"finalizers": [
  "foregroundDeletion"
]
Roee Rakovsky
quelle
1
Das persistente Volume wurde danach gelöscht. Was macht es wirklich?
Raiyan
Mein im Endzustand stecken gebliebener Pod wurde sofort entfernt.
Kuberchaun
Dies war das einzige, was den festsitzenden Pod für mich reparierte, wenn delete -grace-period=0 --forcedies nicht der Fall war . Ich würde mich auch über eine Ausarbeitung dessen freuen, was es genau macht.
Valorl
Diese Seite erklärt foregroundDeletion. Es ist ein Metadatenwert, der angibt, dass das Objekt gerade gelöscht wird. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane
14

Praktische Antwort - Sie können einen terminierenden Pod jederzeit löschen, indem Sie Folgendes ausführen:

kubectl delete pod NAME --grace-period=0

Historische Antwort - In Version 1.1 gab es ein Problem, bei dem Pods manchmal im Status "Beenden" gestrandet sind, wenn ihre Knoten unrein aus dem Cluster entfernt wurden.

Alex Robinson
quelle
1
Ich denke, das ist das Problem. Ich habe einen Minion VM ausgeschaltet, ohne ihn von den Knoten zu entfernen. Ist das ein akzeptables Verhalten? Oder gibt es eine Lösung, um diese Pods aus Kubernetes zu entfernen?
Dimuthu
Ja, die Problemumgehung bis Version 1.2 besteht darin, die Pods zu löschen.
Alex Robinson
36
Sie können jederzeit erzwingen, dass ein beendender Pod mitkubectl delete pod NAME --grace-period=0
Clayton
3
Das Dokument sagt, dass beim Ausführen kubectl delete ...eine SIG_TERMAnforderung an den Container gesendet wird. Was aber, wenn der Container nach Ablauf der Nachfrist noch läuft? Ich habe ein paar Pods Terminatingfestgeklebt, einige in go geschrieben, einige in nodejs. Der replicationController wurde entfernt und der Container läuft noch
Quyen Nguyen Tuan
4
kubectl delete pod PODNAME --grace-period=0arbeitete für mich wie von Clayton vorgeschlagen.
Yogesh Jilhawar
12

Ich fand diesen Befehl einfacher:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

Alle Pods im Status "Beenden" im Standard-Namespace werden gelöscht.

Belabrinel
quelle
1
Wenn Sie es auf anderen Namespaces wie kube-systemuse for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
ausführen
8

In meinem Fall hat die --forceOption nicht ganz funktioniert. Ich konnte die Kapsel immer noch sehen! Es steckte im Terminierungs- / Unbekannten-Modus fest. Also nach dem Laufen

kubectl delete pods <pod> -n redis --grace-period=0 --force

Ich rannte

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
sh0umik
quelle
2
Bevor Sie dies tun, sollten Sie kubernetes.io/docs/concepts/workloads/controllers/… lesen, um zu verstehen, was Finalizer sind. Ein Blick auf den spezifischen Finalizer, der feststeckt, kann Hinweise darauf geben, warum er feststeckt und ob es sicher ist, ihn zu umgehen ...
Beni Cherniavsky-Paskin
5

Wenn --grace-period=0es nicht funktioniert, können Sie Folgendes tun:

kubectl delete pods <pod> --grace-period=0 --force
Paul Ma
quelle
Es gibt einige Situationen, in denen dies zu funktionieren scheint, aber nicht tatsächlich gelöscht wird. Es kann mit Problemen zu tun haben, bei denen Kubelet den Zustand des Pods verliert und den Zustand nicht erhalten kann, so dass er ihn verlässt. ( ZB github.com/kubernetes/kubernetes/issues/51835 ). Ich habe noch keinen Weg gefunden, es zu bereinigen.
cgseller
3

Ich bin kürzlich darauf gestoßen, als ich den Rook Ceph-Namespace entfernt habe - er blieb im Abschlusszustand stecken.

Das einzige, was geholfen hat, war das Entfernen des Kubernetes-Finalizers durch direktes Aufrufen der k8s-API mit Curl, wie hier vorgeschlagen .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • Kubernetes Finalizer in löschen tmp.json(leeres Array lassen"finalizers": [] )
  • Führen Sie kubectl proxyzu Authentifizierungszwecken ein anderes Terminal aus und führen Sie die folgende Curl-Anforderung an den zurückgegebenen Port aus
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • Namespace ist weg

Detaillierter Abriss des Turm-Cephs hier .

zub0r
quelle
3

Die ursprüngliche Frage lautet " Was könnte der Grund für dieses Problem sein? ". Die Antwort wird unter https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues erläutert / 65569 & siehe https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Es wird durch Docker-Mount verursacht, der in einen anderen Namespace gelangt.

Sie können sich beim Pod-Host anmelden, um dies zu untersuchen.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 
Noelmcloughlin
quelle
Ich kann nicht glauben, dass dies die am wenigsten positive Antwort ist und keinen einzigen Kommentar hatte. Während alle anderen Antworten Möglichkeiten zur Umgehung oder Behebung des Problems behandeln, fragte das OP eindeutig nach dem Grund, warum der Zustand überhaupt auftritt.
MisterStrickland
0

Ich bin kürzlich darauf gestoßen, um Ressourcen in meinem Cluster freizugeben. Hier ist der Befehl, um alle zu löschen.

kubectl get pods --all-namespaces | grep Terminating | while read line; do 
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk 
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force; 
done

hoffe, das hilft jemandem, der das liest

rrr
quelle