Der Kubernetes-Pod wird beim Löschen neu erstellt


151

Ich habe Pods mit Befehl gestartet

$ kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1

Es ist etwas schiefgegangen, und jetzt kann ich das nicht löschen Pod.

Ich habe versucht, die unten beschriebenen Methoden zu verwenden, aber die werden Podimmer wieder neu erstellt.

$ kubectl delete pods  busybox-na3tm
pod "busybox-na3tm" deleted
$ kubectl get pods
NAME                                     READY     STATUS              RESTARTS   AGE
busybox-vlzh3                            0/1       ContainerCreating   0          14s

$ kubectl delete pod busybox-vlzh3 --grace-period=0


$ kubectl delete pods --all
pod "busybox-131cq" deleted
pod "busybox-136x9" deleted
pod "busybox-13f8a" deleted
pod "busybox-13svg" deleted
pod "busybox-1465m" deleted
pod "busybox-14uz1" deleted
pod "busybox-15raj" deleted
pod "busybox-160to" deleted
pod "busybox-16191" deleted


$ kubectl get pods --all-namespaces
NAMESPACE   NAME            READY     STATUS              RESTARTS   AGE
default     busybox-c9rnx   0/1       RunContainerError   0          23s

2
Haben Sie es irgendwie geschafft, einen Replikationscontroller zu erstellen, indem Sie falsche Argumente übergeben haben? Wofür bekommst du kubectl get all -o name?
Graham Dumpleton

1
Können Sie überprüfen kubectl get events, was diese Objekte erstellt?
Anirudh Ramanathan

3
Versuchen Sie kubctl get rcfestzustellen, ob ein ReplicationController erstellt wurde. Wenn ja, löschen Sie das und löschen Sie die Pods.
MrE

3
Welche Version von Kubernetes verwenden Sie? Abhängig von Ihrer Kubernetes-Version? Es könnte sich anders verhalten. Beispielsweise wurde vor 1.2 immer eine Bereitstellung erstellt. kubectl get deployment
Lwolf

19
Wenn hier jemand vorbeikommt: - Das Löschen von Bereitstellungen hat das Problem für mich gelöst. kubectl delete deployment <deployment_name>. Um den kubectl get deployments
Einsatznamen

Antworten:


290

Sie müssen die Bereitstellung löschen, wodurch wiederum die Pods und die Replikatsätze https://github.com/kubernetes/kubernetes/issues/24137 gelöscht werden sollten

So listen Sie alle Bereitstellungen auf:

kubectl get deployments --all-namespaces

So löschen Sie die Bereitstellung:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Wobei NAMESPACE der Namespace ist, in dem es sich befindet, und DEPLOYMENT der Namespace nameder Bereitstellung.

In einigen Fällen kann es auch aufgrund eines Jobs oder eines Daemonsets ausgeführt werden. Überprüfen Sie Folgendes und führen Sie den entsprechenden Löschbefehl aus.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
Wie bringen Sie die Bereitstellung anschließend zurück?
Jamey

1
@ Jamesy Sie erstellen es erneut mit dem kubectl createBefehl.
Illya Gerasymchuk

1
muss keine Bereitstellung sein. könnte ein Job sein. Also stellen Sie sicher, dass Sie auch überprüfenkubectl get jobs
Bucky

Um mehrere Objekttypen zu löschen, nicht nur Bereitstellungen, versuchen Sie:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

19

Anstatt herauszufinden, ob es sich um eine Bereitstellung, ein Deamonset, ein Statefulset handelt ... oder was (in meinem Fall war es ein Replikationscontroller, der immer wieder neue Pods überspannte :) Um festzustellen, was das Image I immer wieder überspannte habe alle Ressourcen mit diesem Befehl erhalten:

kubectl get all

Natürlich können Sie auch alle Ressourcen aus allen Namespaces abrufen:

kubectl get all --all-namespaces

oder definieren Sie den Namespace, den Sie überprüfen möchten:

kubectl get all -n NAMESPACE_NAME

Als ich sah, dass der Replikationscontroller für meine Probleme verantwortlich war, löschte ich ihn:

kubectl delete replicationcontroller/CONTROLLER_NAME


14

Wenn Ihr Pod einen ähnlichen Namen hat name-xxx-yyy, kann er von einer replicasets.apps mit dem Namen gesteuert werden name-xxx. Sie sollten diesen Replikatsatz zuerst löschen, bevor Sie den Pod löschen

kubectl delete replicasets.apps name-xxx


1
Vielen Dank! Für meinen Fall war es ein bestimmter Job, der ihn neu erstellte. Also:kubectl delete --all jobs -n <namespace>
Yclian

