Il pod Kubernetes viene ricreato quando viene eliminato


152

Ho avviato i pod con comando

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

Qualcosa è andato storto e ora non posso eliminarlo Pod.

Ho provato a utilizzare i metodi descritti di seguito ma Podcontinua a essere ricreato.

$ 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
Sei riuscito in qualche modo a creare un controller di replica passando argomenti sbagliati. Cosa ottieni kubectl get all -o name?
Graham Dumpleton,

1
Puoi controllare kubectl get eventsper vedere cosa sta creando questi oggetti?
Anirudh Ramanathan,

3
prova kubctl get rca vedere se è stato creato un ReplicationController. In tal caso, eliminalo, quindi elimina i pod.
MrE

3
quale versione di kubernetes stai eseguendo? A seconda della versione di kubernetes vero? Potrebbe comportarsi diversamente. ad esempio prima della 1.2 ha sempre creato la distribuzione. kubectl get deployment
lupo,

19
Se qualcuno finisce qui: - L'eliminazione delle distribuzioni ha risolto il problema per me. kubectl delete deployment <deployment_name>. Per ottenere il nome della distribuzione, eseguirekubectl get deployments
Vasanth Sriram il

Risposte:


291

È necessario eliminare la distribuzione, che a sua volta dovrebbe eliminare i pod e i set di repliche https://github.com/kubernetes/kubernetes/issues/24137

Per elencare tutte le distribuzioni:

kubectl get deployments --all-namespaces

Quindi per eliminare la distribuzione:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Dove NAMESPACE è lo spazio dei nomi in cui si trova e DEPLOYMENT è namela distribuzione.

In alcuni casi potrebbe anche essere in esecuzione a causa di un lavoro o un daemonset. Controllare quanto segue ed eseguire il comando di eliminazione appropriato.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
Come riportare la distribuzione in seguito?
Jamey,

1
@Jamey lo crei di nuovo con il kubectl createcomando.
Illya Gerasymchuk,

1
non deve essere una distribuzione. potrebbe essere un lavoro. quindi assicurati di controllare anchekubectl get jobs
bucky

Per eliminare più tipi di oggetti, non solo le distribuzioni, provare:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

19

Invece di cercare di capire se si tratta di una distribuzione, un deamonset, un statefulset ... o cosa (nel mio caso era un controller di replica che continuava a estendere nuovi pod :) Per determinare cosa fosse che continuava a estendere l'immagine I ottenuto tutte le risorse con questo comando:

kubectl get all

Ovviamente potresti anche ottenere tutte le risorse da tutti gli spazi dei nomi:

kubectl get all --all-namespaces

o definire lo spazio dei nomi che si desidera ispezionare:

kubectl get all -n NAMESPACE_NAME

Quando ho visto che il controller di replica era responsabile del mio problema, l'ho eliminato:

kubectl delete replicationcontroller/CONTROLLER_NAME


14

se il tuo pod ha un nome simile name-xxx-yyy, potrebbe essere controllato da un nome replicasets.apps name-xxx, dovresti eliminare quel replicaset prima di eliminare il pod

kubectl delete replicasets.apps name-xxx


1
Grazie! Nel mio caso, era un lavoro specifico che lo stava ricreando. Quindi:kubectl delete --all jobs -n <namespace>
yclian,

Trova il set di repliche con kubectl get replicasets.apps -n <namespace>(o --all-namespaces)
Noam Manos

9

Cerca anche i set con stato

kubectl get sts --all-namespaces

per eliminare tutti i set con stato in uno spazio dei nomi

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

per eliminarli uno per uno

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

gitlab-gitaly era lì per me. Grazie! Questo ha risolto.
Kevin C,

6

In alcuni casi i pod non andranno comunque via anche quando si elimina la distribuzione. In tal caso per forzare la loro eliminazione è possibile eseguire il comando seguente.

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


Questo non risolverà il problema quando il pod creato dalla distribuzione, dai lavori o da qualsiasi altro tipo di controller se il tipo di strategia è impostato su Recreate.
SK Venkat,

5

Ciò fornirà informazioni su tutti i pod, le distribuzioni, i servizi e i lavori nello spazio dei nomi.

kubectl get pods,services, deployments, jobs

i pod possono essere creati da distribuzioni o lavori

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

Se si elimina la distribuzione o il processo, è possibile interrompere il riavvio dei pod.


