Cosa sono i contenitori di provisioning Kubernetes e quando dovresti usarli?
I contenitori di provisioning sono il meccanismo Kubernetes per il provisioning di nuovi pod. I contenitori Init vengono avviati e chiusi prima dei contenitori delle app principali del pod, consentendo l’esecuzione degli script bootstrap in ordine sequenziale.
In questo articolo, ti mostreremo come aggiungere contenitori init a un pod e esamineremo alcuni casi d’uso comuni. Sebbene i contenitori init siano configurati in modo simile ai contenitori normali, presentano alcune differenze dovute al loro scopo speciale.
Il ruolo dei contenitori Init
I contenitori di provisioning risolvono i problemi associati all’inizializzazione delle applicazioni alla prima esecuzione. In genere, i servizi dipendono dal completamento corretto di uno script di installazione prima che possano essere avviati completamente.
Su sistemi più piccoli, puoi aggiungere lo script a un’immagine del contenitore dell’applicazione esistente. Tuttavia, questo non è l’ideale in quanto aggiunge un’altra responsabilità all’immagine. Puoi anche avere più fasi separate, ognuna con le proprie dipendenze e relazioni. L’aggiunta di tutte queste operazioni una tantum all’immagine del contenitore principale può creare rapidamente una complessità gonfia che è difficile da mantenere.
I contenitori Init risolvono questo problema consentendo di eseguire contenitori personalizzati prima dell’avvio dei contenitori dell’app del pod. Ogni modulo può avere più contenitori di inizializzazione; sono garantiti per funzionare in sequenza, solo dopo che il precedente è stato completato con successo.
Kubernetes avvia i pod regolari dopo che tutti i contenitori di inizializzazione sono stati completati. Se un contenitore init ha esito negativo, verrà riavviato prima del completamento. Se il Pod restartPolicy
è impostato su Never
, il Pod viene invece contrassegnato come guasto.
Aggiunta di contenitori Init a un pod
I contenitori di inizializzazione sono definiti in spec.initContainers
un campo manifest pod. Questo è molto simile alla solita spec.containers
definizione.
Ecco un esempio di pod con due contenitori init collegati:
Usa Kubectl per aggiungere un Pod al tuo cluster:
$ kubectl apply -f pod.yaml
pod/init-containers-pod created
Ora, estrai i log associati a ciascuno dei contenitori init per assicurarti che siano stati avviati:
$ kubectl logs init-containers-pod -c first-init-container
Questo è il primo contenitore di inizializzazione
$ kubectl logs init-containers-pod -c second-init-container
This is the second init container
Puoi utilizzare la maggior parte delle proprietà disponibili per i manifest del contenitore Kubernetes nel initContainers
campo. Questi includono volumi, porte, variabili di ambiente e contesti di sicurezza.
I contenitori Init supportano anche i limiti delle risorse, ma vengono gestiti in modo diverso rispetto ai contenitori normali. Come limite effettivo del modulo viene scelto il valore massimo dei limiti di risorse dichiarati da tutti i contenitori di provisioning, a meno che non sia inferiore alla somma dei limiti dei contenitori dell’applicazione del modulo. Questo valore calcolato verrà utilizzato ai fini della pianificazione.
Uno dei limiti del provisioning dei contenitori è la mancanza di supporto per le sonde. Non è possibile assegnare campi a livenessProbe
, readinessProbe
o startupProbe
oggetti contenitore in initContainers
un campo. I container Init sono un meccanismo separato che puoi usare al posto di, o in combinazione con, le sonde collegate ai container dell’applicazione principale.
Errori comuni
Ci sono alcuni errori comuni quando si utilizzano contenitori init. Ecco alcuni dettagli da tenere a mente:
- I contenitori Init vengono eseguiti ogni volta che il loro pod viene riavviato. Ciò significa che le operazioni del tuo contenitore init devono essere idempotenti in modo che possano essere eseguite due volte nello stesso Pod. Se un pod viene riavviato, tutti i suoi contenitori di inizializzazione verranno eseguiti di nuovo.
- Le modifiche al
initContainers
campo Pod non sono supportate, con un’eccezione. È possibile modificareimage
il campo. Questo riavvierà il modulo e avvierà nuovi contenitori di inizializzazione. - I nomi dei container Init devono essere univoci in tutti i container in un Pod. Ciò include altri contenitori init e i contenitori dell’applicazione. Vedrai un errore di convalida YAML nella tua console se provi ad applicare un manifest che viola questa regola.
- I pod presentano una
Initialized: False
condizione quando i contenitori di init sono in esecuzione. Questo è visibile sottoConditions
l’intestazione all’avviokubectl describe my-pod
.
Puoi anche controllare se i contenitori di pod init sono stati completati usando kubectl get
il comando:
$ kubectl get init-containers-pod
NOME STATO PRONTO RIPARTE ETÀ
init-containers-pod 0/1 Init:1/2 0 1m
In questo caso, STATUS
la colonna indica che il modulo ha due contenitori di inizializzazione, uno dei quali è stato completato correttamente. Una volta completati tutti i contenitori di init, Kubernetes avvierà i contenitori dell’applicazione e lo stato del pod cambierà in Running
.
Quando utilizzare i contenitori Init
I contenitori di provisioning sono ideali quando è necessario inizializzare in qualche modo nuove distribuzioni dell’applicazione. Soddisfano attività di prerequisiti speciali che dipendono da strumenti al di fuori dell’immagine del contenitore principale.
Ecco alcune situazioni in cui potresti voler usare i container init:
- Creazione di file di configurazione da variabili di ambiente.
- Prepopolamento delle cache utilizzate dall’applicazione.
- Migrazione e popolamento di un’istanza di database.
- Scarica e installa i plug-in dell’applicazione nel volume.
- Blocco dell’avvio dell’applicazione fino a quando non sono disponibili dipendenze (come database o API esterne).
Un altro modo per eseguire alcune di queste attività è utilizzare una versione di prova Pronto o Esegui . Tuttavia, c’è una differenza di intenti: i probe sono progettati principalmente per comunicare lo stato del contenitore a Kubernetes, mentre i contenitori di provisioning sono progettati per eseguire azioni durante l’inizializzazione del Pod.
Riepilogo
I contenitori di inizializzazione sono un modo per eseguire le routine di inizializzazione di prima esecuzione in un pod Kubernetes. Possono essere usati per bloccare o ritardare l’avvio di un contenitore di applicazioni mentre si attende la disponibilità delle dipendenze o il completamento degli script di bootstrap.
La funzionalità dei contenitori init a volte si sovrappone ai controlli di avvio e prontezza. È possibile utilizzare un probe quando l’azione che si desidera intraprendere sta sostanzialmente bloccando l’esecuzione dell’applicazione finché non viene soddisfatta una condizione. Si basano sul tuo script già esistente nell’immagine del contenitore della tua app. Un contenitore di inizializzazione è la scelta migliore se si desidera eseguire azioni speciali senza sovraccaricare l’immagine principale con utilità una tantum.
Lascia un commento