web-dev-qa-db-fra.com

Kubernetes Job Cleanup

D'après ce que j'ai compris, l'objet Job est censé récolter des pods après un certain temps . Mais sur mon cluster GKE (Kubernetes 1.1.8), il semble que "kubectl get pods -a" puisse lister les pods des jours précédents. 

Tous ont été créés à l'aide de l'API Jobs.

J'ai remarqué qu'après avoir supprimé le travail avec kubectl delete jobs Les pods ont également été supprimés.

Ma principale préoccupation ici est que je vais exécuter des travaux par lots sur des milliers et des dizaines de milliers de pods sur le cluster et que je ne veux pas surcharger le système de traitement en attente interne.

16
Lior Regev

Cela ressemble à partir de Kubernetes 1.6 (et de la version de v2alpha1 api), si vous utilisez des tâches cron pour créer les travaux (qui à leur tour créent vos pods), vous pourrez limiter combien d’anciens les emplois sont conservés. Ajoutez simplement ce qui suit à votre cahier des charges:

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

Où X et Y sont les limites du nombre de tâches exécutées précédemment que le système doit conserver (il conserve les tâches indéfiniment par défaut [au moins sur la version 1.5.])

Modifier 2018-09-29:

Pour les versions plus récentes de K8S, les liens mis à jour avec la documentation à cet effet se trouvent ici:

38
JJC

C'est le comportement souhaité de Jobs même dans Kubernetes 1.3. Le travail et ses modules restent dans le système jusqu'à ce que vous les supprimiez manuellement. Cela vous permet de voir les résultats des pods (c'est-à-dire via les journaux) qui n'ont pas déjà été transportés à l'extérieur par un mécanisme ou de rechercher des erreurs, des avertissements ou d'autres résultats de diagnostic.

Le moyen recommandé pour supprimer les pods/ official consiste à supprimer le travail comme indiqué ci-dessus. L'utilisation du ramasse-miettes supprime uniquement les modules, mais le travail lui-même reste dans le système.

Si vous ne souhaitez pas supprimer le travail manuellement, vous pouvez écrire un petit script en cours d'exécution dans votre cluster pour rechercher les travaux terminés et les supprimer. Malheureusement, les travaux planifiés ne sont que entrants dans la version 1.4 , mais vous pouvez exécuter le script dans un module normal à la place.

2
puja

Il est vrai que vous deviez supprimer des travaux manuellement. La réponse de @ puja était correcte au moment de la rédaction.

Kubernetes 1.12.0 a publié une fonction TTL (en alpha) dans laquelle vous pouvez la configurer pour nettoyer automatiquement les travaux un nombre spécifié de secondes après leur achèvement ( changelog ). Vous pouvez le mettre à zéro pour le nettoyage immédiat. Voir le Documents d'emploi .

Exemple de la doc:

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

Dans kubernetes v1.2, il existe un ramasse-miettes pour récupérer les pods terminés avec un seuil global --terminated-pod-gc-threshold=12500 (voir les drapeaux dans controller manager . Je ne connais pas de mécanisme de GC pour les pods terminés dans v1.1.8. Vous souhaitez exécuter un script/pod pour nettoyer périodiquement les pods/tâches afin d'éviter que les composants principaux ne soient surchargés.En passant, il existe un problème en suspens pour ajuster automatiquement le seuil GC .

1
Yu-Ju Hong

J'ai récemment construit un opérateur kubernetes 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 s’achèvent sans erreurs/redémarrages.

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

1
lwolf