InitContainers in Kubernetes

Een Pod kan meerdere containers hebben die er apps in draaien en dit heet technisch gezien een multi-container pod. Maar de pod kan ook een of meer init containers hebben. Deze containers worden gedraaid voordat de app containers gestart worden. Init containers draaien altijd tot ze voltooid zijn en elke init container moet met succes voltooid zijn voordat de volgende start.

Het verschil tussen gewone containers en InitContainers is dat InitContainers geen levenscyclus, livenessProbe, readinessProbe, of startupProbe ondersteunen omdat ze tot voltooiing moeten lopen voor de Pod klaar kan zijn. Als er meerdere init-containers in een Pod zitten, draait Kubelet elke init-container opeenvolgend.

Init containers worden gebruikt om aangepaste code in te stellen die niet in een app image aanwezig is. Init containers kunnen gebruikt worden om een mechanisme te bieden om het starten van app containers te blokkeren of uit te stellen tot aan een reeks voorwaarden vooraf is voldaan. Door overbodige hulpmiddelen gescheiden te houden van de hoofd applicatie containers, kan InitContainer gebruikt worden dat het aanvalsoppervlak van het app container image kan beperken.

Elke InitContainer moet met succes voltooid zijn voordat de volgende gestart wordt. Op deze manier bieden Init Containers een manier om het starten van app containers te blokkeren of uit te stellen tot aan een aantal randvoorwaarden voldaan is.

Om meer te weten te komen over InitContainer, klikhier om de officiële documentatie van Kubernetes te bezoeken.

In dit artikel zien we de demonstratie van InitContainers die starten vóór de hoofdcontainer.

Pre-requisites

  1. Kubernetes Cluster met minstens 1 worker node.
    Als je wilt leren hoe je een Kubernetes Cluster maakt, klik danhier. Deze gids helpt je een Kubernetes cluster te maken met 1 Master en 2 Nodes op AWS Ubuntu 18.04 EC2 Instances.

Wat zullen we doen?

  1. Maak een Pod met InitContainers

Maak een Pod met InitContainers

Maak een object bestand voor InitContainers met de volgende inhoud.

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;']

pod-defination-met-init-containers

In dit voorbeeld zullen 2 InitContainers elk 2 sec draaien en als ze met succes voltooid zijn, start de hoofdcontainer die 36000 sec in leven zal blijven.

Dit voorbeeld demonstreert het gebruik van de InitContainer functionaliteit en je kunt je eigen gebruikssituatie hebben

Verkrijg een lijst van bestaande poorten in het cluster en maak een init-container pod met de volgende commando’s.

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

create-a-pod-met-init-containers

In de bovenstaande schermafbeelding zie je dat de bak wordt aangemaakt.

We kunnen de logs van zowel de init-containers als de hoofd-container bekijken om de uitvoering en de stroom waarin de containers worden gemaakt en uitgevoerd te begrijpen.

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

controleer-logs-van-alle-containers-in-de-pod

Uit het bovenstaande screenshot kunnen we begrijpen dat je containers eerst uitgevoerd moeten worden in de volgorde waarin ze in het definitiebestand gedefinieerd zijn. Als de uitvoering van init-containers is voltooid, start de hoofdcontainer.

Init-containers worden altijd gestart in de volgorde waarin ze in het definitiebestand gedefinieerd zijn.

We kunnen meer details van de pod krijgen met het volgende commando.

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

details-van-de-pod

In de bovenstaande schermafbeelding zien we dat de toestand van de beide init-containers beëindigd is en dat de reden voltooid is.

Het betekent dat de init-containers hun bewerking met succes uitvoerden en dat ze beëindigd zijn.

details-van-de-pod

In de bovenstaande schermafbeelding zie je dat de toestand van de hoofd-container lopend is.

Als je deze pod niet meer nodig hebt, kun je hem verwijderen met het volgende commando.

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

verwijder-de-pod

Conclusie

In dit artikel zagen we de stappen om een pod te maken die init-containers en de hoofdapplicatie bevat. We observeerden de volgorde van container uitvoering in de pod. We zagen ook hoe de init-containers beëindigd worden als ze klaar zijn met hun werking.