Le pod Kubernetes est recréé lorsqu'il est supprimé


152

J'ai démarré des pods avec la commande

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

Une erreur s'est produite et je ne peux plus le supprimer Pod.

J'ai essayé d'utiliser les méthodes décrites ci-dessous mais le Podcontinue d'être recréé.

$ 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
Avez-vous réussi à créer un contrôleur de réplication en passant des arguments incorrects. Pourquoi avez-vous kubectl get all -o name?
Graham Dumpleton

1
Pouvez-vous vérifier kubectl get eventsce qui crée ces objets?
Anirudh Ramanathan

3
essayez kubctl get rcde voir si un ReplicationController a été créé. Si tel est le cas, supprimez-le, puis supprimez les pods.
MrE

3
quelle version de kubernetes utilisez-vous? En fonction de votre version de Kubernetes? Cela pourrait se comporter différemment. par exemple avant la 1.2, il créait toujours le déploiement. kubectl get deployment
lwolf

19
Si quelqu'un termine par ici: - La suppression des déploiements a résolu le problème pour moi. kubectl delete deployment <deployment_name>. Pour obtenir le nom du déploiement, faiteskubectl get deployments
Vasanth Sriram

Réponses:


291

Vous devez supprimer le déploiement, ce qui devrait à son tour supprimer les pods et les jeux de répliques https://github.com/kubernetes/kubernetes/issues/24137

Pour répertorier tous les déploiements:

kubectl get deployments --all-namespaces

Ensuite, pour supprimer le déploiement:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Où NAMESPACE est l'espace de noms dans lequel il se trouve et DEPLOYMENT est celui namedu déploiement.

Dans certains cas, il peut également être en cours d'exécution en raison d'un travail ou d'un ensemble de démons. Vérifiez les éléments suivants et exécutez la commande de suppression appropriée.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
Comment ramener le déploiement par la suite?
Jamey

1
@Jamey vous le créez à nouveau avec la kubectl createcommande.
Illya Gerasymchuk

1
n'a pas besoin d'être un déploiement. pourrait être un travail. alors assurez-vous de vérifier égalementkubectl get jobs
bucky

Pour supprimer plusieurs types d'objets, pas seulement des déploiements, essayez:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

19

