Zum Hauptinhalt springen

Verwenden von Podman und systemd zur Verwaltung des Container-Lebenszyklus

· 3 Minuten Lesezeit

podman logo

Verwenden von Podman und systemd zur Verwaltung des Container-Lebenszyklus

Von Ed Haynes GitHub

Mein Hintergrund liegt in der Industrieautomatisierung, und in den meisten Fällen sind die Edge-Geräte in der Fabrik zu leistungsschwach, um Kubernetes als Methode zur Verwaltung des Lebenszyklus von Containern auszuführen. Die Workloads haben einen sehr langen Lebenszyklus und sind im Allgemeinen an das Edge-Gerät "gebunden". Es gibt jedoch einen großen Wert beim Containerisieren von Anwendungen auf diesen Edge-Geräten, da es die Anwendungsabhängigkeiten vom Betriebssystem entkoppelt und eine Isolationsebene zwischen Anwendungen bietet. Diese Demo zeigt, wie die Verwendung von Podman in Verbindung mit systemd eine elegante Lösung für diese Art von Anwendungsfall bietet. Darüber hinaus wird dies als "rootless" Benutzer durchgeführt - ein wichtiger Vorteil von Podman, der hilft, das Gerät sicher zu halten.

Für meine Demo verwendete ich eine minimale Fedora33-Installation mit installiertem Podman. Um meinen Lebenszyklus zu vereinfachen (der in der Industrie 10+ Jahre betragen kann), möchte ich das Basis-OS so minimal und sauber wie möglich halten und alle Anwendungsabhängigkeiten in den Containern behalten. Ich werde eine Redis In-Memory-Keystore-Datenbank als meine containerisierte Anwendung erstellen und das "podman generate systemd" Dienstprogramm verwenden, um die systemd Unit-Datei zu generieren. Diese Datei teilt systemd mit, was Ihre Richtlinien für Ihre Anwendung sind - ob sie beim Booten starten oder bei einem Fehler neu starten soll. In meinem Fall möchte ich, dass meine Anwendung beim Booten verfügbar ist und auch im Falle eines Fehlers neu startet. Ich aktiviere und starte den systemd-Service mit dem --user Flag, da ich aus Sicherheitsgründen keinen Root-Zugriff auf diesem Gerät möchte.

Ich stelle ein Testskript bereit, um die Redis-Container-API zu testen. Während ich die redis-cli auf meinem Basis-Fedora33-OS hätte installieren können, um diese Tests durchzuführen, würde dies meinen Wunsch verletzen, das Basis-OS so minimal wie möglich zu halten. Ich übergebe Werte über "nc" an den Port des Redis-Containers, um einen Schlüsselindex "frog" auf 56 zu setzen. Ich zeige dann durch das Abrufen dieses Indexes, dass der Wert ordnungsgemäß gesetzt ist. Jetzt kommt der interessante Teil. Ich verwende pkill, um die Redis-Datenbank zu beenden, und zeige dann, wie systemd den fehlgeschlagenen Container neu startet. Sie können auch das OS neu starten und finden Ihre Anwendung beim Startup laufend vor.

Um die Dinge aufzuräumen, stelle ich ein Bereinigungsskript bereit, das den Service stoppt und den Container aufräumt, damit Sie die Demo von oben beginnen können, wenn Sie möchten.

Um diese Demo selbst auszuführen (ich habe auf Fedora33, Red Hat 8.3 und Ubuntu 20.10 getestet), stellen Sie sicher, dass Podman und git auf Ihrem OS installiert sind

Denken Sie auch daran, dass dies alles als Standardbenutzer durchgeführt wird - kein Root!

git clone https://github.com/edhaynes/podman_systemd_usermode_demo.git

cd podman_systemd_usermode_demo

./launch_redis_container.sh

"launch_redis_container.sh" launches redis container, adds usermode systemd entry, enables and starts it. You will need to hit "q" to get out of the shown status.

You should see something like:

redis_server.service - Podman container-redis_ Loaded: loaded

Active: active (running) since Wed 2020-12-09 09:22:40 EST; 1h 58min ago

Now that redis is running you can run the test script that sets a key value, retrieves it, and then kills the redis container. systemd will then restart the container and you can see all is working again. Do this with:

./test_redis_container.sh

Once you are done experimenting with it you can run the cleanup script to stop the systemd service, remove it and stop / remove the container.

./cleanup.sh

Hope you enjoyed this demo and any comments or suggestions please make them in the GitHub repository.