web-dev-qa-db-fra.com

Kubernetes - supprimer toutes les tâches en masse

Je peux supprimer tous les travaux dans un cluster en cours d'exécution

kubectl delete jobs --all 

Cependant, les travaux sont supprimés les uns après les autres, ce qui est assez lent (pour environ 200 travaux, j'ai eu le temps d'écrire cette question et cela n'a même pas été fait).

Existe-t-il une approche plus rapide?

18
Overdrivr

J'ai un script de suppression qui a été plus rapide à supprimer:

$ cat deljobs.sh 
set -x

for j in $(kubectl get jobs -o custom-columns=:.metadata.name)
do
    kubectl delete jobs $j &
done

Et pour créer 200 jobs, utilisez le script suivant avec la commande for i in {1..200}; do ./jobs.sh; done

$ cat jobs.sh 
kubectl run memhog-$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1)  --restart=OnFailure --record --image=derekwaynecarr/memhog --command -- memhog -r100 20m
11
surajd

Il est un peu plus facile de configurer un alias pour cette commande bash:

kubectl delete jobs `kubectl get jobs -o custom-columns=:.metadata.name`
19
jaydeland

Si vous utilisez CronJob et que ceux-ci s'accumulent rapidement, vous pouvez laisser kubernetes les supprimer automatiquement en configurant la limite d'historique des travaux décrite dans documentation . Cela est valable à partir de la version 1.6.

...
  spec:
    ...
    successfulJobsHistoryLimit: 3
    failedJobsHistoryLimit: 3
11
yasc

J'utilise ce script, il est rapide mais il peut détruire le CPU (un processus par job), vous pouvez toujours ajuster le paramètre sleep:

#!/usr/bin/env bash

echo "Deleting all jobs (in parallel - it can trash CPU)"

kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do
  echo "Running with: ${line}"
  kubectl delete jobs ${line} &
  sleep 0.05
done
4
Paweł Prażak

La meilleure façon pour moi est (pour les travaux terminés de plus d'un jour):

kubectl get jobs | grep 1/1 | gawk 'match($0, / ([0-9]*)h/, ary) { if(ary[1]>24) print $1}' | parallel -r --bar -P 32 kubectl delete jobs

grep 1/1 Pour les travaux terminés

gawk 'match($0, / ([0-9]*)h/, ary) { if(ary[1]>24) print $1}' pour les travaux de plus d'un jour

-P Nombre de processus parallèles

Il est plus rapide que kubectl delete jobs --all, Possède une barre de progression et vous pouvez l'utiliser lorsque certains travaux sont encore en cours d'exécution.

2
FullMoon

Paralléliser en utilisant GNU parallel

parallel --jobs=5 "echo {}; kubectl delete jobs {} -n core-services;" ::: $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}'  -n core-services)
1
Vikas Kumar

Le plugin Kubectl bulk (action en masse sur krew) peut vous être utile, il vous donne des opérations en masse sur les ressources sélectionnées. Il s'agit de la commande de suppression des travaux 'suppression des travaux en bloc kubectl'

Vous pouvez vérifier les détails dans https://github.com/emreodabas/kubectl-plugins/blob/master/README.md#kubectl-bulk-aka-bulk-action

0
Emre Odabaş

Cela fonctionne très bien pour moi:

kubectl delete jobs $(kubectl get jobs -o custom-columns=:.metadata.name)

0
Cizer Pereira

kubectl delete jobs --all --cascade=false est rapide, mais ne supprimera pas les ressources associées, telles que les pods

https://github.com/kubernetes/kubernetes/issues/8598

0
Maximilian

Il n'y a probablement pas d'autre moyen de supprimer tous les travaux à la fois, car même kubectl delete jobs interroge également un travail à la fois, ce que Norbert van Nobelen suggère d'obtenir un résultat plus rapide, mais cela fera beaucoup de différence.

0
Suraj Narwade