Finden Sie das Replikatset mit kubectl get replicasets.apps -n <namespace>(oder --all-Namespaces)
Noam Manos

9

Achten Sie auch auf Stateful Sets

kubectl get sts --all-namespaces

um alle statusbehafteten Mengen in einem Namespace zu löschen

kubectl --namespace <yournamespace> delete sts --all

um sie einzeln zu löschen

kubectl --namespace ag1 delete sts mssql1 
kubectl --namespace ag1 delete sts mssql2
kubectl --namespace ag1 delete sts mssql3

gitlab-gitaly war für mich da. Vielen Dank! Dies löste es.
Kevin C

6

In einigen Fällen verschwinden die Pods auch beim Löschen der Bereitstellung nicht. In diesem Fall können Sie den folgenden Befehl ausführen, um das Löschen zu erzwingen.

kubectl delete pods podname --grace-period=0 --force


Dies löst das Problem nicht, wenn der Pod durch Bereitstellung, Jobs oder andere Arten von Controllern erstellt wird, wenn der Strategietyp auf festgelegt ist Recreate.
SK Venkat

5

Dadurch werden Informationen zu allen Pods, Bereitstellungen, Diensten und Jobs im Namespace bereitgestellt.

kubectl get pods,services, deployments, jobs

Pods können entweder durch Bereitstellungen oder Jobs erstellt werden

kubectl delete job [job_name]
kubectl delete deployment [deployment_name]

Wenn Sie die Bereitstellung oder den Job löschen, kann der Neustart der Pods gestoppt werden.


4

Wenn der Pod auch nach dem manuellen Löschen des Pods automatisch neu erstellt wird, wurden diese Pods mithilfe der Bereitstellung erstellt. Wenn Sie eine Bereitstellung erstellen, werden automatisch ReplicaSet und Pods erstellt. Abhängig davon, wie viele Replikate Ihres Pods Sie im Bereitstellungsskript erwähnt haben, wird zunächst diese Anzahl von Pods erstellt. Wenn Sie versuchen, einen Pod manuell zu löschen, werden diese automatisch erneut erstellt.

Ja, manchmal müssen Sie die Pods mit Gewalt löschen. In diesem Fall funktioniert der Befehl force jedoch nicht.


Ich bekomme eine Warnung, wenn ich dies versuche, dass der Pod als Zombie-Prozess weiterleben könnte, also nicht das, was ich wollte.
Chanoch

4

Anstatt NS zu entfernen, können Sie versuchen, replicaSet zu entfernen

kubectl get rs --all-namespaces

Löschen Sie dann das replicaSet

kubectl delete rs your_app_name

4

In vielen Antworten wird angegeben, dass ein bestimmtes k8s-Objekt gelöscht werden soll. Sie können jedoch mehrere Objekte gleichzeitig löschen , anstatt eines nach dem anderen:

kubectl delete deployments,jobs,services,pods --all -n <namespace>

In meinem Fall führe ich OpenShift- Cluster mit OLM - Operator Lifecycle Manager aus . OLM ist derjenige, der die Bereitstellung steuert. Als ich die Bereitstellung löschte, war es nicht ausreichend, den Neustart der Pods zu verhindern.

Erst als ich OLM und sein Abonnement löschte , waren die Bereitstellung, Dienste und Pods weg.

Listen Sie zuerst alle k8s-Objekte in Ihrem Namespace auf:

$ kubectl get all -n openshift-submariner

NAME                                       READY   STATUS    RESTARTS   AGE
pod/submariner-operator-847f545595-jwv27   1/1     Running   0          8d  
NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/submariner-operator-metrics   ClusterIP   101.34.190.249   <none>        8383/TCP   8d
NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/submariner-operator   1/1     1            1           8d
NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/submariner-operator-847f545595   1         1         1       8d

OLM ist nicht mit aufgeführt get all, daher suche ich speziell danach:

$ kubectl get olm -n openshift-submariner

NAME                                                      AGE
operatorgroup.operators.coreos.com/openshift-submariner   8d
NAME                                                             DISPLAY      VERSION
clusterserviceversion.operators.coreos.com/submariner-operator   Submariner   0.0.1 

Löschen Sie jetzt alle Objekte, einschließlich OLMs, Abonnements, Bereitstellungen, Replikatsätze usw .:

$ kubectl delete olm,svc,rs,rc,subs,deploy,jobs,pods --all -n openshift-submariner

operatorgroup.operators.coreos.com "openshift-submariner" deleted
clusterserviceversion.operators.coreos.com "submariner-operator" deleted
deployment.extensions "submariner-operator" deleted
subscription.operators.coreos.com "submariner" deleted
service "submariner-operator-metrics" deleted
replicaset.extensions "submariner-operator-847f545595" deleted
pod "submariner-operator-847f545595-jwv27" deleted

