Kubernetes

Lavori Kubernetes e Cron Job

Lavori Kubernetes e Cron Job
La maggior parte delle applicazioni eseguite su un sistema distribuito come Kubernetes sono sempre attive come server Web o database o server API. Ma ci sono una classe separata di oggetti che sono pensati per essere eseguiti una volta o solo per svegliarsi ogni tanto ed eseguire il loro corso. I lavori periodici come i rinnovi dei certificati TLS con agenti come Certbot sono un classico esempio di tali lavori in esecuzione su server tradizionali. Questi vengono eseguiti utilizzando l'utility Cron nei sistemi Unix.

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/v1
tipo: 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.igname

Noterai 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 pod
NOME       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.igname

Puoi 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/v1beta1
tipo: 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,

  1. Minuto (0-59)
  2. Ora (0-23)
  3. Giorno del mese (1-31)
  4. Mese (1-12)
  5. 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 pod
NOME                    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-hfhzf

Per eliminare il cronjob è sufficiente eseguire:

$ kubectl delete -f mio-cronjob.igname

Questo 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.

I migliori giochi da giocare con il tracciamento delle mani
Oculus Quest ha recentemente introdotto la grande idea del tracciamento manuale senza controller. Con un numero sempre crescente di giochi e attività ...
Come mostrare l'overlay OSD in app e giochi Linux a schermo intero
Giocare a giochi a schermo intero o utilizzare app in modalità a schermo intero senza distrazioni può tagliarti fuori dalle informazioni di sistema ri...
Le 5 migliori carte di acquisizione del gioco
Abbiamo tutti visto e amato i giochi in streaming su YouTube. PewDiePie, Jakesepticye e Markiplier sono solo alcuni dei migliori giocatori che hanno g...