El pod Kubernetes se recrea cuando se elimina


152

He comenzado pods con comando

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

Algo salió mal, y ahora no puedo eliminar esto Pod.

Intenté usar los métodos que se describen a continuación, pero se Podsigue recreando.

$ 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
¿De alguna manera logró crear un controlador de replicación al pasar argumentos incorrectos? ¿Para qué obtienes kubectl get all -o name?
Graham Dumpleton el

1
¿Puedes verificar kubectl get eventsqué está creando estos objetos?
Anirudh Ramanathan

3
intente kubctl get rcver si se creó un ReplicationController. Si es así, elimine eso, luego elimine los pods.
MrE

3
¿Qué versión de kubernetes estás ejecutando? Dependiendo de tu versión de kubernetes, ¿es así? Podría comportarse de manera diferente. por ejemplo, antes de 1.2 siempre creaba despliegue. kubectl get deployment
lwolf

19
Si alguien termina aquí: - Eliminar implementaciones resolvió el problema para mí. kubectl delete deployment <deployment_name>. Para obtener el nombre del despliegue, hagakubectl get deployments
Vasanth Sriram, el

Respuestas:


291

Debe eliminar la implementación, que a su vez debería eliminar los pods y los conjuntos de réplica https://github.com/kubernetes/kubernetes/issues/24137

Para enumerar todas las implementaciones:

kubectl get deployments --all-namespaces

Luego, para eliminar la implementación:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Donde NAMESPACE es el espacio de nombres en el que se encuentra, y DEPLOYMENT es el namede la implementación.

En algunos casos, también podría estar ejecutándose debido a un trabajo o conjunto de demonios. Verifique lo siguiente y ejecute el comando de eliminación apropiado.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
¿Cómo traes el despliegue después?
Jamey

1
@Jamey lo creas de nuevo con el kubectl createcomando.
Illya Gerasymchuk

1
No necesita ser una implementación. Podría ser un trabajo. así que asegúrese de verificar tambiénkubectl get jobs
bucky

Para eliminar varios tipos de objetos, no solo implementaciones, intente:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

19

En lugar de tratar de averiguar si se trata de una implementación, deamonset, statefulset ... o qué (en mi caso, era un controlador de replicación que seguía abarcando nuevos pods :) Para determinar qué era lo que seguía abarcando la imagen I Obtuve todos los recursos con este comando:

kubectl get all

Por supuesto, también puede obtener todos los recursos de todos los espacios de nombres:

kubectl get all --all-namespaces

o defina el espacio de nombres que le gustaría inspeccionar:

kubectl get all -n NAMESPACE_NAME

Una vez que vi que el controlador de replicación era responsable de mi problema, lo eliminé:

kubectl delete replicationcontroller/CONTROLLER_NAME


14

si su pod tiene un nombre similar name-xxx-yyy, podría ser controlado por replicasets.apps con nombre name-xxx, debe eliminar ese conjunto de réplicas antes de eliminar el pod

kubectl delete replicasets.apps name-xxx


1
¡Gracias! Para mi caso, era un trabajo específico que lo estaba recreando. Entonces:kubectl delete --all jobs -n <namespace>
yclian el

Encuentra el conjunto de réplicas con kubectl get replicasets.apps -n <namespace>(o --todos los espacios de nombres)
Noam Manos

9

Esté atento a los conjuntos con estado también

kubectl get sts --all-namespaces

para eliminar todos los conjuntos con estado en un espacio de nombres

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

para eliminarlos uno por uno

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

gitlab-gitaly estaba allí para mí. ¡Gracias! Esto lo resolvió.
Kevin C

6

En algunos casos, los pods aún no desaparecerán incluso al eliminar la implementación. En ese caso, para forzar su eliminación, puede ejecutar el siguiente comando.

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


Esto no resolverá el problema cuando el pod creado por la implementación, trabajos o cualquier otro tipo de controladores si el tipo de estrategia se establece en Recreate.
SK Venkat

5

Esto proporcionará información sobre todos los pods, implementaciones, servicios y trabajos en el espacio de nombres.

kubectl get pods,services, deployments, jobs

los pods pueden ser creados por implementaciones o trabajos

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