Objekte erneut auflisten - alles weg:

$ kubectl get all -n openshift-submariner
No resources found.

$ kubectl get olm -n openshift-submariner
No resources found.

2

Nachdem ich ein interaktives Tutorial absolviert hatte, erhielt ich eine Reihe von Pods, Diensten und Bereitstellungen:

me@pooh ~ > kubectl get pods,services
NAME                                       READY   STATUS    RESTARTS   AGE
pod/kubernetes-bootcamp-5c69669756-lzft5   1/1     Running   0          43s
pod/kubernetes-bootcamp-5c69669756-n947m   1/1     Running   0          43s
pod/kubernetes-bootcamp-5c69669756-s2jhl   1/1     Running   0          43s
pod/kubernetes-bootcamp-5c69669756-v8vd4   1/1     Running   0          43s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   37s
me@pooh ~ > kubectl get deployments --all-namespaces
NAMESPACE     NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
default       kubernetes-bootcamp   4         4         4            4           1h
docker        compose               1         1         1            1           1d
docker        compose-api           1         1         1            1           1d
kube-system   kube-dns              1         1         1            1           1d

Um alles aufzuräumen, hat gut delete --allfunktioniert:

me@pooh ~ > kubectl delete pods,services,deployments --all
pod "kubernetes-bootcamp-5c69669756-lzft5" deleted
pod "kubernetes-bootcamp-5c69669756-n947m" deleted
pod "kubernetes-bootcamp-5c69669756-s2jhl" deleted
pod "kubernetes-bootcamp-5c69669756-v8vd4" deleted
service "kubernetes" deleted
deployment.extensions "kubernetes-bootcamp" deleted

Das ließ mich mit einem leeren Kubernetes-Cluster zurück (was ich denke):

me@pooh ~ > kubectl get pods,services,deployments
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8m

1

Wenn Sie einen Job haben, der weiterhin ausgeführt wird, müssen Sie den Job durchsuchen und löschen:

kubectl get job --all-namespaces | grep <name>

und

kubectl delete job <job-name>


1

Sie können kubectl get replicasetsanhand des Alters oder der Zeit nach alten Bereitstellungen suchen

Löschen Sie die alte Bereitstellung basierend auf der Zeit, wenn Sie denselben aktuell ausgeführten Anwendungs-Pod löschen möchten

kubectl delete replicasets <Name of replicaset>

1

Ich war auch mit dem Problem konfrontiert. Ich habe den folgenden Befehl verwendet, um die Bereitstellung zu löschen.

kubectl delete deployments DEPLOYMENT_NAME

Da die Pods jedoch immer noch neu erstellt wurden, überprüfte ich das Replikatset mit dem folgenden Befehl

kubectl get rs

Bearbeiten Sie dann das Replikatset auf 1 bis 0

kubectl edit rs REPICASET_NAME

1

Die Hauptursache für die gestellte Frage war das Spezifikationsattribut für Deployment / Job / Replicasets, strategy->typedas definiert, was passieren soll, wenn der Pod zerstört wird (entweder implizit oder explizit). In meinem Fall war es Recreate.

Gemäß der Antwort von @ nomad ist das Löschen der Bereitstellungs- / Job- / Replikatsätze die einfache Lösung, um zu vermeiden, dass Sie mit tödlichen Combos experimentieren, bevor Sie den Cluster als Anfänger durcheinander bringen.

Probieren Sie die folgenden Befehle aus, um die Aktionen hinter den Kulissen zu verstehen, bevor Sie mit dem Debuggen beginnen:

kubectl get all -A -o name
kubectl get events -A | grep <pod-name>

1

In meinem Fall habe ich über eine YAML-Datei wie bereitgestellt kubectl apply -f deployment.yamlund die Lösung scheint darin zu bestehen, über zu löschenkubectl delete -f deployment.yaml


0

Ich hatte ein ähnliches Problem: Nach dem Löschen der Bereitstellung ( kubectl delete deploy <name>) liefen die Pods weiter und wurden nach dem Löschen automatisch neu erstellt ( kubectl delete po <name>).

Es stellte sich heraus, dass der zugehörige Replikatsatz aus irgendeinem Grund nicht automatisch gelöscht wurde, und nach dem Löschen von that ( kubectl delete rs <name>) konnten die Pods gelöscht werden.


0

Bei Bereitstellungen mit Stateful Sets (oder Diensten, Jobs usw.) können Sie diesen Befehl verwenden:

Dieser Befehl beendet alles, was im angegebenen ausgeführt wird <NAMESPACE>

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all

Und kraftvoll

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.