Ricerca nel sito web

InitContainer in Kubernetes


Su questa pagina

  1. Prerequisiti
  2. Cosa faremo?
  3. Crea un pod con InitContainers
  4. Conclusione

Un pod può avere più container che eseguono app al suo interno e questo è tecnicamente chiamato pod multi-container. Ma il pod può anche avere uno o più contenitori init. Questi contenitori vengono eseguiti prima dell'avvio dei contenitori dell'app. I contenitori init vengono sempre eseguiti fino al completamento e ogni contenitore init deve essere completato correttamente prima dell'avvio del successivo.

La differenza tra container normali e InitContainer è che gli InitContainer non supportano lifecycle, livenessProbe, readinessProbe o startupProbe perché devono essere eseguiti fino al completamento prima che il pod possa essere pronto. Se sono presenti più init container in un pod, Kubelet esegue ogni init container in sequenza.

I contenitori init vengono utilizzati per impostare un codice personalizzato che non è presente nell'immagine di un'app. I contenitori init possono essere usati per offrire un meccanismo per bloccare o ritardare l'avvio del contenitore dell'app finché non viene soddisfatta una serie di precondizioni. Mantenendo gli strumenti non necessari separati dai principali contenitori dell'applicazione, è possibile utilizzare InitContainer che può limitare la superficie di attacco dell'immagine del contenitore dell'app.

Ogni InitContainer deve essere completato correttamente prima che venga avviato il successivo. In questo modo, i contenitori Init forniscono un modo per bloccare o ritardare l'avvio dei contenitori delle app finché non vengono soddisfatte alcune serie di precondizioni.

Per saperne di più su InitContainer, fai clic qui per visitare la documentazione ufficiale di Kubernetes.

In questo articolo vedremo la dimostrazione di InitContainers che iniziano prima del contenitore principale.

Prerequisiti

  1. Cluster Kubernetes con almeno 1 nodo di lavoro.
    Se vuoi imparare a creare un cluster Kubernetes, fai clic qui. Questa guida ti aiuterà a creare un cluster Kubernetes con 1 master e 2 nodi su istanze AWS Ubuntu 18.04 EC2.

Che cosa faremo?

  1. Crea un pod con InitContainers

Crea un pod con InitContainers

Crea un file oggetto per InitContainers utilizzando i seguenti contenuti.

vim pod-with-initcontainer.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-initcontainer
  labels:
    app: myapp
spec:
  containers:
  - name: main-container
    image: busybox
    command: ['sh', '-c', 'echo Inside the main-container! && sleep 36000']
  initContainers:
  - name: init-container-1
    image: busybox
    command: ['sh', '-c', 'echo Inside init-container-1 start; sleep 2;echo init-container-1 completed;']
  - name: init-container-2
    image: busybox
    command: ['sh', '-c', 'echo Inside init-container-2 start; sleep 2;echo init-container-2 completed;']

In questo esempio, 2 InitContainer verranno eseguiti per 2 secondi ciascuno e, una volta completati correttamente, verrà avviato il contenitore principale che sarà attivo per 36000 secondi.

Questo esempio dimostra l'utilizzo della funzionalità InitContainer e puoi avere il tuo caso d'uso

Ottieni un elenco di porte esistenti nel cluster e crea un pod init-container con i seguenti comandi.

kubectl get pods #Get a list of existing pods
kubectl apply -f pod-with-initcontainer.yml #Create a pod with InitContainer
kubectl get pods #Check the pod which got created

Nello screenshot sopra, puoi vedere che il corpo è stato creato.

Possiamo controllare i log sia degli init-container che del container principale per comprendere l'esecuzione e il flusso in cui i container vengono creati ed eseguiti.

kubectl get pods
kubectl logs pod-with-initcontainer -c init-container-1 --timestamps=true #Check logs of the 1st InitContainer
kubectl logs pod-with-initcontainer -c init-container-2 --timestamps=true #Check logs of the 2nd InitContainer
kubectl logs pod-with-initcontainer --timestamps=true #Check logs of the main container

Dallo screenshot sopra, possiamo capire che è necessario che i contenitori vengano eseguiti per primi nella sequenza in cui sono definiti nel file di definizione. Una volta terminata l'esecuzione di init-containers, viene avviato il contenitore principale.

I contenitori init vengono sempre avviati nella sequenza in cui sono definiti nel file di definizione.

Possiamo ottenere maggiori dettagli sul pod utilizzando il seguente comando.

kubectl get pods #Get a list of Pods
kubectl describe pod pod-with-initcontainer #Get details of the Pod

Nello screenshot sopra, possiamo vedere che lo stato di entrambi i init-container è terminato e il motivo è completo.

Significa che i contenitori init hanno eseguito correttamente la loro operazione e sono stati terminati.

Nello screenshot sopra, puoi vedere che lo stato del contenitore principale è in esecuzione.

Quando non avrai più bisogno di questo pod, puoi eliminarlo utilizzando il seguente comando.

kubectl get pods
kubectl delete pod pod-with-initcontainer #Delete the Pod

Conclusione

In questo articolo, abbiamo visto i passaggi per creare un pod contenente init-container e l'applicazione principale. Abbiamo osservato la sequenza di esecuzione del contenitore nel pod. Abbiamo anche visto come i contenitori init vengono terminati al termine della loro operazione.