InitContainers in Kubernetes

Ein Pod kann mehrere Container haben, in denen Anwendungen ausgeführt werden, und dies wird technisch als Multi-Container-Pod bezeichnet. Der Pod kann aber auch einen oder mehrere Init-Container haben. Diese Container werden ausgeführt, bevor die Anwendungscontainer gestartet werden. Init-Container laufen immer bis zum Ende, und jeder Init-Container muss erfolgreich abgeschlossen sein, bevor der nächste gestartet wird.

Der Unterschied zwischen normalen Containern und InitContainern besteht darin, dass InitContainer keine Lifecycle-, livenessProbe-, readinessProbe- oder startupProbe-Unterstützung bieten, da sie bis zum Abschluss ausgeführt werden müssen, bevor der Pod bereit sein kann. Wenn sich mehrere Init-Container in einem Pod befinden, führt Kubelet jeden Init-Container nacheinander aus.

Init-Container werden verwendet, um benutzerdefinierten Code einzurichten, der in einem Anwendungsbild nicht vorhanden ist. Init-Container können verwendet werden, um einen Mechanismus anzubieten, mit dem der Start von Anwendungscontainern blockiert oder verzögert werden kann, bis eine Reihe von Vorbedingungen erfüllt sind. Indem unnötige Werkzeuge von den Hauptanwendungscontainern getrennt gehalten werden, kann InitContainer verwendet werden, was die Angriffsfläche des Anwendungscontainer-Images einschränken kann.

Jeder InitContainer muss erfolgreich abgeschlossen sein, bevor der nächste gestartet wird. Auf diese Weise bieten Init-Container eine Möglichkeit, den Start von Anwendungscontainern zu blockieren oder zu verzögern, bis eine Reihe von Vorbedingungen erfüllt sind.

Um mehr über InitContainer zu erfahren, klicken Sie hier, um die offizielle Dokumentation von Kubernetes zu besuchen.

In diesem Artikel sehen wir die Demonstration von InitContainers, die vor dem Hauptcontainer beginnen.

Voraussetzungen

  1. Kubernetes Cluster mit mindestens 1 Worker-Knoten.
    Wenn Sie lernen möchten, wie man einen Kubernetes Cluster erstellt, klicken Sie hier. Dieses Handbuch wird Ihnen helfen, einen Kubernetes-Cluster mit 1 Master- und 2 Worker-Knoten auf AWS Ubuntu 18.04 EC2-Instanzen zu erstellen.

Was werden wir tun?

  1. Einen Pod mit InitContainers erstellen

Einen Pod mit InitContainers erstellen

Erstellen Sie eine Objektdatei für InitContainers mit dem folgenden Inhalt.

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-definition-with-init-containers\

In diesem Beispiel werden 2 Init-Container jeweils 2 Sekunden lang ausgeführt, und wenn sie erfolgreich abgeschlossen sind, wird der Hauptcontainer gestartet, der 36000 Sekunden lang aktiv ist.

Dieses Beispiel demonstriert die Verwendung der InitContainer-Funktionalität, und Sie können Ihren eigenen Anwendungsfall haben

Besorgen Sie sich eine Liste der vorhandenen Ports im Cluster und erstellen Sie mit den folgenden Befehlen einen Init-Container-Pod.

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

schaffe-eine-Kiste-mit-in-ihren-Behältern

In der obigen Abbildung sehen Sie, dass der Body gerade erstellt wird.

Wir können die Protokolle sowohl der Init-Container als auch des Hauptcontainers überprüfen, um die Ausführung und den Fluss, in dem die Container erstellt und ausgeführt werden, zu verstehen.

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

check-logs-of-all-the-containers-in-the-pod

Aus dem obigen Screenshot können wir entnehmen, dass Container zuerst in der Reihenfolge ausgeführt werden müssen, in der sie in der Definitionsdatei definiert sind. Sobald die Ausführung von Init-Containern beendet ist, beginnt der Hauptcontainer.

Init-Container werden immer in der Reihenfolge gestartet, in der sie in der Definitionsdatei definiert sind.

Mit dem folgenden Befehl erhalten wir weitere Details des Pods.

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

Einzelheiten - vom pod

Im obigen Screenshot sehen wir, dass der Zustand der beiden Init-Container beendet und der Grund abgeschlossen ist.

Das bedeutet, dass die Init-Container ihre Operation erfolgreich ausgeführt haben und abgebrochen wurden.

Einzelheiten - vom pod

Auf dem obigen Screenshot sehen Sie, dass der Status des Hauptcontainers läuft.

Wenn Sie diesen Pod nicht mehr benötigen, können Sie ihn mit dem folgenden Befehl löschen.

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

delete-the-pod

Schlussfolgerung

In diesem Artikel sahen wir die Schritte zur Erstellung eines Pod mit Init-Containern und der Hauptanwendung. Wir beobachteten den Ablauf der Container-Ausführung in der Pod. Wir sahen auch, wie die Init-Container beendet werden, wenn sie ihre Operation beenden.

Das könnte Dich auch interessieren …