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?
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
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`
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
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
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.
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)
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
Cela fonctionne très bien pour moi:
kubectl delete jobs $(kubectl get jobs -o custom-columns=:.metadata.name)
kubectl delete jobs --all --cascade=false
est rapide, mais ne supprimera pas les ressources associées, telles que les pods
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.