Blog

Wie man ein Post-Deployment-Skript auf Kubernetes ausführt

Laurens Knoll

Aktualisiert Oktober 16, 2025
3 Minuten

Manchmal müssen Sie ein Post-Deployment-Skript ausführen, um eine Datenbank zu aktualisieren oder Ihre Anwendungen zu konfigurieren. Bei zwingenden Verteilungen fügen Sie einfach eine neue Verteilungsskriptaufgabe hinzu. Bei deklarativen Bereitstellungen, wie z.B. Kubernetes-Bereitstellungen, müssen Sie warten, bis die Bereitstellung abgeschlossen ist. Dieser Blog zeigt Ihnen, wie Sie ein Post-Deployment-Skript in Kubernetes ausführen.

Warten Sie nicht. Starten Sie einen neuen Container

Bei dieser Lösung wird das Skript in einer neuen Container-Instanz ausgeführt. Da es sich um einen neuen Container handelt, müssen Sie nicht warten, bis die Bereitstellung abgeschlossen ist. Dies ist die von mir bevorzugte Lösung, da Sie damit jeden beliebigen Containertyp ausführen und dem Skript spezifische Ressourcen zuweisen können.

kubectl run the-update-task --attach --restart=Never --rm 
    --image ubuntu:latest --command -- bash -c "echo "Call your script here..""

if [ $? -ne 0 ]; then
    # The update script failed, do something.
fi
Beachten Sie, dass dieser Befehl ein reguläres Pod verwendet. Wir möchten stattdessen ein Job verwenden. Aufträge werden jedoch nicht standardmäßig bereinigt. Sie müssen also ein Skript schreiben, um den Auftrag abzurufen und zu entfernen.

Das ist zwar unglaublich einfach, aber Sie führen die Container zwingend aus (über die Befehlszeile). Daher geben Sie wahrscheinlich dieselbe Containerkonfiguration an wie in Ihren deklarativen (yaml-Datei) Bereitstellungsdateien. Lassen Sie uns andere Lösungen zur Ausführung Ihres Skripts untersuchen, die Ihre deklarative Bereitstellung wiederverwenden.

Prüfen Sie den Rollout- und Pod-Status

Bei dieser Lösung wird das Skript unmittelbar nach einer Bereitstellung auf einem bestehenden Arbeitsvolumen ausgeführt. Sie verlässt sich auf den kubectl rollout status, um auf den Abschluss der Bereitstellung zu warten. Leider wartet dieser Befehl nicht auf die Beendigung aller Container. Um zu verhindern, dass Sie in einen beendeten Container ausgeführt werden, wird der Pod-Status abgefragt, bevor das Skript ausgeführt wird.

kubectl apply -f my-deployment.yaml

# Wait for rollout to complete..
kubectl rollout status deploy/my-deployment-name --watch=true

# Wait for shutdown of terminating pods..
SELECTOR=$(kubectl get deploy/my-deployment-name -o wide --no-headers | awk '{print $NF}')

while :
do
    POD_STATES=$(kubectl get pods --selector ${SELECTOR} --no-headers | awk '{print $3}' | uniq)
    if [[ "$POD_STATES" == "Running" ]]; then
        break
    fi

    sleep 5
done

# Run the update script..
kubectl exec deploy/my-deployment-name -- echo "Call your script here.."

Wiederverwendung des Terraform Provider-Verhaltens

Wenn Sie den Terraform Kubernetes Provider verwenden, haben Sie Glück. Die -Ressource stellt das wait_for_rollout-Attribut für Sie bereit. Sie müssen also keine Skripte schreiben oder pflegen.

terraform apply
kubectl exec deploy/my-deployment-name -- echo "Call your script here.."
Beachten Sie, dass der Kubernetes-Provider eine Race Condition enthält, die das Verhalten von wait_for_rollout beeinflusst. Ich gehe davon aus, dass dies in naher Zukunft behoben wird, da bereits eine Lösung für dieses Problem vorgeschlagen wurde.

Fazit

Es gibt viele Möglichkeiten, ein Post-Deployment-Skript in Kubernetes auszuführen. Ich bevorzuge die Ausführung eines neuen Containers, weil sie so einfach ist. Finden Sie Ihren bevorzugten Weg, indem Sie Ihre Tools, den Wartungsaufwand und die Benutzerfreundlichkeit abwägen.

Foto von Birger Strahl auf Unsplash


Tags:

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.