2 Punkte von GN⁺ 2025-05-06 | 1 Kommentare | Auf WhatsApp teilen
  • Der Autor schildert, wie er beim Betrieb privater Server von der Komplexität und dem Ressourcenverbrauch von Kubernetes frustriert war und es durch eine Kombination aus systemd und Podman ersetzt hat
  • Kubernetes wirkt durch GitOps und Automatisierung attraktiv, ist in kleinen Umgebungen jedoch ein übermäßig schwergewichtiges System
  • Mit Podmans automatischer Update-Funktion und der Erzeugung von systemd-Services lassen sich die Kernfunktionen von Kubernetes auf einfache Weise nachbilden
  • Außerdem wird erklärt, wie sich durch die Kombination von systemctl und loginctl Services auf Benutzerebene automatisch starten lassen, wobei betont wird, dass der Ressourcenverbrauch auf dem VPS deutlich gesunken ist
  • Allerdings wird erwähnt, dass Podmans systemd-Integration bald durch einen neuen Ansatz namens „Quadlet“ ersetzt werden soll

Einleitung: Die erste Begegnung mit Kubernetes

  • Der Autor berichtet von seinem Versuch, 2018 beim Experimentieren mit Kubernetes einen Cluster auf einem privaten NUC aufzubauen
  • Kubernetes ist komplex, funktioniert im Kern aber nach folgender Schleifenlogik:
    • Aktuellen Zustand erfassen → gewünschten Zustand berechnen → Unterschiede berechnen → anwenden
  • Die Automatisierungsfunktionen mit verschiedenen Komponenten wie cert-manager waren äußerst beeindruckend

Die überzogenen Ressourcenanforderungen von Kubernetes

  • Auf einem privaten Server (NUC) verursachte Kubernetes dauerhafte CPU-Auslastung, Lüftergeräusche und Hitzeentwicklung
  • Auch verschiedene Distributionen wie Azure, MicroK8s und K3S verbrauchen erhebliche Ressourcen
    • MicroK8s: 12 % CPU-Auslastung (2-vCPU-VPS)
    • K3S: 6 % CPU-Auslastung (2-vCPU Ampere A1)

Die Verlockung von GitOps-Automatisierung

  • Mit Tools wie Flux war Git-basierte Deployment-Automatisierung möglich und sehr komfortabel
  • Wenn nur das Container-Image auf GitHub gepusht wurde, deployte der Server automatisch die neueste App-Version
  • Ohne Kubernetes war eine solche Automatisierung jedoch sehr schwer umzusetzen

Podman und systemd treten auf den Plan

  • Podman ist eine Alternative zu Docker und bietet die Funktion, Container in systemd-Services umzuwandeln
  • Mit podman generate systemd lassen sich Service-Dateien automatisch erzeugen
  • Über das Tag io.containers.autoupdate sind automatische Image-Updates einmal täglich möglich
  • Mit Verweis auf Fedora Magazine gelang es dem Autor, auf diese Weise erfolgreich eine Kubernetes-Ersatzumgebung aufzubauen

Die drei nötigen Bausteine

  1. systemctl --user enable mycontainer.service

    • Richtet ein, dass der Container beim Login automatisch startet
  2. loginctl enable-linger

    • Richtet ein, dass die Benutzersitzung beim Serverstart aktiviert wird
  3. Podmans Auto-Update-Funktion

  • Mit diesen drei Bausteinen ließen sich 99 % der von Kubernetes bereitgestellten Funktionen einfacher und leichter ersetzen

Ergebnis der Migration

  • Alle Services wurden vom bisherigen VPS auf einen neuen VPS migriert
  • Der Ressourcenbedarf wurde halbiert, während sich die Leistung sogar verbesserte, die Service-Dichte stieg und Kosten konnten gesenkt werden

Nächste Aufgabe: Quadlet

  • Leider soll Podmans systemd-Integration bald eingestellt werden
  • Stattdessen soll auf eine neue Definitionsform in Gestalt von Quadlet-Dateien umgestellt werden
  • Abschließend merkt der Autor an, dass man sich darauf vorbereiten müsse, diese neue Technik zu erlernen

