Designentscheide
Warum es so gebaut ist.
Für jeden Teil des Labs gab es eine einfachere oder beliebtere Alternative. Das sind die Entscheide, die es geprägt haben, wogegen sie getroffen wurden und was sie kosten. Jeder ist im Repository des Labs festgehalten, bevor etwas gebaut wird.
Backups statt Replikate
- Gewählt
- ZFS auf dem Host, mit einem Mirror für Unersetzliches und Backups, die das Haus verlassen.
- Statt
- Ceph oder Longhorn, repliziert über die Nodes.
- Warum
- Auf einem Server landet jedes Replikat auf denselben Disks. Das verdreifacht die Schreiblast und bringt keine Sicherheit, weil der Ausfall, den es abfangen soll, alle Kopien gleichzeitig trifft.
- Der Preis
- Ein totes Disk-Paar heisst Restore, kein Failover. Der Restore wird getestet, damit das nur lästig bleibt.
Bewusst keine Redundanz für Medien
- Gewählt
- Eine grosse einzelne Disk für Filme und Serien, getrennt von allem anderen.
- Statt
- Auch die Mediathek zu spiegeln.
- Warum
- Medien lassen sich neu beschaffen, Fotos und Dokumente nicht. Eine zweite grosse Disk würde den Teil schützen, auf den es am wenigsten ankommt.
- Der Preis
- Stirbt diese Disk, muss die Mediathek von Hand neu aufgebaut werden. Nichts Unersetzliches liegt darauf.
Der Manager läuft nie auf dem, was er verwaltet
- Gewählt
- Sidero Omni in einer eigenen VM neben dem Cluster, mit einem Login, der nicht vom Cluster abhängt.
- Statt
- Den Manager im Cluster zu betreiben oder sich über den Identity Provider des Clusters bei ihm anzumelden.
- Warum
- Den Cluster wiederherzustellen darf nie den Cluster voraussetzen. Wenn alle Nodes down sind, muss das Werkzeug, das sie neu aufbaut, trotzdem starten und mich trotzdem hereinlassen.
- Der Preis
- Eine Maschine mehr, die aktuell gehalten werden muss, und ein Login mehr, um den man sich kümmern muss.
Disks für Pods über einen engen Schlüssel
- Gewählt
- Proxmox CSI, das nur ein eingeschränktes Token hält, mit dem es Disks anlegen und anhängen kann.
- Statt
- Einen Storage-Treiber, der sich per SSH als root auf dem Host anmeldet.
- Warum
- Der Cluster steht zum Internet hin. Ein Einbruch dort soll keinen root-Zugang zum Server darunter mitbringen.
- Der Preis
- Keine Volume-Snapshots in Kubernetes. Volumes werden stattdessen als verschlüsselte Backups hinauskopiert.
Kubernetes, obwohl Compose reichen würde
- Gewählt
- Kubernetes für jede App im Lab.
- Statt
- Docker Compose auf einer einzelnen Maschine.
- Warum
- Compose würde jeden Dienst hier mit einem Bruchteil des Aufwands betreiben. Kubernetes sauber zu betreiben ist der Zweck des Labs, also bekommt es bewusst das schwerere Werkzeug.
- Der Preis
- Mehr bewegliche Teile, als eine Familie braucht. Jedes muss sich seinen Platz auf der Stack-Karte verdienen.
Ein Betriebssystem ohne Shell
- Gewählt
- Talos Linux: unveränderlich, per API konfiguriert, ohne SSH und ohne Paketmanager.
- Statt
- k3s oder kubeadm auf einem gewöhnlichen Linux.
- Warum
- Nodes, die zum Internet hin dienen, sollen so wenig wie möglich enthalten. Upgrades werden zum Image-Tausch, und die Konfiguration lebt in einer Datei statt in der Shell-History.
- Der Preis
- Kein schneller Fix per Login. Jede Änderung geht über die Konfiguration, auch um zwei Uhr nachts.
Eine Tür, mit Login davor
- Gewählt
- Envoy Gateway mit der Gateway API, das Authentik fragt, bevor eine Anfrage die Apps dahinter erreicht.
- Statt
- ingress-nginx und die eigene Gateway-API-Umsetzung von Cilium.
- Warum
- ingress-nginx ist eingestellt und bekommt keine Sicherheitsupdates mehr. Das Gateway von Cilium hat keinen Anschluss für einen externen Login, das hätte einen eigenen Login pro App bedeutet.
- Der Preis
- Ein schwereres Gateway als nötig. Ein leichteres ist als Ausweichlösung notiert.
Secrets kommen nie in Git, auch nicht verschlüsselt
- Gewählt
- Ein gehosteter Tresor ausserhalb des Labs. Der Cluster holt Secrets von dort, Git enthält nur Verweise.
- Statt
- Verschlüsselte Secrets neben den Manifesten im Repository.
- Warum
- Eine verschlüsselte Datei bleibt ein Ziel, und ihr Schlüssel muss irgendwo liegen. Ein Tresor ausserhalb des Labs übersteht einen Totalausfall. Die wenigen Vertrauensanker bleiben im Passwortmanager, weil man sonst das System bräuchte, um das System wiederherzustellen.
- Der Preis
- Eine Abhängigkeit von einem externen Dienst. Laufende Secrets funktionieren weiter, wenn er nicht erreichbar ist; nur Änderungen warten.
Ein Backup zählt erst, wenn es wiederhergestellt wurde
- Gewählt
- Ein Restore-Test, der selbstständig ein Backup zurückholt und das Ergebnis prüft. Der Live-Status zeigt, wann er zuletzt bestanden hat.
- Statt
- Darauf zu vertrauen, dass die Backup-Jobs Erfolg melden.
- Warum
- Ein Backup-Job kann monatelang Erfolg melden und dabei etwas schreiben, das sich nicht wiederherstellen lässt. Der einzige Beweis ist ein Restore.
- Der Preis
- Zusätzliche Last und eine Sache mehr, die Alarm schlagen kann.
Ein VPN statt eines Mesh-Overlays
- Gewählt
- WireGuard auf dem Router als einziger Weg von aussen zur Admin-Seite.
- Statt
- Tailscale, das die meisten Homelab-Anleitungen empfehlen.
- Warum
- Tailscale löst das Problem einer fehlenden öffentlichen Adresse. Dieser Anschluss hat eine, also wäre das Overlay nur ein weiterer Zugang gewesen, den man absichern muss und den jemand anderes betreibt.
- Der Preis
- Die Apps antworten nur auf Webverkehr aus einem Land. Im Ausland verbindet die Familie zuerst den Tunnel. Das ist der grösste Nachteil, und er ist akzeptiert.
Diese Website lebt getrennt vom Lab
- Gewählt
- Eine statische Seite am Edge. Das Lab schickt ihr einen kleinen signierten Status; nichts greift ins Lab hinein.
- Statt
- Die Seite auf dem Cluster zu hosten, den sie beschreibt.
- Warum
- Eine Statusseite, die mit dem ausfällt, worüber sie berichtet, sagt nichts aus. Hinausschicken heisst ausserdem: kein Weg von aussen hinein für die Seite.
- Der Preis
- Der Status kann ein paar Minuten alt sein. Die Seite sagt, wie alt.