Qual è il modo giusto per liberare kubernetes risorse per un lavoro che non riesce kubernetes tirando l'immagine?

voti
0

Contesto

Abbiamo a lungo l'esecuzione di lavori kubernetes sulla base di contenitori docker. I contenitori ha bisogno di risorse (ad esempio di memoria 15GB, 2 CPU) e usiamo autoscaler di scalare fino nuovi nodi lavoratore su richiesta.

Scenario

Gli utenti possono selezionare la versione dell'immagine finestra mobile da utilizzare per un posto di lavoro, ad esempio, 1.0.0, 1.1.0, o anche un commit hash del codice dell'immagine è stato costruito da in ambiente di test.

Mentre lasciamo il tag finestra mobile da FREETEXT, l'utente può digitare un tag finestra mobile non-esistente. A causa di questo baccello lavoro entra in stato ImagePullBackOff. Il pod rimane in questo stato e mantiene le risorse bloccate in modo che non possono essere riutilizzati da qualsiasi altro lavoro.

Domanda

Qual è la soluzione giusta, che può essere applicata in kubernetes sé, per non aver immediatamente o almeno rapidamente il baccello se un tiro non riesce un'immagine finestra mobile inesistente a causa di: tag?

possibilità

Ho guardato in backofflimit. Ho impostato a 0, ma questo non fallire o rimuovere il lavoro. Le risorse sono naturalmente tenute pure.

Forse possono essere uccisi da un job cron. Non sei sicuro di come farlo.

Idealmente, le risorse dovrebbero nemmeno essere assegnati per un lavoro con un'immagine inesistente finestra mobile. Ma io non sono sicuro se v'è la possibilità di raggiungere facilmente questo.

Qualsiasi altro?

È pubblicato 24/10/2019 alle 11:53
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

È possibile utilizzare failedJobsHistoryLimitper i lavori non riusciti e successfulJobsHistoryLimitper i lavori di successo

Con questi due parametri, è possibile mantenere il vostro lavoro storia pulita

.spec.backoffLimit per specificare il numero di tentativi prima di considerare un lavoro come non riuscito.

Risposto il 24/10/2019 a 12:16
fonte dall'utente

voti
0

Quando A completa di lavoro, non vengono creati altri baccelli, ma i baccelli non vengono cancellati neanche.

Per impostazione predefinita, un lavoro verrà eseguito senza interruzioni a meno che un Pod fallisce (restartPolicy = mai) o un contenitore di uscite per errore (restartPolicy = OnFailure), a questo punto le rinvia lavoro alla .spec.backoffLimit sopra descritti. Una volta che è stato raggiunto .spec.backoffLimit il lavoro verrà contrassegnato come non riuscito e qualsiasi Pods esecuzione sarà terminato.

Un altro modo per terminare un lavoro è impostando una scadenza attiva. A tale scopo, l'impostazione del .spec.activeDeadlineSeconds campo del lavoro a un certo numero di secondi. I activeDeadlineSeconds vale per la durata del lavoro, non importa come si creano molti baccelli. Una volta che un lavoro raggiunge activeDeadlineSeconds, tutti i suoi baccelli in esecuzione sono terminati e lo stato del lavoro diventerà tipo: Impossibile con la ragione: DeadlineExceeded.

Si noti che è un lavoro .spec.activeDeadlineSeconds ha la precedenza sulla sua .spec.backoffLimit . Pertanto, un lavoro che è di ritentare una o più Pods falliti non distribuire Pods aggiuntivi una volta raggiunto il limite di tempo specificato da activeDeadlineSeconds , anche se il backoffLimit non è ancora raggiunto.

Ecco ulteriori informazioni: posti di lavoro .

È inoltre possibile impostare-up concurrencyPolicy di cronjob per Sostituire e sostituire il lavoro attualmente in esecuzione con un nuovo lavoro.

Ecco un esempio:

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

Impostazione Sostituire valore concurrencyPolicy mezzi di bandiera se è il momento per una nuova esecuzione lavoro e la precedente esecuzione di posti di lavoro non è ancora finito, il lavoro cron sostituisce l'esecuzione del lavoro attualmente in esecuzione con una nuova corsa di lavoro.

Indipendentemente da questa soluzione il problema sta nella immagini sbagliate in modo automatizzato l'eliminazione di baccelli o posti di lavoro non risolvere il problema. Perché se non si cambia nulla nella definizione dei posti di lavoro e immagini vostri baccelli saranno ancora fallire dopo aver creato di nuovo lavoro.

Ecco esempio di risoluzione dei problemi per errore: ImagePullBackOff Normale backoff: ImagePullBackOff .

Risposto il 25/10/2019 a 10:27
fonte dall'utente

voti
0

Dopo aver guardato il vostro disegno, mi sento di raccomandare di aggiungere InitContainer alle specifiche di lavoro per verificare l'esistenza di immagini della finestra mobile con il tag dato.

Se l'immagine con il tag non esiste nel Registro di sistema, InitContainer può segnalare un errore e non riuscire Pod del lavoro uscendo con il codice di uscita diverso da zero.

Dopo Pod di quel lavoro sarà riavviato . Dopo un certo numero di tentativi di lavoro otterrà FailedStato. Configurando .spec.ttlSecondsAfterFinished opzione, i processi non riusciti possono essere spazzati via.

Se il contenitore di init di un Pod fallisce, kubernetes riavvia ripetutamente il Pod fino a quando il contenitore di init riesce. Tuttavia, se il Pod ha una restartPolicy di Never, kubernetes non riavviare il Pod.

Se esiste l'immagine, InitContainer script si chiude con l'immagine principale contenitore di lavoro pari a zero il codice di uscita e sta per essere tirato e si avvia container.

Risposto il 01/11/2019 a 20:55
fonte dall'utente

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