1 Kommentare

 
GN⁺ 2025-05-06
Hacker-News-Kommentare
  • Wenn man Kubernetes nur dafür nutzt, Container-Images auszuführen und zu aktualisieren, ist das womöglich übertrieben

    • Kubernetes stellt die nötigen Ressourcen bereit, damit Container Zustand teilen, sich miteinander verbinden und auf Konfigurationen oder Secrets zugreifen können
    • Die CPU- und Speicherkosten entstehen durch das Verwalten der Container und das Bereitstellen der benötigten Ressourcen
    • In verteilten Systemen funktioniert nie alles genau so, wie man es möchte, daher versucht der Controller fortlaufend, den gewünschten Zustand herzustellen
  • Es wurde versucht, mit Docker einige kleine Websites zu betreiben, aber das Aktualisieren und Testen von Images war schwierig

    • Alles wurde durch ein Skript ersetzt, das auf Debian systemd-Units erzeugt und Dienste bei Änderungen neu startet
    • Mit einer Test-VM werden Änderungen per rsync auf den Deployment-Host übertragen und das Deployment-Skript ausgeführt
    • Das gesamte System läuft auf einem 2-GB-VPS; wenn WordPress SQLite offiziell unterstützen würde, ließe es sich auf 1 GB reduzieren
    • Zur Minimierung des Supportaufwands wird MariaDB verwendet
  • Das Verwalten eines Kubernetes-Clusters ist kein Problem, aber für Hobbyprojekte ist der Einsatz wegen des Ressourcenbedarfs schwierig

    • Kubernetes ist zu ressourcenintensiv, um auf einem VPS für 10 $/Monat zu laufen
    • Stattdessen werden manuell docker compose-Befehle verwendet und anstelle von Ingress die Container-Erkennung von Traefik
    • Anstelle von CronJobs werden kleine Skripte geschrieben, um crontab zu verwalten
    • Dabei versucht man, Probleme, die Kubernetes bereits gelöst hat, weniger effizient erneut zu lösen
    • Gewünscht ist eine leichtgewichtige Alternative mit Kubernetes-kompatibler API, die auf günstigen VPS-Instanzen gut funktioniert
  • systemd löst viele Probleme und sollte nicht ignoriert werden

    • Es bietet verschiedene Funktionen wie machinectl, nspawn, vmspawn und importctl
    • homed/homectl erweitern die Benutzerverwaltung, mounts übernehmen das automatische Einhängen von Laufwerken, boot steuert das Starten/Stoppen von Diensten, timers ersetzen cron
    • Service-Units steuern Aufgaben, und mit systemctl edit lassen sich Konfigurationsdateien bearbeiten
  • Ein Homelab wird mit podman-systemd betrieben, und bei jeder Untersuchung neuer Kubernetes-Varianten entsteht kein zusätzlicher Aufwand

    • Mit Ansible-Playbooks werden Images vorab gezogen und Unit-Dateien an den richtigen Stellen abgelegt
    • Ein Voron-3D-Drucker-Stack läuft mit podman-systemd; ein Wechsel zu mkosi und systemd-sysupdate wird erwogen
    • Es ist lästig, Docker-Compose-Dateien in systemd-Units umwandeln zu müssen
    • Podman verringert die Komplexität bei Benutzer-/Rechteeinstellungen
  • Die Verwaltung von Containern innerhalb von systemd mit Quadlet ist der nächste Schritt

    • Weitere Details finden sich im Red-Hat-Blog
  • Mit Skate wurde ein System gebaut, das Multihost und Kubernetes-Manifeste unterstützt

    • Intern verwendet es podman und systemd
  • Mit docker compose-Befehlen und Caddy lassen sich Zertifikate automatisch beziehen

    • Mit dem Befehl docker compose up -d --pull always lässt sich das einfach einrichten
    • Das CI-Setup ist mit scp und ssh aufgebaut
    • Es ist einfach und funktioniert auch auf Entwicklungsmaschinen
  • systemd bietet inzwischen mit ParticleOS eine offiziell unterstützte OS-Distribution für unveränderliche Workflows

  • Deployments auf einen einzelnen Server sollten nicht kompliziert sein; dafür wurde ein Tool namens Harbormaster geschrieben

    • Es entdeckt Repositories über YAML-Dateien und führt Docker-Compose-Dateien aus
    • Der gesamte Zustand wird in einem einzigen Verzeichnis gespeichert, was Backups erleichtert
    • Es ist das einfachste Container-Orchestrierungstool, das man für einen einzelnen Server braucht