5

Molte risposte qui dicono di eliminare uno specifico oggetto k8s, ma puoi eliminare più oggetti contemporaneamente, anziché uno per uno:

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

Nel mio caso, sto eseguendo il cluster OpenShift con OLM - Operator Lifecycle Manager . OLM è colui che controlla la distribuzione, quindi quando ho eliminato la distribuzione, non è stato sufficiente impedire il riavvio dei pod.

Solo quando ho eliminato OLM e la sua sottoscrizione , la distribuzione, i servizi e i pod sono spariti.

Prima elenca tutti gli oggetti k8 nel tuo spazio dei nomi:

$ 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 non è elencato con get all, quindi lo cerco specificamente:

$ 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 

Ora elimina tutti gli oggetti, inclusi OLM, abbonamenti, distribuzioni, set di repliche, ecc:

$ 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

Elenca nuovamente gli oggetti - tutto sparito:

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

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

4

Quando il pod si sta ricreando automaticamente anche dopo l'eliminazione manuale del pod, questi pod sono stati creati utilizzando Deployment. Quando si crea una distribuzione, crea automaticamente ReplicaSet e Pods. A seconda di quante repliche del tuo pod hai menzionato nello script di distribuzione, inizialmente creerà quel numero di pod. Quando si tenta di eliminare manualmente un pod, verrà automaticamente creato nuovamente quel pod.

Sì, a volte è necessario eliminare i pod con forza. Ma in questo caso il comando force non funziona.


Ricevo un avvertimento quando provo che il pod potrebbe continuare come un processo di zombi, quindi non era quello che volevo ..
Chanoch,

4

Invece di rimuovere NS puoi provare a rimuovere replicaSet

kubectl get rs --all-namespaces

Quindi eliminare il set di repliche

kubectl delete rs your_app_name

2

Dopo aver seguito un tutorial interattivo sono finito con un mucchio di pod, servizi, distribuzioni:

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

Per pulire tutto, ha delete --allfunzionato bene:

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

Ciò mi ha lasciato con (quello che penso sia) un cluster Kubernetes vuoto:

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

Se hai un lavoro che continua a essere eseguito, devi cercare il lavoro ed eliminarlo:

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

e

kubectl delete job <job-name>


1

È possibile kubectl get replicasetsverificare la distribuzione precedente in base all'età o al tempo

Elimina la vecchia distribuzione in base al tempo se desideri eliminare lo stesso pod corrente dell'applicazione in esecuzione

kubectl delete replicasets <Name of replicaset>

1

Ho anche affrontato il problema, ho usato il comando seguente per eliminare la distribuzione.

kubectl delete deployments DEPLOYMENT_NAME

ma i baccelli stavano ancora ricreando, quindi ho incrociato il set di repliche usando il comando seguente

kubectl get rs

quindi modificare il replicaset da 1 a 0

kubectl edit rs REPICASET_NAME

1

La causa principale della domanda posta era l'attributo di specifica deploy / job / replicasets strategy->typeche definisce cosa dovrebbe accadere quando il pod verrà distrutto (implicitamente o esplicitamente). Nel mio caso, lo era Recreate.

Secondo la risposta di @ nomad , eliminare la distribuzione / lavoro / replicaset è la soluzione semplice per evitare di sperimentare combo mortali prima di incasinare il cluster come utente inesperto.

Prova i seguenti comandi per capire le azioni dietro la scena prima di saltare al debug:

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

1

Nel mio caso ho distribuito tramite un file YAML come kubectl apply -f deployment.yamle la soluzione sembra essere quella di eliminare tramitekubectl delete -f deployment.yaml


0

Ho riscontrato un problema simile: dopo aver eliminato la distribuzione ( kubectl delete deploy <name>), i pod continuavano a "In esecuzione" e dove venivano ricreati automaticamente dopo la cancellazione ( kubectl delete po <name>).

Si è scoperto che il set di repliche associato non è stato eliminato automaticamente per qualche motivo e dopo aver eliminato quello ( kubectl delete rs <name>), è stato possibile eliminare i pod.


0

Con le distribuzioni che dispongono di set con stato (o servizi, lavori, ecc.) È possibile utilizzare questo comando:

Questo comando termina tutto ciò che viene eseguito nel specificato <NAMESPACE>

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

E forte

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.