Commande pour supprimer tous les pods dans tous les espaces de noms Kubernetes

154

En regardant la documentation, il y a un appel API pour supprimer un pod, mais existe-t-il un moyen de tuer tous les pods dans tous les espaces de noms?

user_mda
la source

Réponses:

283

Il n'y a pas de commande pour faire exactement ce que vous avez demandé.

Voici quelques matchs serrés.

Vous pouvez supprimer tous les pods dans un seul espace de noms avec cette commande:

kubectl delete --all pods --namespace=foo

Vous pouvez également supprimer tous les déploiements dans l'espace de noms, ce qui supprimera tous les pods attachés aux déploiements correspondant à l'espace de noms

kubectl delete --all deployments --namespace=foo

Vous pouvez supprimer tous les espaces de noms et tous les objets dans chaque espace de noms (mais pas les objets sans espace de noms, comme les nœuds et certains événements) avec cette commande:

kubectl delete --all namespaces

Cependant, cette dernière commande n'est probablement pas quelque chose que vous voulez faire, car elle supprimera des éléments dans l'espace de noms kube-system, ce qui rendra votre cluster inutilisable.

Cette commande supprimera tous les espaces de noms sauf kube-system, ce qui pourrait être utile:

for each in $(kubectl get ns -o jsonpath="{.items[*].metadata.name}" | grep -v kube-system);
do
  kubectl delete ns $each
done
Eric Tune
la source
1
Avec la version actuelle de k8s, la commande "kubectl delete --all namespaces" ne supprime plus les éléments du système ... Elle dit par exemple: les namespaces "default" sont interdits: cet espace de noms ne peut pas être supprimé
Kai Wähner
Cela supprime-t-il le déploiement ou uniquement les pods?
Sinaesthetic
1
kubectl delete pods --all --all-namespacessemble fonctionner parfois (pas sûr de ce qui le fait fonctionner dans certains environnements et pas dans d'autres). Cela fonctionne bien depuis mon hôte bastion mais pas depuis un ordinateur portable. Les deux exécutant Debian et les deux exécutant la même version de kubectl (cluster version 1.13)
Patrick W
@ KaiWähner si je ne me trompe pas, les éléments liés au système k8s sont dans l' kube-systemespace de noms. Dans l'exemple de message, je peux voir l' defaultespace de noms. Est-il kube-systemsupprimé avec la commande que vous avez jointe?
George Tseres
79
kubectl delete daemonsets,replicasets,services,deployments,pods,rc --all

pour se débarrasser de ces contrôleurs de réplication encombrants aussi.

Jason
la source
4
C'est faux. Cela ne supprime que dans l'espace de noms actuel.
Aidez
Ajoutez l'indicateur -n, mais désolé, c'est pour un pod à la fois et pas tous à la fois
grbonk
1
Vous ingmanquez pour supprimer également les entrées
Druska
2
vous pouvez également ajouter "statefulset" (le cas échéant). Sinon, il continuera à créer de nouveaux pods même après avoir exécuté la commande ci-dessus!
buch11
15

Il vous suffit sedde faire ceci:

kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(\S+)\s+(\S+).*/kubectl --namespace \1 delete pod \2/e'

Explique:

  1. utilisez la commande kubectl get pods --all-namespacespour obtenir la liste de tous les pods dans tous les espaces de noms.
  2. utilisez l' --no-headers=trueoption pour masquer les en-têtes.
  3. utilisez la scommande de sedpour récupérer les deux premiers mots, qui représentent namespaceet pod's namerespectivement, puis assemblez la deletecommande en les utilisant.
  4. la dernière deletecommande est comme: kubectl --namespace kube-system delete pod heapster-eq3yw.
  5. utilisez le emodificateur de scommande pour exécuter la commande assemblée ci-dessus, qui fera les deletetravaux réels .

Pour éviter de supprimer des pods dans l' kube-systemespace de noms, il suffit d'ajouter grep -v kube-systempour exclure l' kube-systemespace de noms avant la sedcommande.

Weike
la source
Vous pouvez également simplement déposer --all-namespacessi vous ne souhaitez pas supprimer les pods dans l' kube-systemespace de noms
ianstarz
Quelle sera la commande pour supprimer seulement quelques pods? Exemple: j'ai fait tourner 20 Pod et je souhaite maintenant n'en garder que 1.
Jason
11

Vous pouvez simplement courir

kubectl delete all --all --all-namespaces
  • Le premier alldésigne les types de ressources courants (pods, réplicasets, déploiements, ...)

    • kubectl get all == kubectl get pods,rs,deployments, ...
  • Le deuxième --allmoyen de sélectionner toutes les ressources des types sélectionnés


Notez que cela alln'inclut pas:

  • ressources sans espace de noms (par exemple, liaisons de rôle de cluster, rôles de cluster, ...)
  • configmaps
  • liaisons de rôle
  • les rôles
  • secrets
  • ...

Afin de nettoyer parfaitement,

  • vous pouvez utiliser d'autres outils (par exemple, Helm, Kustomize, ...)
  • vous pouvez utiliser un espace de noms.
  • vous pouvez utiliser des étiquettes lorsque vous créez des ressources.
Mo K
la source
2

Voici un one-liner qui peut être étendu avec grep pour filtrer par nom.

kubectl get pods -o jsonpath="{.items[*].metadata.name}" | \
tr " " "\n" | \
xargs -i -P 0 kubectl delete pods {}
Claudio Fahey
la source
1
kubectl delete po,ing,svc,pv,pvc,sc,ep,rc,deploy,replicaset,daemonset --all -A
Braconnot_P
la source
Faites attention! Comme PV n'est pas espacé, la commande ci-dessus supprimera tous les PV à l'échelle du cluster.
Ahmad Ahmadi
0

Si vous avez déjà des pods qui sont recréés, pensez d'abord à supprimer tous les déploiements

kubectl delete -n *NAMESPACE deployment *DEPLOYMENT

Remplacez simplement le NAMSPACE et le DÉPLOIEMENT par ceux correspondants, vous pouvez obtenir toutes les informations de déploiement par la commande suivante

kubectl get deployments --all-namespaces
Smaillns
la source
0

Le plugin Kubectl bulk (bulk-action on krew) peut vous être utile, il vous donne des opérations en masse sur les ressources sélectionnées. Ceci est la commande pour supprimer les pods

 ' kubectl bulk pods -n namespace delete '

Vous pouvez vérifier les détails dans ce

Emre Odabaş
la source
0

Je crée un code python pour tout supprimer dans l'espace de noms

delall.py

import json,sys,os;

obj=json.load(sys.stdin);
for item in obj["items"]:
        os.system("kubectl delete " + item["kind"] + "/" +item["metadata"]["name"] + " -n yournamespace")

puis

kubectl get all -n kong -o json | python delall.py
user2218085
la source
0

K8s fonctionne complètement sur les fondamentaux de l'espace de noms. si vous souhaitez libérer toutes les ressources liées à l'espace de noms spécifié.

vous pouvez utiliser les éléments mentionnés ci-dessous:

kubectl supprimer l'espace de noms k8sdemo-app

Sachin Mishra
la source