Podman: Linux-Container einfach gemacht, Teil 1

Seite 3: Pod Manager – Was ist ein Pod?

Inhaltsverzeichnis

Der Name Podman ist ein Kürzel für Pod Manager. Die Container-Orchestrierung Kubernetes hat den Begriff Pod geprägt. Er beschreibt eine Gruppe von Containern, die sich bestimmte Ressourcen teilen und nicht völlig isoliert voneinander laufen. Während Docker Pods nur indirekt über Kubernetes unterstützt, sind sie ein integraler Bestandteil von Podman.

Folgende Abbildung beschreibt die Architektur eines Pods, dessen Kern ein sogenannter Infrastruktur-Container oder kurz Infra-Container bildet.

Die Architektur eines Pods in Podman (Abb. 2)

Ein Infra-Container verrichtet keine Arbeit, sorgt aber dafür, dass bestimmte Ressourcen des Pods wie Namespaces, CGroups und Netzwerk-Ports am Leben bleiben. Obwohl Podman dem Fork-Exec-Modell folgt und damit nicht als Server läuft, benötigen wir dennoch einen Prozess, der Container überwacht, um etwa Logs und Exit-Codes zu sichern. Dies ist die Aufgabe von Conmon, ein kleines, in C geschriebenes Monitoring-Werkzeug, dass jedem Container angehängt wird. Neben dem Monitoring hält Conmon das Terminal des Containers offen, um per podman exec zu einem späteren Zeitpunkt das Terminal verwenden zu können.

Der Grafik ist ebenfalls runc zu entnehmen, eine industrieweite Standard-Container-Runtime. Sie entsteht unter dem Schirm der Open Container Initiative (OCI). Runc ist für die Ausführung eines Container-Prozesses zuständig und implementiert die Runtime-Spezifikation der OCI. Runc kann neben OCI Images als kleinster gemeinsamer Nenner des Container-Ökosystems verstanden werden, da es in vielen Container-Tools wie Podman, Docker oder rkt Verwendung findet.

Ein Pod lässt sich über das podman pod create-Kommando erstellen:

$ podman pod create --name heise
fe4462d0819c609a589ca8587cc2db5aa010226b40aeaf6af5d76df1f8c2991c

$ podman ps --pod --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD
adc0d2498621 k8s.gcr.io/pause:3.1 46 seconds ago Up 46 seconds ago fe4462d0819c-infra fe4462d0819c

Wie im Beispiel zu sehen, wird jedem Pod automatisch ein Infra-Container hinzugefügt. Andere Container können nun dem heise-Pod per podman create und podman run beitreten:

$ podman run --detach --pod=heise alpine:latest top
A85cf439a6df36d558ad7eab989db66df97870b6ba109fad8a3e2a4d34240f59

$ podman ps --all --pod
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD
a85cf439a6df docker.io/library/alpine:latest top 8 minutes ago Up 8 minutes ago mystifying_lalande fe4462d0819c
adc0d2498621 k8s.gcr.io/pause:3.1 15 minutes ago Up 15 minutes ago fe4462d0819c-infra fe4462d0819c

Meist setzen Entwickler Pods ein, um eine komplexere Anwendung mit einer Gruppe von Containern zu implementieren. Istio packt zum Beispiel den Sidecar Container mit in den Pod, um seine Funktionalität zu implementieren. Da die Container in einem Pod laufen, teilen sie sich unter anderem den PID und Network Namespace, was für den Betrieb notwendig ist. Dennoch profitieren Anwender davon, dass Teile des Systems in verschiedenen Containern laufen, sodass man Ressourcen wie CPU, Arbeitsspeicher und Netzwerkleistung den Funktionen entsprechend zuteilen und limitieren kann.

Podman ermöglicht es Entwicklern, Pods lokal zu bauen und zu testen, ohne ein komplexes Kubernetes-Cluster aufsetzen zu müssen. Falls Kubernetes jedoch das Einsatzziel sein sollte, können lokal laufende Container und Pods mit podman generate kube in ein Kubernetes-YAML übersetzt und mit kubectl create -f in Kubernetes importiert werden.

Podman bietet neben der Kommandozeile mehrere APIs an, um eine Integration in andere Werkzeuge und Programme zu ermöglichen, ohne einen Umweg über direkte Programmaufrufe gehen zu müssen. Wie im Cloud- und Container-Bereich üblich ist Podman in Go implementiert. Dabei setzt Podman auf die libpod-Bibliothek, die eine umfangreiche und gut dokumentierte API für das Management von Images, Containern und Pods anbietet. Entwickler können mit der API Teile der Podman-Funktionen in andere Programme integrieren, sofern sie in Go geschrieben sind.

Eine weitere API bietet Podman mit Varlink an. Varlink ist eine Schnittstellen-Beschreibungsprache und zugleich ein Protokoll und unterstützt Programmiersprachen wie C, Rust, Python, Java und Go. Unter Verwendung von Varlink kann Podman sowohl lokal als auch auf einem Remote-Server ausgeführt werden, wie es Varlink-Entwickler Harald Hoyer ausführlich im Podman-Blog beschreibt. Auf einem Remote-Server kann man Podman per Systemd-Socket-Aktivierung aufrufen.

Die Varlink-API kommt unter anderem in Podmans Python-Bibliothek zum Einsatz. Die Podman-Entwickler verwenden Varlink darüber hinaus in einem aktuellen Bestreben, um Podman auf Windows und macOS anzubieten. Wie bei Docker setzen sie dabei voraus, dass Podman auf einem Linux-System installiert ist, das Podman per Varlink auf Windows und macOS aufruft.