Podman

Containervirtualisierung
Moderne Anwendungen erfordern häufig bestimmte Voraussetzungen an das System, auf dem sie ausgeführt werden. Das fängt bereits beim Betriebssystem an, kann aber auch diverse unterstützende Programme umfassen, ohne welche das jeweilige Programm nicht richtig funktionieren kann.
Ein Programm, welches für Windows entwickelt wurde, funktioniert in der Regel nicht unter MacOS oder Linux und umgekehrt. Will man jetzt ein Programm verwenden, welches nicht für das eigene Betriebssystem verfügbar ist, gibt es ein paar Möglichkeiten, diese Schwierigkeit zu umgehen. Auf der einen Seite kann man sich natürlich ein neues Gerät mit dem gewünschten Betriebssystem zulegen. Aus offensichtlichen Gründen ist das aber natürlich keine wirklich zufriedenstellende Lösung.
Also bleibt die Variante, auf dem eigenen Gerät ein weiteres Betriebssystem zu installieren. Zumindest mit Linux und Windows ist das durchaus eine Möglichkeit [1]. Allerdings bedeutet es auch, dass der Rechner für den Wechsel des Betriebssystems neu gestartet werden muss. Eine weitere Möglichkeit ist das Installieren einer virtuellen Maschine mit dem gewünschten Betriebssystem. Auf diese Weise wird häufig Linux auf Windows Rechnern installiert.
Das Aufsetzen einer virtuellen Maschine erfordert allerdings etwas Arbeit und belegt durchaus eine gute Menge Speicherplatz auf dem eigenen Rechner.
Eine einfachere Lösung für das Ausführen von Programmen bietet daher die Containervirtualisierung. Dies “ist eine Methode, um mehrere Instanzen eines Betriebssystems (als Gäste) isoliert voneinander den Kernel eines Hostsystems nutzen zu lassen.” [2] Sie stellt also ähnlich wie virtuelle Maschinen eine Version eines (fremden) Betriebssystems bereit, welche man auf dem eigenen System laufen lassen kann.
Allerdings wird hierbei kein volles Betriebssystem ausgeführt, sondern nur der Teil, der für die jeweilige Anwendung relevant ist. ”Das ermöglicht passgenaue [Gastsysteme] und spart damit Ressourcen.” [3] Außerdem laufen die einzelnen Gastsysteme, welche als Container bezeichnet werden, isoliert voneinander, was gerade auch Sicherheitstechnik ein Vorteil ist. Ein Container enthält dabei immer genau eine Anwendung zusammen mit den von ihr benötigten Ressourcen, so dass die Anwendung über den Container direkt ausgeführt werden kann, wenn entsprechende Software zur Containervirtualisierung auf dem System installiert ist.

Docker
Die wohl bekannteste Anwendung für die Containervirtualisierung ist Docker. Es bietet die Umgebung, welche benötigt wird, um die entsprechenden Container auszuführen. “Docker is the de facto standard to build an share containerized apps” [4], schreibt die Organisation selbst auf ihrer Website. Der Erfolg von Docker hat dazu geführt, dass andere Anwendungen zur Containervirtualisierung sich in der Regel stark am Format des Marktführers orientieren, bis dahin, dass sehr ähnliche Befehle zur Steuerung verwendet werden. Außerdem lassen sich Container für Docker mit den meisten anderen Anwendungen ausführen.

Containerverwaltung
Genau wie Kubernetes in Verbindung mit Docker besitzt auch Podman eine Containerverwaltung. “Container vereinfachen die Produktion, Verteilung, Auffindbarkeit und Nutzung von Anwendungen mit all ihren Abhängigkeiten und Standardkonfigurationsdateien.” [5] Diese Anwendungs Container werden in Pods zusammengefasst und sind namensgebend für “Podman”(pod manager). Auf die Pods können Passwörter sowie Konfigurationsdateien gemountet werden, auf welche der Pod bei Bedarf zugreifen kann. Die Containerverwaltung wird bei Podman nicht von einem dedizierten Daemon geleitet, wie ihn Kubernetes nutzt, stattdessen kommt bei Podman “systemd” zum Einsatz. “Dieser System- und Servicemanager für Linux ist dabei rootless, erhöht Sicherheit und ist Ressourcen sparend.” [6]
Die Grundidee ist dabei ähnlich zu Kubernetes-Clustern. Ein Cluster besteht aus mehreren Hostrechnern, wobei zwischen Control Plane und Worker Nodes unterschieden wird. Pro Cluster gibt es nur einen Control Plane, in Kubernetes Master genannt, welcher für die “Verwaltung und Konfiguration des Clusters zuständig ist.” [7] Er hält alle definierten Container-Konfigurationen oder Container-Images in einer etcd Instanz, welche bei Bedarf für neue Container verwendet werden kann. Podman ist dabei in der Lage, “Dockerfiles als Container Images zu verarbeiten oder diese selbst zu erstellen.” [5] Per REST API können die einzelnen Worker Nodes, in Kubernetes Slaves genannt, mit dem Control Plane kommunizieren. Die Worker Nodes werden von der Control Plane überwacht, diese kann bei Bedarf Pods innerhalb von Worker Nodes neu konfigurieren oder neu starten. Die Worker Nodes halten mehrere Pods, welche wiederum mehrere Container halten können. Diese sind über eigene IP-Adressen innerhalb des Worker Nodes Subnetzes ansprechbar. Außerdem ist es möglich, einen Service zu definieren, welcher innerhalb eines Worker Nodes mehrere Pods hält. Dieser ist wiederum durch eine eigene, vom Worker Node unabhängige IP Adresse ansprechbar und kann auch Pods aus anderen Workernodes ansprechen. Die Worker Nodes können auch untereinander kommunizieren, so kann ein überlasteter Node andere aktivieren und es wird möglich, Rechenlast unter mehreren Worker Nodes aufzuteilen.