Au lieu d'essayer de déterminer s'il s'agit d'un déploiement, d'un désamorçage, d'un état complet ... ou de quoi (dans mon cas, c'était un contrôleur de réplication qui continuait à couvrir de nouveaux pods :) Afin de déterminer ce qui continuait à couvrir l'image, je obtenu toutes les ressources avec cette commande:

kubectl get all

Bien sûr, vous pouvez également obtenir toutes les ressources de tous les espaces de noms:

kubectl get all --all-namespaces

ou définissez l'espace de noms que vous souhaitez inspecter:

kubectl get all -n NAMESPACE_NAME

Une fois que j'ai vu que le contrôleur de réplication était responsable de mon problème, je l'ai supprimé:

kubectl delete replicationcontroller/CONTROLLER_NAME


14

si votre pod a un nom comme name-xxx-yyy, il pourrait être contrôlé par un replicasets.apps nommé name-xxx, vous devez d'abord supprimer ce réplicaset avant de supprimer le pod

kubectl delete replicasets.apps name-xxx


1
Merci! Pour mon cas, c'était un travail spécifique qui le recréait. Donc:kubectl delete --all jobs -n <namespace>
yclian

Trouvez la réplique avec kubectl get replicasets.apps -n <namespace>(ou --all-namespaces)
Noam Manos

9

Recherchez également les ensembles avec état

kubectl get sts --all-namespaces

pour supprimer tous les ensembles avec état dans un espace de noms

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

pour les supprimer un par un

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

gitlab-gitaly était là pour moi. Merci! Cela l'a résolu.
Kevin C

6

Dans certains cas, les pods ne disparaîtront toujours pas même lors de la suppression du déploiement. Dans ce cas, pour forcer leur suppression, vous pouvez exécuter la commande ci-dessous.

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


Cela ne résoudra pas le problème lorsque le pod est créé par le déploiement, les travaux ou tout autre type de contrôleurs si le type de stratégie est défini sur Recreate.
SK Venkat

5

Cela fournira des informations sur tous les pods, déploiements, services et travaux dans l'espace de noms.

kubectl get pods,services, deployments, jobs

les pods peuvent être créés par des déploiements ou des travaux

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

Si vous supprimez le déploiement ou le travail, le redémarrage des pods peut être arrêté.


5

De nombreuses réponses ici indiquent de supprimer un objet k8s spécifique, mais vous pouvez supprimer plusieurs objets à la fois, au lieu d'un par un:

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

Dans mon cas, j'exécute un cluster OpenShift avec OLM - Operator Lifecycle Manager . OLM est celui qui contrôle le déploiement, donc lorsque j'ai supprimé le déploiement, il n'était pas suffisant d'empêcher les pods de redémarrer.

Ce n'est que lorsque j'ai supprimé OLM et son abonnement que le déploiement, les services et les pods ont disparu.

Commencez par lister tous les objets k8s dans votre espace de noms:

$ 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 n'est pas répertorié avec get all, donc je le recherche spécifiquement:

$ 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 

Supprimez maintenant tous les objets, y compris les OLM, les abonnements, les déploiements, les jeux 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

Répertoriez les objets - tout est parti:

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

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

4

Lorsque le pod se recrée automatiquement, même après la suppression manuelle du pod, ces pods ont été créés à l'aide du déploiement. Lorsque vous créez un déploiement, il crée automatiquement un ReplicaSet et des pods. En fonction du nombre de réplicas de votre pod que vous avez mentionnés dans le script de déploiement, il créera ce nombre de pods initialement. Lorsque vous essayez de supprimer manuellement un pod, il le créera à nouveau automatiquement.

Oui, parfois vous devez supprimer les pods avec force. Mais dans ce cas, la commande de force ne fonctionne pas.


Je reçois un avertissement lorsque j'essaye ceci que le pod peut vivre comme un processus zombie, donc ce n'était pas ce que je voulais ..
Chanoch

4

Au lieu de supprimer NS, vous pouvez essayer de supprimer replicaSet

kubectl get rs --all-namespaces

Puis supprimez le replicaSet

kubectl delete rs your_app_name

2

Après avoir suivi un didacticiel interactif, je me suis retrouvé avec un tas de pods, de services, de déploiements:

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

Pour tout nettoyer, delete --alla bien fonctionné:

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

Cela m'a laissé (ce que je pense être) un cluster Kubernetes vide:

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 vous avez un travail qui continue à s'exécuter, vous devez rechercher le travail et le supprimer:

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

et

kubectl delete job <job-name>


1

Vous pouvez kubectl get replicasetsvérifier l'ancien déploiement en fonction de l'âge ou de l'heure

Supprimer l'ancien déploiement en fonction de l'heure si vous souhaitez supprimer le même module d'application en cours d'exécution

kubectl delete replicasets <Name of replicaset>

1

J'ai également rencontré le problème, j'ai utilisé la commande ci-dessous pour supprimer le déploiement.

kubectl delete deployments DEPLOYMENT_NAME

mais les pods étaient toujours en train de recréer, j'ai donc croisé le jeu de répliques en utilisant la commande ci-dessous

kubectl get rs

puis modifiez le réplicaset de 1 à 0

kubectl edit rs REPICASET_NAME

1

La cause principale de la question posée était l'attribut de spécification de déploiement / travail / réplicasets strategy->typequi définit ce qui doit se passer lorsque le pod sera détruit (implicitement ou explicitement). Dans mon cas, c'était le cas Recreate.

Selon la réponse de @ nomad , la suppression du déploiement / du travail / des réplicasets est une solution simple pour éviter d'expérimenter des combinaisons mortelles avant de gâcher le cluster en tant qu'utilisateur novice.

Essayez les commandes suivantes pour comprendre les actions en coulisse avant de passer au débogage:

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

1

Dans mon cas, j'ai déployé via un fichier YAML comme kubectl apply -f deployment.yamlet la solution semble être de supprimer viakubectl delete -f deployment.yaml


0

J'ai rencontré un problème similaire: après la suppression du déploiement ( kubectl delete deploy <name>), les pods sont restés "en cours d'exécution" et ont été automatiquement recréés après la suppression ( kubectl delete po <name>).

Il s'est avéré que le jeu de réplicas associé n'était pas supprimé automatiquement pour une raison quelconque, et après avoir supprimé cela ( kubectl delete rs <name>), il était possible de supprimer les pods.


0

Avec les déploiements qui ont des ensembles avec état (ou des services, des travaux, etc.), vous pouvez utiliser cette commande:

Cette commande met fin à tout ce qui s'exécute dans le <NAMESPACE>

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

Et énergique

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.