podman version
geprüft werden.Einleitung
In den bisherigen Artikeln haben wir Podman unter Alma Linux installiert (Einführung in Podman) und die Quadlets genutzt, um einen einzelnen Container zu starten (Podman Quadlets). Eine weitere Funktion, die Podman von Docker abhebt, ist die namensgebende Funktion “Pod”. In einem Pod können mehrere Container zusammengefasst werden, die sich die gleichen Ressourcen teilen. Dies ist immer dann praktisch, wenn eine Anwendung aus mehreren Komponenten besteht, wie zum Beispiel einer Weboberfläche und einer dazugehörigen Datenbank. Sie sind vergleichbar mit den Pods aus Kubernetes. Unter anderem deshalb lassen sich aus Podman Pods auch mit einem einfachen Befehl Konfigurationsdateien für Kubernetes generieren.
Wie funktionieren Pods?
Springen wir zunächst einmal zu Docker und schauen uns an, wie man dort mit Anwendungen umgeht, die aus mehreren Containern bestehen. Unter Docker würde man alle Container einer Anwendung in einer docker-compose zusammen angeben, damit Docker dann ein internes Netzwerk für diese Container aufbaut, über das sich die einzelnen Komponenten dann gegenseitig erreichen können.
Ein Pod dagegen verhält sich etwas anders. Alle Container, die dem gleichen Pod zugewiesen sind, teilen sich die Ressourcen untereinander. Das bedeutet zum Beispiel, dass eine Anwendung seine Datenbank, wenn sie im gleichen Pod liegt, über “localhost:PORT” erreichen kann. Es gibt also kein separates Netzwerk, über dass die Erreichbarkeit erst zustande kommt. Außerdem steht alles, was für den Pod definiert wird, für alle Container zur Verfügung. Wird auf Pod-Ebene ein Volume definiert, kann jeder Container im Pod darauf zugreifen.
Nachfolgend die Skizze eines Podman Pods für Authentik zur besseren Verständlichkeit:
Der zusätzlich eingezeichnete “Infra”-Container kann vorerst vernachlässigt werden. Bei jedem Pod startet immer automatisch ein kleiner Infra-Container mit, der für die Verwaltung des Pods zuständig ist.
Da sich die Container im Pod quasi wie installierte Anwendungen verhalten gilt darin auch die gleiche Einschränkung in Bezug auf Ports: Es darf keine zwei Container geben, die den gleichen Port innerhalb eines Pods nutzen wollen. In dem Fall wird einer der beiden Container nicht starten können, weil der benötigte Port bereits in Verwendung ist (“already in use”). In den meisten Fällen sollte dies kein Problem sein, da die einzelnen Komponenten einer Anwendung selten die gleichen Ports nutzen, sonst hätten sie auch auf einem normalen System ein Problem.
Pods mit Quadlets
Was ist also zu beachten, wenn man jetzt mehrere Container in einem Pod zusammenfassen möchte? Im Endeffekt gilt alles, was wir bislang mit den Quadlets gemacht haben, weiterhin. Es muss nur neben den .container-Quadlets eine weitere Datei mit der Endung “.pod” erstellt werden und zusätzlich muss in den Container Quadlets mit Pod=dateiname.pod eine Referenz auf den Pod eingetragen werden. Das reicht schon aus damit systemd weiß, dass dieser Container zu dem Pod gehört.
Wichtig: Wir haben in der Anleitung “Podman Quadlets” in der .container-Datei den Hostnamen des Containers explizit festgelegt:
|
|
Diese Angabe muss entfallen, wenn der Container einem Pod zugeordnet wird. Innerhalb eines Pods kann ein Container keinen spezifischen Hostnamen mehr haben.
Was ist überhaupt Authentik?
Mehrfach wurde jetzt erwähnt, dass hier die Pod-Mechanik anhand von Authentik erläutert wird, aber was ist das überhaupt?
Authentik ist ein Identity Management System. Konkret bedeutet dies, dass es eine zentrale Stelle ist, an der man seine Benutzer verwalten kann. Es soll dann die zentrale Stelle zum Login in verschiedenste Anwendungen sein, man spricht hier unter anderem auch von Single-Sign-On (SSO). Im besten Fall loggt man sich also nur noch einmal über Authentik ein und kann dann auf alle seine Anwendungen zugreifen, ohne sich überall separat einloggen zu müssen.
Authentik bietet verschiedenste Optionen, um es in andere Anwendungen einzubinden, unter anderem OAuth2, LDAP oder Forward Auth für einen Reverse Proxy. Viele Anwendungen unterstützen eines oder mehrere dieser Verfahren. Einmal eingerichtet, wird die Authentifizierung nicht mehr bei der Einzelanwendung selbst ausgeführt, sondern an Authentik weitergegeben.
Quadlets anlegen
Es gibt keine Notwendigkeit, Authentik unter root laufen zu lassen, deswegen wird das Ganze unter einem ganz normalen Benutzer laufen. Wenn ihr der Anleitung zu (Podman Quadlets) gefolgt seid, so habt ihr in eurem Benutzerverzeichnis bereits einen symbolischen Link mit dem Namen “containers” der direkt zu dem Ort führt, an dem die Quadlets abgelegt werden müssen.
Dennoch benötigen wir dort einen neuen Unterordner, in den wir dann anschließend auch direkt reinwechseln:
|
|
Hinweis: $_
enthält das Argument des vorangegangenen Befehls, also “~/containers/authentik”
Hier nochmal der Befehl mit dem vollen Pfad, falls ihr den symbolischen Link nicht habt:
|
|
Übersicht
Authentik besteht aus 4 Containern, die wir jetzt nach und nach definieren werden:
- PostgreSQL Datenbank
- Redis
- Authentik Server
- Authentik Worker
Secrets anlegen
Zunächst benötigen wir aber noch zwei Secrets, die wir später in den Containern nutzen. Dabei handelt es sich zum einen um ein Passwort für PostgreSQL und zum anderen um einen Secret Key, der vom Authentik Server und Worker benötigt wird. Da wir die Werte nicht kennen müssen und diese nur in den Containern selbst relevant sind, erzeugen wir zufällige Werte und speichern diese direkt als Secrets, ohne dass wir sie jemals gesehen haben:
|
|
Container: PostgreSQL
Es folgen jetzt mehrere Schritte, bei denen nur Dateien angelegt und der danach angezeigte Inhalt übertragen wird. Es handelt sich um die Definitionen der einzelnen Container, alle referenzieren auf den Pod “authentik”.
Neue Datei anlegen:
|
|
Und folgenden Inhalt einsetzen:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
Container: Redis
Neue Datei anlegen:
|
|
Und folgenden Inhalt einsetzen:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
Container: Authentik Server
Neue Datei anlegen:
|
|
Und folgenden Inhalt einsetzen:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
Container: Authentik Worker
Neue Datei anlegen:
|
|
Und folgenden Inhalt einsetzen:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
Volumes definieren
In den Container-Quadlets wurden einige Volumes definiert, die genutzt werden sollen. Deswegen folgen jetzt die Definitionen für diese Volumes.
|
|
Inhalt:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
|
|
Inhalt:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
|
|
Inhalt:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
|
|
Inhalt:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
|
|
Inhalt:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
Pod
Jetzt fehlt nur noch die Definition des Pods, auf den alle Container referenzieren. Hier definieren wir auch den Port, über den dann die Authentik Weboberfläche erreichbar ist. 9000/tcp ist dabei der HTTP-Port und 9443/tcp der HTTPS-Port.
|
|
Inhalt:
|
|
Speichern und Schließen mit STRG+O -> ENTER STRG+X (Mac: control statt STRG)
Authentik ausführen
Damit systemd die von uns angelegten Quadlets einliest und daraus seine Service-Dateien generiert, führen wir jetzt zunächst einen Reload aus:
|
|
Damit können wir den Pod jetzt auch schon direkt starten. Der Name, den man für systemctl nutzen muss, ist der Dateiname der “.pod”-Datei ohne Dateiendung, aber mit der Ergänzung “-pod”. Aus unserem “authentik.pod” entsteht also der Name: authentik-pod
|
|
Aufgrund der Abhängigkeiten und weil alle Images heruntergeladen werden müssen, kann es beim ersten Start etwas länger dauern, bis alle Container zu sehen sind. Falls auch nach einigen Minuten noch nicht alle Container gestartet sind, hilft ein Blick ins journalctl, um ggf. vorhandene Fehler zu finden.
Pod Status prüfen
|
|
Mit diesem Befehl sieht man wie gewohnt alle Container, die aktuell laufen. Darunter sollten jetzt auch alle Container zu sehen sein, die wir jetzt neu definiert haben. Zusätzlich sollte auch ein neuer Container mit einem eher kryptischen Namen gestartet worden sein. Dabei handelt es sich um den eingangs erwähnten Infra-Container. Den haben wir nicht explizit definiert, er wird automatisch generiert und gehört zum Pod.
Nicht zu erkennen ist hier, dass es irgendeine Beziehung zu einem Pod gibt. Dafür kann dann der nachfolgende Befehl genutzt werden:
|
|
Jetzt sehen wir alle aktuell laufenden Pods und die Anzahl der Container, die der Pod enthält. Dies sollten 5 Container sein, die vier die wir definiert haben plus der Infra-Container:
|
|
Mit dem Zusatz --ctr-names
können dann auch noch die Namen der enthaltenen Container ausgegeben werden:
|
|
Ausgabe:
|
|
Port freigeben
Da wir das Setup unter einem normalen Benutzer laufen lassen, kann Podman nicht automatisch den Port in der Firewall freigeben. Dies muss also manuell zusätzlich erfolgen, wenn der Dienst von außen erreichbar sein soll. Falls es sich um einen öffentlichen Server im Internet handelt, solltet ihr nur den verschlüsselten Zugang freigeben, am besten über einen Reverse Proxy.
Wenn es sich um eine Installation im lokalen Netzwerk handelt, kann auch einfach der Port 9000 (HTTP / unverschlüsselt) freigegeben werden, hier am Beispiel mit firewalld:
|
|
Initiale Einrichtung
Um die initiale Einrichtung von Authentik zu starten, ruft ihr in eurem Browser die nachfolgende URL (entsprechend angepasst) auf:
http://IP_EURES_SERVERS:9000/if/flow/initial-setup/
Dort müsst ihr dann eine Email-Adresse und ein Passwort für den Standardbenutzer mit dem Namen akadmin definieren.
Abschluss
Damit ist Authentik einsatzbereit und kann nach und nach in andere Dienste für den Login integriert werden. Weitere Beiträge zu Authentik selbst und Beispiele zur Integration in andere Dienste werden folgen.