Quelle est la bonne façon de libérer des ressources Kubernetes pour un emploi de Kubernetes qui ne réussit pas tirer l'image?

voix
0

Le contexte

Nous avons longtemps l'exécution des travaux de Kubernetes en fonction des conteneurs docker. Les conteneurs a besoin de ressources (mémoire de 15 Go, 2 cpu) et nous utilisons autoscaler à l'échelle de nouveaux nœuds de travailleurs à la demande.

Scénario

Les utilisateurs peuvent sélectionner la version de l'image docker à utiliser pour un emploi, par exemple 1.0.0, 1.1.0, ou même un commit hachage du code de l'image a été construit à partir dans un environnement de test.

Alors que nous quittons la balise docker à FreeText, l'utilisateur peut saisir une balise docker non existante. En raison de ce pod d'emploi est dans l'état ImagePullBackOff. La nacelle reste dans cet état et maintient les ressources verrouillées afin qu'ils ne peuvent pas être réutilisés par tout autre emploi.

Question

Quelle est la bonne solution, qui peut être appliqué dans Kubernetes lui-même, pour ne pas la nacelle immédiatement ou au moins rapidement si une traction échoue en raison d'une image docker non existant: tag?

possibilités

Je regardais dans backofflimit. Je l'ai mis à 0, mais cela ne manque pas ou supprimer le travail. Les ressources sont bien sûr conservées aussi bien.

Peut-être qu'ils peuvent être tués par une tâche cron. Je ne sais pas comment le faire.

Idéalement, les ressources ne devraient même pas être affectés à un emploi avec une image de docker unexisting. Mais je ne sais pas s'il est possible d'atteindre facilement ce.

Tout autre?

Créé 24/10/2019 à 11:53
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Vous pouvez utiliser failedJobsHistoryLimitpour des travaux ayant échoué et successfulJobsHistoryLimitpour les emplois de succès

Avec ces deux paramètres, vous pouvez garder votre propre histoire de l'emploi

.spec.backoffLimit de préciser le nombre de tentatives avant d'envisager un emploi comme ayant échoué.

Créé 24/10/2019 à 12:16
source utilisateur

voix
0

Lorsqu'un finalise l'emploi, plus de pods sont créés, mais les gousses ne sont pas supprimés soit.

Par défaut, un emploi se déroulera sans interruption , sauf si un Pod échoue (restartPolicy = Jamais) ou un conteneur sorties par erreur (restartPolicy = onFailure), à quel point les Reporte de l' emploi au .spec.backoffLimit décrit ci - dessus. Une fois .spec.backoffLimit a atteint l'emploi sera marqué comme ayant échoué et les pods en cours d' exécution seront terminés.

Une autre façon de mettre fin à un emploi est en fixant une date limite active. Pour ce faire , en réglant le .spec.activeDeadlineSeconds domaine de l'emploi à un certain nombre de secondes. Les activeDeadlineSeconds applique à la durée du travail, peu importe combien de pods sont créés. Une fois atteint un emploi activeDeadlineSeconds, tous ses pods en cours d' exécution sont terminées et le statut d'emploi deviendra Type: failed avec raison: DeadlineExceeded.

Notez que d'un emploi de .spec.activeDeadlineSeconds a priorité sur sa .spec.backoffLimit . Par conséquent, un travail qui est Retrying un ou plusieurs échecs pods ne se déploieront pas pods supplémentaires une fois qu'il atteint le délai fixé par activeDeadlineSeconds , même si le backoffLimit est pas encore atteint.

Voici plus d' informations: emplois .

Vous pouvez également mettre en place concurrencyPolicy de cronjob pour remplacer et remplacer le travail en cours d' exécution avec un nouvel emploi.

Voici un exemple:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/2 * * * *"
  concurrencyPolicy: Replace
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster && sleep 420
          restartPolicy: Never

Réglage Remplacer la valeur pour concurrencyPolicy moyen de drapeau s'il est temps pour un nouveau cycle de travail et l'exécution d' un travail précédent n'a pas encore terminé, la tâche cron remplace la course de travail en cours d' exécution avec un nouveau cycle de travail.

Quelle que soit cette solution votre problème réside dans de mauvaises images de façon automatisée ou la suppression des gousses d'emplois ne résout pas le problème. Parce que si vous ne changez rien dans la définition des emplois et des images de vos dosettes seront toujours pas après avoir créé de nouveau travail.

Voici exemple de dépannage pour erreur: ImagePullBackOff normale BackOff: ImagePullBackOff .

Créé 25/10/2019 à 10:27
source utilisateur

voix
0

Après avoir regardé votre conception, je recommande d'ajouter InitContainer aux spécifications d' emploi pour vérifier l' existence d'images docker avec l'étiquette donnée.

Si l'image avec l'étiquette n'existe pas dans le registre, InitContainer peut signaler une erreur et l'échec Pod du travail en sortant avec le code de sortie non nul.

Après Pod Job sera redémarré . Après certain nombre de tentatives d' emploi va obtenir l' Failedétat. En configurant .spec.ttlSecondsAfterFinished l' option, les travaux ayant échoué peuvent être anéanties.

Si un Pod ne contenant init, Kubernetes redémarre à plusieurs reprises le Pod jusqu'à ce que le conteneur init réussit. Cependant, si le Pod a une restartPolicy de Never, Kubernetes ne redémarre pas le Pod.

Si l'image existe, sorties de script InitContainer avec zéro code de sortie et l'image principale du conteneur d'emploi va être tiré et conteneurs commence.

Créé 01/11/2019 à 20:55
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more