Si elimina la implementación o el trabajo, se puede detener el reinicio de los pods.


5

Muchas respuestas aquí le indican que elimine un objeto k8s específico, pero puede eliminar varios objetos a la vez, en lugar de uno por uno:

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

En mi caso, estoy ejecutando el clúster OpenShift con OLM - Operator Lifecycle Manager . OLM es quien controla la implementación, por lo que cuando eliminé la implementación, no fue suficiente para detener el reinicio de los pods.

Solo cuando eliminé OLM y su suscripción , la implementación, los servicios y los pods desaparecieron.

Primero enumere todos los objetos k8s en su espacio de nombres:

$ 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 no aparece en la lista get all, por lo que lo busco específicamente:

$ 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 

Ahora elimine todos los objetos, incluidos OLM, suscripciones, implementaciones, conjuntos de réplicas, etc.

$ 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

Vuelva a enumerar los objetos, todo desapareció:

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

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

4

Cuando el pod se está recreando automáticamente, incluso después de la eliminación del pod de forma manual, esos pods se han creado utilizando la implementación. Cuando crea una implementación, crea automáticamente ReplicaSet y Pods. Dependiendo de cuántas réplicas de su pod ha mencionado en el script de implementación, creará esa cantidad de pod inicialmente. Cuando intente eliminar cualquier pod manualmente, creará automáticamente ese pod nuevamente.

Sí, a veces necesitas eliminar los pods con fuerza. Pero en este caso, el comando de fuerza no funciona.


Cuando intento esto, recibo una advertencia de que el pod puede seguir viviendo como un proceso zombie, así que no era lo que quería ...
Chanoch

4

En lugar de eliminar NS, puede intentar eliminar replicaSet

kubectl get rs --all-namespaces

Luego elimine el replicaSet

kubectl delete rs your_app_name

2

Después de tomar un tutorial interactivo , terminé con un montón de pods, servicios e implementaciones:

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

Para limpiar todo, delete --allfuncionó bien:

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

Eso me dejó con (lo que creo que es) un clúster de Kubernetes vacío:

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

Si tiene un trabajo que continúa ejecutándose, debe buscarlo y eliminarlo:

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

y

kubectl delete job <job-name>


1

Puede kubectl get replicasetsverificar la implementación anterior según la edad o el tiempo

Elimine la implementación anterior en función del tiempo si desea eliminar el mismo pod de ejecución actual de la aplicación

kubectl delete replicasets <Name of replicaset>

1

También me enfrenté al problema, he usado el siguiente comando para eliminar la implementación.

kubectl delete deployments DEPLOYMENT_NAME

pero aún así las cápsulas se estaban recreando, así que crucé para verificar el conjunto de réplicas usando el comando a continuación

kubectl get rs

luego edite el conjunto de réplicas de 1 a 0

kubectl edit rs REPICASET_NAME

1

La causa raíz de la pregunta formulada fue el atributo de especificación implementación / trabajo / réplicas strategy->typeque define lo que debe suceder cuando se destruirá el pod (ya sea implícita o explícitamente). En mi caso, lo fue Recreate.

Según @ nomad's respuesta de , eliminar los conjuntos de implementación / trabajo / réplica es la solución simple para evitar experimentar con combos mortales antes de estropear el clúster como usuario novato.

Pruebe los siguientes comandos para comprender las acciones detrás de escena antes de saltar a la depuración:

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

1

En mi caso, implementé a través de un archivo YAML como kubectl apply -f deployment.yamly la solución parece ser eliminar a través dekubectl delete -f deployment.yaml


0

Experimenté un problema similar: después de eliminar la implementación ( kubectl delete deploy <name>), los pods se mantuvieron "en ejecución" y se volvieron a crear automáticamente después de la eliminación ( kubectl delete po <name>).

Resultó que el conjunto de réplicas asociado no se eliminó automáticamente por alguna razón, y después de eliminar eso ( kubectl delete rs <name>), fue posible eliminar los pods.


0

Con implementaciones que tienen conjuntos con estado (o servicios, trabajos, etc.) puede usar este comando:

Este comando termina todo lo que se ejecuta en el especificado <NAMESPACE>

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

Y contundente

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.