Kubernetes ha un modo analogo di eseguire processi una tantum Lavori e processi periodici come lavori cron.
Inizieremo con un tipico esempio di cosa sono i lavori e dimostreremo un esempio standard dai documenti ufficiali. Da questo esempio sarà facile capire cosa significa eseguire con successo un Job nel contesto di Kubernetes.
Per seguire, ti consiglierei di utilizzare Kataconda Playground per Kubernetes che fornirà un cluster Kubernetes pronto all'uso senza che tu debba configurarne uno manualmente o rischiare un cluster di produzione per gli esperimenti.
Kubernetes Jobs
I lavori sono astrazioni Kubernetes di livello superiore, simili a ReplicaSet e Deployment. Ma a differenza dei pod gestiti da distribuzioni e ReplicaSet, i pod che eseguono un lavoro completano il loro lavoro ed escono.
Quando un numero specificato di pod raggiunge il completamento, si dice che il lavoro è stato completato con successo. Quali sono i criteri che definiscono una terminazione riuscita di un pod è qualcosa che definiremo nel file YAML del lavoro Job. Quindi il controller del lavoro assicurerà che un certo numero di pod sia stato terminato con successo e che il lavoro sia considerato completo.
Creiamo un lavoro che stampi cifre di pi greco fino a 2000 posti nei suoi log che esamineremo. Crea un file e chiamalo il mio lavoro.igname e salva al suo interno i seguenti contenuti;
apiVersion: batch/v1tipo: Lavoro
metadati:
nome: pi
specifica:
modello:
specifica:
contenitori:
- nome: pi
immagine: perla
comando: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
politica di riavvio: mai
limite di backoff: 4
Crea il lavoro, usando questo file:
$ kubectl create -f ./lavoro.ignameNoterai che il lavoro richiede da pochi secondi a un paio di minuti per essere eseguito e una volta terminato. Quando provi a elencare tutti i pod utilizzando:
$ kubectl ottieni podNOME PRONTO STATUS RIAVVIA ETÀ
pi-wg6zp 0/1 Completato 0 50s
Vedrai che lo stato del pod correlato a pi è Completato non in esecuzione o terminato.Puoi anche copiare il nome del pod in modo che possiamo verificare che pi sia stato effettivamente calcolato a 2000 cifre. Il nome specifico del pod potrebbe differire nel tuo caso.
$ kubectl registra pi-wg6zpÈ interessante notare che il pod non ha Terminato è ancora molto attivo, solo che non ci sono applicazioni in esecuzione al suo interno. Simile ad accendere il computer e non usarlo. Se il pod fosse stato terminato, non saremmo stati in grado di estrarre i registri da esso, in primo luogo.
Per ripulire il lavoro e tutti i pod che sono stati creati, esegui il comando:
$ kubectl delete -f i miei lavori.ignamePuoi saperne di più sulle specifiche del lavoro e su come scrivere le tue specifiche nella documentazione ufficiale.
Cron Jobs
I Cron Jobs sono simili all'utility Cron in Unix che viene eseguita periodicamente secondo una pianificazione che desideriamo. Non è una cosa superstabile in Kubernetes, al momento in cui scriviamo, quindi potresti voler stare attento usando. Per citare i documenti ufficiali:
“Un cron job crea un job object di una volta per tempo di esecuzione del suo programma. Diciamo "circa" perché ci sono determinate circostanze in cui potrebbero essere creati due posti di lavoro o non potrebbe essere creato alcun posto di lavoro. Cerchiamo di renderli rari, ma non li preveniamo del tutto. Pertanto, i lavori dovrebbero essere idempotente"
Il termine idempotente significa che il Cron Job se eseguito una o due volte o un numero qualsiasi di volte avrebbe lo stesso effetto sul sistema. Controllare gli aggiornamenti, monitorare questo tipo di operazioni può essere considerato idempotente. Ma modificare i dati o scrivere su un database non sono tra questi.
Scriviamo un cron job che scriverebbe un "Hello, World!"messaggio nei suoi registri insieme a un timestamp di quando è stato scritto quel messaggio. Crea un file chiamato mio-cronjob.yaml e ad esso scrivi i seguenti contenuti:
apiVersion: batch/v1beta1tipo: CronJob
metadati:
nome: mio-cronjob
specifica:
programma: "*/1 * * * *"
modello di lavoro:
specifica:
modello:
specifica:
contenitori:
- nome: ciao
immagine: occupato
argomenti:
- /bin/sh
- -c
- Data; echo Hello dal cluster Kubernetes
restartPolicy: OnFailure
La parte della pianificazione del lavoro è la più cruciale. Segue la convenzione Cron standard, c'è un elenco di numeri separati da spazi. I cinque numeri rappresentano,
- Minuto (0-59)
- Ora (0-23)
- Giorno del mese (1-31)
- Mese (1-12)
- Giorno della settimana (0-6) a partire da domenica
Usando l'asterisco (*) per campo significa qualsiasi valore disponibile di quel campo (come un carattere jolly) e la prima voce nella nostra pianificazione "*/1 * * * *" indicava che il lavoro deve essere eseguito ogni minuto indipendentemente dall'ora, giorno o mese di l'anno. Usando */5 stamperai il messaggio ogni 5 minuti.
Puoi saperne di più sulle specifiche di cronjob yaml nei documenti ufficiali. Vediamo tutti i pod in esecuzione per il lavoro, che abbiamo chiamato my-cronjob.
$ kubectl ottieni podNOME PRONTO STATUS RIAVVIA ETÀ
my-cronjob-1534457100-hfhzf 0/1 Completato 0 2 m
my-cronjob-1534457160-gk85l 0/1 Completato 0 1 m
my-cronjob-1534457220-bj22x 0/1 Completato 0 57 secondi
Scavare nei log di ciascuno dei pod rivelerebbe un singolo messaggio con un timestamp, poiché sono stati tutti creati in momenti diversi, avranno tutti timestamp diversi.
$ kubectl log mio-cronjob-1534457100-hfhzfPer eliminare il cronjob è sufficiente eseguire:
$ kubectl delete -f mio-cronjob.ignameQuesto eliminerà anche tutti i pod che sono stati creati nel giusto processo.
Riferimenti
Puoi saperne di più sui lavori Kubernetes qui e per i lavori Cron puoi visitare questa sezione della loro documentazione ben strutturata.