117 votes

Comment supprimer automatiquement les tâches Kubernetes terminées créées par un CronJob ?

Existe-t-il un moyen de supprimer automatiquement les travaux terminés, en dehors de la création d'un CronJob pour nettoyer les travaux terminés ?

El Documentation sur les emplois du K8s indique que le comportement prévu pour les emplois terminés est qu'ils restent dans un état terminé jusqu'à ce qu'ils soient supprimés manuellement. En effet, j'exécute des milliers de tâches par jour via CronJobs et je ne souhaite pas conserver des tâches terminées.

142voto

JJC Points 1505

Vous pouvez maintenant définir des limites d'historique, ou désactiver l'historique complètement, de sorte que les CronJobs échoués ou réussis ne soient pas conservés indéfiniment. Voir ma réponse aquí . La documentation est aquí .

Pour régler le limites de l'histoire :

El .spec.successfulJobsHistoryLimit y .spec.failedJobsHistoryLimit sont facultatifs. Ces champs spécifient le nombre de travaux terminés et échoués qui doivent être conservés. Par défaut, ils sont définis respectivement sur 3 et 1. En fixant une limite à 0 correspond à ne garder aucun des types de travaux correspondants après leur fin.

La configuration avec 0 limite ressemblerait à ceci :

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 0
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

4 votes

Existe-t-il un moyen de fixer une limite de temps pour l'historique, comme supprimer les travaux réussis après une semaine ?

0 votes

Pas que je sache, désolé. Postez un suivi ici si vous trouvez un moyen. J'imagine que vous pourriez écrire une tâche cron qui regarderait les anciens timestamps des pods et supprimerait un par un ceux qui ont plus de X jours.

0 votes

Oui j'ai créé un déploiement dans kubernetes, un projet golang, créé un canal pour écouter la liste des pods et regarder le changement d'état .

31voto

rath Points 703

Ceci est possible à partir de la version 1.12 Alpha avec ttlSecondsAfterFinished . Un exemple de Nettoyer automatiquement les travaux terminés :

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-ttl
spec:
  ttlSecondsAfterFinished: 100
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

1 votes

Note that this TTL mechanism is alpha, with feature gate TTLAfterFinished Je n'ai pas compris cette partie du portail des fonctionnalités.

2 votes

Portes à fonctionnalités sont des drapeaux qui activent ou désactivent les fonctionnalités de Kubernetes. Je ne sais pas comment les configurer, ni même si vous avez la possibilité de le faire avec un service hébergé comme EKS. Je soupçonne que vous devez également configurer les nœuds maîtres, mais je ne fais que spéculer. @technazi

1 votes

Merci @rath ! Oui, pendant que je configure les tâches et les pods via les modèles Helm, je ne vois pas d'endroit où je peux configurer les portes de fonctionnalité et donc je ne suis pas en mesure d'utiliser les améliorations alpha, essentiellement parlant. ttlSecondsAfterFinished n'a aucun effet sans les portes de la fonctionnalité.

7voto

lwolf Points 528

J'ai récemment construit un kubernetes-operator pour effectuer cette tâche.

Après le déploiement, il surveillera l'espace de noms sélectionné et supprimera les travaux/pods terminés s'ils se sont déroulés sans erreur/redémarrage.

https://github.com/lwolf/kube-cleanup-operator

11 votes

Ne vous contentez pas d'afficher un outil ou une bibliothèque comme réponse. Faites au moins une démonstration comment il résout le problème dans la réponse elle-même.

5voto

Comme indiqué dans la documentation "C'est à l'utilisateur de supprimer les anciens travaux", cf. http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup

Je lancerais un pod pour faire ce nettoyage en fonction du nom du travail et de certaines conditions, laissant ainsi kubernetes s'occuper au moins de la disponibilité de votre processus ici. Vous pourriez exécuter une tâche récurrente pour cela (en supposant que vous utilisez Kubernetes 1.5).

0 votes

Ce que je ne comprends pas, c'est qu'un pod pour faire le nettoyage est maintenant dans le même espace de noms que les autres pods, comment le configurer pour se connecter au cluster initialement ?

0 votes

L'espace de nom n'est pertinent que si votre sécurité est configurée de manière très stricte (et avec les pods dans k8s fonctionnant sur des pods, votre sécurité devient un peu plus faible de toute façon). Heureusement, il y a du progrès : Le nombre de travaux autorisés à traîner a été augmenté (gcloud environ 40k au lieu des 10k précédents), et avec les cronjobs vous pouvez laisser k8s gérer cela pour vous en limitant le nombre d'anciens travaux que vous conservez.

4voto

Daishi Points 67

Un moyen simple de les supprimer consiste à exécuter une tâche cron :

kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done

2 votes

Il n'est pas conseillé d'analyser la sortie texte. Au lieu de cela, vous devriez demander un json, le parser avec jq et itérer sur le résultat.

1 votes

kubectl delete job $(kubectl get jobs -o jsonpath='{.items[?(@.status.completionTime)].metadata.name}‌​')

5 votes

Ne faites pas ça. Cela supprime les travaux en cours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X