Um Hochverfügbarkeit sicherzustellen, werden auch redundante Pods gehalten. Diese Pods sind Duplikate der verwendeten Pods und stehen bereit, um die Arbeiten von ausfallenden Pods zu übernehmen. Schließlich kann ein Service auch als per Proxy ansprechbarer Service nach außen definiert werden, hierbei spricht man von einem Ingress.

Vor- und Nachteile von Podman
Der größte Vorteil von Podman liegt zunächst darin, dass die Architektur im Gegensatz zu Docker keinen Daemon verwendet und daher ohne root-Zugriff („sudoless“) verwendet werden kann. Dies wird über den Systemd, einem (Linux-)System- und Sitzungs-Manager, mithilfe eine Forkexec-Modells realisiert. (Inzwischen wurde bei Docker aber auch ein Rootless-Mode ergänzt.) Gerade hinsichtlich der Sicherheit ist dies ein wichtiger Aspekt, mögliche Risiken werden verkleinert. Gleichzeitig muss auf keine Funktionen, die andere Container Engines bis jetzt umgesetzt haben, verzichtet werden: Es ist in der Regel mit den gewöhnlichen Docker-Images vollständig kompatibel. Zudem orientieren sich die Befehle zur Verwendung von Podman an denen von Docker (siehe Nutzung von Podman), was den Entwicklern bzw. den Unternehmen einen leichten Umstieg auf Podman ermöglicht. [6]
Es konnte allerdings ein Nachteil beobachtet werden, so ist Nutzung auf nfs (Network File Systems) nicht problemlos möglich, da das Abspeichern von Images auf diesen nicht unterstützt wird. Um diesem Problem zu begegnen , ist es nötig in der /.config/containers/storage.conf den Speicherort auf ein Verzeichnis zu ändern, was außerhalb des nfs liegt. [8]

Installation von Podman
Podman kann wie sämtliche andere Anwendungen über apt-get (bei Ubuntu, bei anderen Linux Distributionen ähnlich) installiert werden. Für die Installation sind sudo-Rechte notwendig.
Sudo apt-get update
Sudo apt-get -y install podman [9]
Danach ist die Verwendung wie im folgenden Abschnitt beschrieben möglich.

Nutzung von Podman
Podman lässt sich im wesentlichen mit den selben Befehlen wie es bei Docker üblich ist nutzen. So können Images mit

podman pull docker.io/library/nextcloud

(Image Nextcloud) heruntergeladen werden und mit

podman run docker.io/library/nextcloud

ausgeführt werden.

podman ps -a

listet die laufenden Container auf. Für eine ausführliche Auflistung wird an dieser Stelle auf die Dokumentation verwiesen. [9]

 

Quellen/Hinweise

  1. Apple ist bekanntermaßen deutlich restriktiver, was die Verwendung ihrer Software auf fremder Hardware angeht, so dass diese Lösung nur schwierig umsetzbar ist
  2. https://de.wikipedia.org/wiki/Containervirtualisierung, 02.Februar 2024
  3. https://gridscale.io/community/glossar/was-ist-containervirtualisierung/#:~:text=Unter%20Containervirtualisierung%20versteht%20man%20ein,auf%20einem%20System%20zu%20betreiben, 02. Februar 2024
  4. https://www.docker.com/why-docker/, 02. Februar 2024
  5. https://docs.podman.io/en/latest/Introduction.html, 02. Februar 2024
  6. https://www.redhat.com/de/topics/containers/what-is-podman, 03. Februar 2024
  7. https://kubernetes.io/docs/concepts/cluster-administration/networking/, 03. Februar 2024
  8. https://www.redhat.com/sysadmin/rootless-podman-nfs, 04. Februar 2024
  9. https://podman.io/docs, 04. Februar 2024