<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Ænix Blog (Deutsch)</title><link>https://aenix.io/de/blog/</link><description>Ænix-Blog auf Deutsch — Cloud-Souveränität, Kubernetes, DORA/NIS2, Plattform-Engineering, VMware-Ausstieg und KI-Infrastruktur.</description><language>de</language><lastBuildDate>Thu, 08 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://aenix.io/de/blog/" rel="self" type="application/rss+xml"/><item><title>Paleocomputing, Teil 2: Kubernetes in Oberon, Wirths Funk statt Netzwerk, ein Cluster im Browser und was vergessene Technik über die Infrastruktur von morgen verrät</title><link>https://aenix.io/de/blog/2026/10/paleocomputing-teil-2-kubernetes-oberon-wirth-funk/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/10/paleocomputing-teil-2-kubernetes-oberon-wirth-funk/</guid><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><dc:creator>Timur Tukaev</dc:creator><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><category>Open Source</category><category>Retrocomputing</category><category>Distributed Systems</category><description>Kube: eine Kubernetes Control Plane in Oberon auf Niklaus Wirths eigenen Maschinen, die per Funk kommunizieren. Sechs Browser-Labs, Designlehren, Anleitung.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/paleocomputing-teil-2-kubernetes-oberon-wirth-funk.jpg" alt=""></p><p>Stellen Sie sich einen Kubernetes-Cluster ohne eine einzige Netzwerkkarte vor. Seine Nodes wissen nichts von TCP/IP, nicht einmal von Ethernet; sie rufen sich über Funk in kurzen 32-Byte-Paketen zu, wie Poliere mit Walkie-Talkies auf einer Baustelle. Die Control Plane ist in einer Sprache aus den späten Achtzigern geschrieben und kommt samt Netzwerkprotokoll auf rund 1.250 Zeilen. Um einen Pod zu starten, wird nichts heruntergeladen: Der Node lädt einfach ein Modul und ruft darin eine Prozedur auf. Und das Beste: Das Ganze öffnet sich in einem Browser-Tab, in dem Sie einem Node den Stecker ziehen, den Funk stören, dem Cluster einen gefälschten Befehl unterschieben und zusehen können, was passiert.</p>
<p>Diesen Cluster habe ich in den letzten Wochen gebaut und Kube genannt. Es ist eine Kubernetes Control Plane, geschrieben in Oberon, der Sprache von Niklaus Wirth, und sie läuft auf Oberon-Maschinen, also auf dem Prozessor und dem Betriebssystem, die Wirth selbst entworfen hat, von der Schaltung bis zu den Fenstern auf dem Bildschirm. Auch Kubes Nodes sind Oberon-Maschinen, und sie kommunizieren über ein Funknetz aus demselben Buch: Wirth hat dieses Netzwerk schon Ende der Achtziger für seine Workstations geschrieben, und die Neuauflage des Projekts hat es auf ein billiges Funkmodul verlegt.</p>
<p>Lassen Sie mich gleich sagen, warum ich das mache, denn bei Geschichten wie dieser kommt diese Frage immer zuerst, meist mit einem Schmunzeln. Für mich ist das kein Projekt zum Spaß und auch kein Versuch, eine hübsche alte Technik ans Licht zu zerren, damit man sie bewundert und weitergeht. Es ist vor allem Forschung. Ich möchte verstehen, was aus der Infrastruktur der Vergangenheit hätte werden können, wenn die Ideen, die wir heute Kubernetes nennen, in den Jahren aufgekommen wären, als ein Computer klein war, von einem einzelnen Menschen vollständig verstanden werden konnte und mit seinen Nachbarn über das verbunden war, was gerade zur Hand war. Welche interessanten Prinzipien die vergessenen Technologien in sich trugen und was wir mit ihnen weggeworfen haben. Was diesen Technologien fehlte und warum man sie aufgegeben hat. Und wenn man beides ehrlich sortiert, kann man versuchen, in die Zukunft zu blicken und sich eine Infrastruktur vorzustellen, in der die Komplexität nicht schneller wachsen muss als der Nutzen.</p>
<p>Kubernetes ist dafür ein bequemer Bezugspunkt. Seine Kernidee passt in einen Satz: Man sagt dem System nicht, was es tun soll, sondern beschreibt, was existieren soll, und eine Reihe unabhängiger Schleifen vergleicht immer wieder Soll und Ist und schließt die Lücke Schritt für Schritt. Diese Idee weiß nichts von Go, Containern, etcd oder Clouds, und sie lässt sich auf jede Maschine übertragen. Wirths Maschine eignet sich dafür besser als jede andere, weil man sie vollständig lesen kann, von den Registern des Prozessors bis zum Pod-Scheduler, ohne dass sich etwas unter einem Framework versteckt. Wenn man ein großes System in ein so kleines verpflanzt, wird sofort klar, was daran Wesen und was Ablagerung ist, welche Entscheidungen erzwungen waren und welche bloße Gewohnheit.</p>
<p>Dies ist der zweite Teil meiner Serie über Paleocomputing. Im <a href="https://aenix.io/de/blog/2026/09/paleocomputing-teil-1-wirth-oberon-qemu-kubevirt/">ersten Teil</a> habe ich erzählt, wie ich Wirths Prozessor im Browser, in QEMU, in Kubernetes und in Cozystack zum Laufen gebracht habe, wo sich eine Oberon-Maschine inzwischen mit einem Klick aus dem Katalog installieren lässt. Sie müssen ihn nicht gelesen haben: Alles, was Oberon und Wirths Maschine betrifft, erkläre ich unterwegs, und Kubernetes kennen Sie vermutlich so gut wie ich. Der Artikel ist wieder lang geworden. Zuerst erzähle ich, wie Kube aufgebaut ist und wie es funktioniert, dann von den Prinzipien, die die Sprache und das Betriebssystem Oberon ihm aufgezwungen haben, worin es sich von echtem Kubernetes unterscheidet, wo es besser und wo es spürbar schlechter geworden ist. Danach folgen sechs Labs, die Sie direkt im Browser durchspielen können, eine Anleitung für alle, die das Ganze selbst installieren wollen, und zum Schluss meine Gedanken dazu, was solche Experimente denjenigen beibringen können, die heute Infrastruktur bauen.</p>
<p>Wenn Sie lieber zuerst anfassen und dann lesen, öffnen Sie das <a href="https://tym83.github.io/paleocomputing/oberon/kube.html">Cluster-Lab</a>. Installieren müssen Sie nichts. Innerhalb einer halben Minute booten drei Maschinen, die Control Plane startet Kube, die Nodes treten bei, und rechts erscheint eine Cluster-Tabelle, die die Seite allein durch Mithören auf dem Funkkanal aufbaut. Quellcode, Dokumentation und sämtliche Messungen liegen im Repository <a href="https://github.com/tym83/paleocomputing">github.com/tym83/paleocomputing</a>.</p>
<figure><img src="en-02-formed.png" alt="Drei Oberon-Maschinen in einem Browser-Tab" width="1440" height="900" loading="lazy" decoding="async">
  <figcaption><p>Drei Oberon-Maschinen in einem Browser-Tab. Links ihre Bildschirme, rechts die aus dem Funkverkehr aufgebaute Cluster-Tabelle und die Labs, die sich selbst prüfen</p></figcaption>
</figure>

<h2 id="wie-kube-aufgebaut-ist">Wie Kube aufgebaut ist</h2>
<h3 id="oberon-und-wirths-maschine-in-kürze">Oberon und Wirths Maschine in Kürze</h3>
<p>Oberon ist zugleich eine Programmiersprache und ein Betriebssystem. Entwickelt haben beides Mitte der Achtziger an der ETH Zürich Niklaus Wirth, der Autor von Pascal und Modula-2, und Jürg Gutknecht. Die Sprache ist winzig: Module, Records, Arrays, Pointer, Garbage Collection und strenge Typisierung, dagegen keine Exceptions, keine Generics und nicht einmal vorzeichenlose Ganzzahlen. Das System passt zur Sprache. Es hat keine Prozesse, keine Threads und keinen Speicherschutz. Ganz unten dreht sich eine einzige Schleife, <code>Oberon.Loop</code>: Sie fragt Maus und Tastatur ab, ruft Kommandos nacheinander auf und ruft in den Pausen zwischen Eingabeereignissen Hintergrund-Tasks auf, <code>Oberon.Task</code>. Ein Task kann nicht unterbrochen werden, also muss er sein Stück Arbeit schnell erledigen und zurückkehren. Multitasking ist hier mit anderen Worten kooperativ und beruht auf den guten Manieren aller Beteiligten.</p>
<p>2013 veröffentlichte Wirth eine Neuauflage des Buchs Project Oberon und ergänzte das System um seinen eigenen Prozessor, RISC5, beschrieben in Verilog. In ein FPGA geladen, lief er auf einem Board mit einem Megabyte Speicher bei 25 MHz. Das ist Wirths Maschine. Bei uns lebt sie in drei Gestalten: Im Browser läuft Wirths tatsächliche Schaltung, nach C++ übersetzt und zu WebAssembly kompiliert; in QEMU läuft unser eigenes Modell der Maschine; und in Kubernetes läuft dasselbe QEMU-Modell innerhalb von KubeVirt.</p>
<h3 id="wie-alles-anfing">Wie alles anfing</h3>
<p>Die erste Version von Kube war ein reines Spielzeug, und das habe ich in einer eigenen Folge der Serie auch ehrlich gesagt. Sie bestand aus einem einzigen Oberon-Modul mit einem Objekt-Store und drei Controllern, für Deployments, ReplicaSets und Nodes. Die Nodes waren drei Namen, <code>node-a</code>, <code>node-b</code> und <code>node-c</code>, und ein Pod galt nur deshalb als laufend, weil ein Controller den Namen eines Nodes in ihn eingetragen hatte. Nirgends lief irgendetwas. Doch schon diese Version zeigte sehr deutlich, dass das Herz von Kubernetes nicht Container sind, sondern Reconcile-Loops, und dass diese Schleifen wunderbar zu Oberon passen.</p>
<p>Sie passen, weil Oberon bereits alles mitbringt, was eine Control Plane braucht, nämlich eine zentrale Schleife, die Hintergrundarbeit aufruft. <code>Kube.Start</code> installiert die drei Controller als drei <code>Oberon.Task</code>s mit einer Periode von 50 Millisekunden, im selben Ring, in dem auch der Garbage Collector des Systems läuft, und von da an ruft <code>Oberon.Loop</code> sie auf, wann immer der Benutzer gerade nicht tippt oder die Maus bewegt. Die Controller rufen sich nicht gegenseitig auf und schicken sich nichts. Jeder betrachtet nur Objekte seiner eigenen Art und ändert nur, was ihm gehört, und das Ergebnis seines Durchlaufs wird beim nächsten Durchlauf zur Eingabe eines Nachbarn. Genau so interagieren auch die Controller des echten Kubernetes: über gemeinsamen Zustand, nicht über Nachrichten.</p>
<p>Um das Ganze einen Cluster nennen zu können, fehlten zwei Dinge. Erstens Nodes, also mehrere Maschinen und eine Möglichkeit, miteinander zu sprechen. Zweitens Rollouts, bei denen eine Version einer Anwendung eine andere ohne Downtime ablöst. Bei den Nodes dachte ich zuerst, ich sei in eine Sackgasse geraten, denn Wirths Maschine hat kein Netzwerk. Dann habe ich das Buch noch einmal gelesen und darin den Funk gefunden.</p>
<h3 id="wirths-funk">Wirths Funk</h3>
<p>Die Oberon-Workstations an der ETH waren immer vernetzt. Wirth schrieb dieses Netzwerk schon Ende der Achtziger für die kabelgebundene Ceres-Workstation, und in der Ausgabe von 2013 verlegte Paul Reed, der mit ihm an der neuen Version des Projekts arbeitete, es auf Funk. Auf dem Board sitzt ein nRF24L01+-Transceiver, ein billiger Chip, den man bis heute in kabellosen Tastaturen und Bastelgeräten findet, und der Prozessor spricht mit ihm über SPI, einen einfachen seriellen Bus. Der Chip ist sehr bescheiden. Er sendet jeweils einen Frame von höchstens 32 Bytes, empfangene Frames warten in einem Puffer mit drei Plätzen, alle Stationen auf einem Kanal hören einander, und eine Kollisionsvermeidung gibt es überhaupt nicht: Sprechen zwei Stationen gleichzeitig, bekommt der Empfänger entweder Müll oder gar nichts.</p>
<p>Der Treiber des Chips, das Modul <code>SCC</code>, umfasst rund zweihundert Zeilen. Jedes seiner Pakete beginnt mit einem acht Byte langen Header mit Adressen, Typ und Länge, und ein langes Paket wird in mehrere 32-Byte-Frames zerlegt. Auf <code>SCC</code> sitzt das Modul <code>Net</code>, ein kleines Protokoll, mit dem sich Stationen Nachrichten und Dateien schicken. Wenn ich im Folgenden von Wirths Funk spreche, meine ich genau dieses Paar, und mit dem Funkkanal alles, was die Stationen auf einem Kanal hören.</p>
<p>Warum Funk und kein gewöhnliches Netzwerk? Weil Wirths Maschine schlicht kein anderes hat. Sie besitzt weder Ethernet noch einen TCP/IP-Stack, und die zu schreiben hieße, ein kleines Linux auf Oberon zu bauen. Der Funk dagegen ist im selben Buch beschrieben, und ich war neugierig, was für ein System herauskommt, wenn ich die Grenzen der Maschine ehrlich akzeptiere, statt ihr ein modernes Netzwerk überzustülpen.</p>
<p>Eine virtuelle Maschine hat natürlich keinen echten Funk. Deshalb emuliert unser QEMU-Modell den gesamten nRF24L01+-Chip samt Registern und Warteschlangen und verpackt jeden gesendeten Frame in ein UDP-Datagramm. Die Datagramme fließen zu einem Relay, einem kleinen Programm, das jeden Frame an alle anderen Maschinen weiterreicht. Das ist der Funkkanal. Das Relay kann einen vorgegebenen Anteil der Frames verlieren, und wenn man es anhält, ist der Funkkanal ganz weg. In Cozystack, unserer offenen Plattform auf Basis von Kubernetes, wurde das Relay zu einer Katalog-Anwendung, <code>OberonAir</code>, und im Browser spielt die Seite selbst den Funkkanal.</p>
<h3 id="drei-nachrichten-jede-in-einem-frame">Drei Nachrichten, jede in einem Frame</h3>
<p>Das Protokoll, das ich KubeNet genannt habe, kennt nur drei Nachrichten. Jede geht an alle gleichzeitig, denn ein Funkgerät kann ohnehin keinen Empfänger auswählen, und jede passt in einen einzigen Frame.</p>
<p>Ein Node sendet einmal pro Sekunde seinen Heartbeat mit seinem Namen und den IDs der Pods, die gerade tatsächlich auf ihm laufen. Die Control Plane sendet jedem lebenden Node einmal pro Sekunde eine Zuweisung mit den Pods, die an diesen Node gebunden sind. Die dritte Nachricht, eine Spec, kommt ebenfalls von der Control Plane und teilt mit, welches Image der Pod mit einer bestimmten ID hat. Specs gehen eine pro Tick hinaus, noch nicht gestartete Pods zuerst.</p>
<p>Warum ein Frame und nicht eine Nachricht beliebiger Länge? <code>SCC</code> kann Pakete bis zu einem halben Kilobyte senden, indem es sie in Frames zerlegt, aber der Funkkanal hat keine Kollisionsvermeidung. Beginnen zwei Stationen gleichzeitig, lange Pakete zu senden, werden ihre Frames bei jedem Empfänger ineinander verschachtelt, und der Empfänger kann nicht mehr erkennen, welcher Frame zu wem gehört. Man könnte eine Arbitrierung für den Funkkanal erfinden, Warteschlangen und Neuübertragungen, aber genau auf diesem Weg sind Netzwerke bei der Komplexität angekommen, der ich entkommen wollte. Also passt jede Nachricht in einen Frame, und nach dem <code>SCC</code>-Header bleiben 24 Bytes Nutzdaten.</p>
<p>In einem Heartbeat und einer Zuweisung sind diese Bytes so aufgeteilt: das Cluster-Tag, sechs Bytes Node-Name, die Anzahl der Pods, bis zu zehn Pod-IDs zu je einem Byte, zwei Bytes Zähler und vier Bytes Signatur. Genau vierundzwanzig. Daher kommen alle seltsamen Grenzen von Kube: Ein Node-Name hat höchstens sechs Zeichen, eine Pod-ID belegt ein Byte, und ein Node betreibt höchstens zehn Pods, weil nicht mehr in einen Heartbeat passen und der Scheduler auch nicht mehr bindet.</p>
<p>Die wichtigste Eigenschaft des Protokolls ist, dass es level-triggered ist wie die Controller von Kubernetes, nur nicht innerhalb der Control Plane, sondern im Netzwerk selbst. Ein Node betreibt genau das, was seine letzte Zuweisung sagt, und nicht eine Folge von „start“- und „stop“-Befehlen. Geht eine Zuweisung verloren, kommt eine Sekunde später eine mit demselben Inhalt, es gibt also nichts zu reparieren. Geht ein Heartbeat verloren, wartet die Control Plane auf den nächsten. Es gibt keine Bestätigungen, keine Neuübertragungen und keine Sequenznummern für die Zuverlässigkeit: Die gesamte Zuverlässigkeit entsteht daraus, dass jede Nachricht den vollständigen Zustand trägt und nicht eine Änderung. Selbst auf einem Funkkanal, der 30 Prozent seiner Pakete verliert, hat sich in einer Minute kein einziger Pod bewegt, und das habe ich geprüft.</p>
<figure><img src="en-03b-air-log.png" alt="Der Funkkanal im Lab" width="420" height="341" loading="lazy" decoding="async">
  <figcaption><p>Der Funkkanal im Lab. Herzen sind Heartbeats der Nodes, Pfeile Zuweisungen der Control Plane, der Stift markiert Pod-Specs. Gerade läuft ein Rollout, und die Control Plane teilt den Nodes neue Pods mit dem Image Ticker2 mit</p></figcaption>
</figure>

<h3 id="ein-pod-ist-ein-modul">Ein Pod ist ein Modul</h3>
<p>Im echten Kubernetes ist das Image eines Pods ein Dateisystem-Archiv mit einem Programm darin: Das Kubelet holt es aus einer Registry und startet es in einem isolierten Container. Oberon hat nichts dergleichen, aber es hat einen Mechanismus, der ähnlich und viel schneller funktioniert. Das Image eines Pods ist in Kube einfach der Name eines Oberon-Moduls auf dem Node.</p>
<p>Erfährt das Kubelet von einem neuen Pod, ruft es <code>Modules.Load</code> mit dem Namen des Images auf. Ist das Modul noch nicht geladen, sucht das System seine kompilierte Datei auf der Festplatte, lädt sie in den Speicher, bindet sie mit allen Modulen, die sie importiert, prüft die Schlüssel ihrer Schnittstellen und führt den Rumpf des Moduls aus. Ein Schlüssel ist eine Art Prüfsumme der Schnittstelle, die der Compiler in jedes Modul schreibt. Hat sich eine Schnittstelle geändert, weigert sich das System, Module zu laden, die gegen die alte Version kompiliert wurden. Dann sucht das Kubelet das Kommando <code>Start</code> des Moduls und ruft es auf, und wenn der Pod verschwinden soll, ruft es das Kommando <code>Stop</code> desselben Moduls auf.</p>
<p>Ein Kommando ist in Oberon jede exportierte Prozedur ohne Parameter. Man führt es aus, indem man mit der mittleren Maustaste auf den Text <code>Module.Procedure</code> in einem beliebigen Fenster klickt, und braucht es Parameter, liest es sie selbst aus dem Text hinter seinem Namen. Die ID eines Pods lässt sich also nicht direkt übergeben, und dafür gibt es ein winziges Modul, <code>Pods</code>, mit zwei Variablen, der ID und dem Image. Das Kubelet füllt sie vor dem Aufruf, und das Workload-Modul liest sie. Nicht die eleganteste Lösung, aber ganz im Geiste von Oberon: Eine globale Variable eines Moduls ist hier ein legitimer Weg, Kontext weiterzugeben, denn zu jedem Zeitpunkt läuft nur ein Kommando, und Race Conditions können gar nicht entstehen.</p>
<p>Den Lehr-Workload gibt es in zwei Versionen, <code>Ticker</code> und <code>Ticker2</code>. Für jeden gestarteten Pod führt er einen Sekundenzähler, und das Kommando <code>Ticker.Show</code> zeigt an, welche Pods auf dieser Maschine laufen und wie viele Sekunden jeder schon lebt. So lassen sich Rollouts gut beobachten: Im Log des Nodes sieht man, wie die Pods der ersten Version stoppen und die der zweiten starten.</p>
<p>Gibt es auf dem Node kein Modul dieses Namens, lässt sich <code>Start</code> nicht aufrufen, und das Kubelet lässt den Pod einfach aus seinem Heartbeat weg. Die Control Plane sieht, dass der Pod zugewiesen ist, aber nicht läuft, und er bleibt Pending. In Kubernetes sieht ein Pod genau so aus, dessen Image nicht gezogen werden konnte.</p>
<h3 id="der-store-auf-der-festplatte">Der Store auf der Festplatte</h3>
<p>In Kubernetes liegt der gesamte Zustand des Clusters in etcd, und eine neu gestartete Control Plane liest ihn von dort. In Kube übernimmt ein Array aus 256 Einträgen im Speicher der Control-Plane-Maschine die Rolle von etcd, und damit es einen Neustart übersteht, schreibt ein Hintergrund-Task es bei jeder Änderung auf die Festplatte.</p>
<p>Geschrieben wird abwechselnd in zwei Dateien, <code>Kube.Store0</code> und <code>Kube.Store1</code>, jede mit einer Generationsnummer und einer Prüfsumme. Fällt mitten im Schreiben der Strom aus, ist nur eine Datei beschädigt, und die andere, aus der vorherigen Generation, bleibt erhalten. Beim Start liest <code>Kube.Start</code> beide und nimmt die neuere der unbeschädigten. Die Dateien werden an Ort und Stelle überschrieben statt neu angelegt, und auch das verlangt Oberon: Sein Dateisystem gibt den Platz ersetzter Dateien erst beim nächsten Booten frei, und würde man für jede Änderung eine neue Datei anlegen, liefe einem viel beschäftigten Cluster schlicht die Festplatte voll.</p>
<p>Nach einem Neustart gibt die Control Plane den Nodes ein Heartbeat-Timeout Zeit, sich zu melden, und beginnt erst danach, sie als NotReady zu zählen. Kubernetes macht es nach einem Neustart seines Node-Controllers genauso. Den Beginn dieses Timeouts musste ich übrigens verschieben, vom Moment, in dem der Store gelesen ist, auf den Moment, in dem die Control Plane anfängt, den Funkkanal abzuhören. In der Cloud hatte jemand es geschafft, zwischen diesen beiden Befehlen etwas über VNC einzutippen, das Timeout lief ab, und alle Pods zogen um, obwohl keiner gestoppt war.</p>
<h3 id="rollouts-und-zwei-bugs-die-kubernetes-gut-kennt">Rollouts und zwei Bugs, die Kubernetes gut kennt</h3>
<p>Das Kommando <code>Kube.Apply web 6 Ticker2</code>, abgesetzt auf ein laufendes <code>web 6 Ticker</code>, ändert das Image. Der Deployment-Controller legt ein neues ReplicaSet an und beginnt, Pods einen nach dem anderen umzuziehen. Zuerst kommt ein Pod mit dem neuen Image hinzu. Sobald sein Kubelet meldet, dass er läuft, gibt es einen Pod mehr als gewünscht, und das alte ReplicaSet entfernt einen der eigenen. Das wiederholt sich, bis das alte ReplicaSet leer ist, dann wird es gelöscht.</p>
<p>Das klingt einfach, aber unterwegs tauchten zwei Bugs auf, und beide erwiesen sich als alte Bekannte von Kubernetes.</p>
<p>Der erste betrifft das Stoppen eines Pods. Löscht die Control Plane einen Pod aus dem Store, läuft der Pod auf seinem Node weiter, bis das Kubelet die nächste Zuweisung hört, und das kann bis zu einer Sekunde dauern. Bis dahin sieht der Controller schon einen Pod weniger und fügt einen neuen hinzu. So liefen für einen Moment acht Pods, wo sieben erlaubt waren. Das echte Kubernetes verhält sich genauso, und erst kürzlich hat das Deployment das Feld <code>podReplacementPolicy</code> bekommen, mit dem es wartet, bis alte Pods vollständig gestoppt sind, und auch das ist noch Alpha, hinter einem Feature Gate. In Kube habe ich das zum einzigen Verhalten gemacht: Pods, die die Nodes noch melden, die aber nicht mehr im Store stehen, gelten als stoppend, und solange es welche gibt, kommt kein neuer Pod hinzu.</p>
<p>Der zweite Bug betrifft die Pod-IDs. Ein Node kennt einen Pod nur an seiner Ein-Byte-ID. Anfangs bekam ein neuer Pod die niedrigste freie ID, und das war oft genau die ID des alten Pods, den er gerade ersetzt hatte. Das Kubelet sah in der Zuweisung eine bekannte ID und schloss, es habe sich nichts geändert. Der Store behauptete, Ticker2 laufe, während auf dem Node weiter Ticker lief. Genau deshalb verwendet Kubernetes die UID eines Pods niemals wieder. Kubes IDs werden jetzt reihum vergeben, und die Prüfung nach jedem Rollout verlangt, dass keine ID eines alten Pods mehr läuft.</p>
<figure><img src="en-04-rolled.png" alt="Der Rollout ist abgeschlossen" width="1440" height="900" loading="lazy" decoding="async">
  <figcaption><p>Der Rollout ist abgeschlossen: Alle vier Pods laufen mit dem neuen Image, und während des Rollouts gab es nie weniger als vier und nie mehr als fünf Pods. Gezählt hat das die Seite anhand der Heartbeats, nicht anhand dessen, was die Control Plane sagt</p></figcaption>
</figure>

<h3 id="die-ausfälle-für-die-es-cluster-gibt">Die Ausfälle, für die es Cluster gibt</h3>
<p>Ein Cluster existiert, um Ausfälle zu überstehen, und ich wollte das so testen, wie ich einen echten testen würde. Ein eigener Test startet eine Control Plane und zwei Nodes und beurteilt sie ausschließlich anhand des Funkkanals. Dafür tritt dem Relay ein passiver Lauscher bei: Er sendet nichts, sondern zeichnet nur jeden Heartbeat und jede Zuweisung auf und prüft ihre Signaturen. Kube selbst fragt der Test fast nichts: Nur das Ergebnis eines Rollouts wird mit dem verglichen, was Kube auf die Festplatte geschrieben hat, und alles andere wird danach beurteilt, was tatsächlich auf dem Funkkanal passiert ist.</p>
<p>Schaltet man einen Node ab, markiert die Control Plane ihn nach fünf Sekunden Funkstille als NotReady und verschiebt zwei Sekunden später seine Pods auf einen anderen Node, sodass das Ganze rund acht Sekunden dauert. Schaltet man die Control Plane ab, betreiben die Nodes weiter ihre letzte Zuweisung, weil niemand ihnen etwas anderes sagt. Bootet sie wieder, kommt der Store von der Festplatte zurück, und keine einzige Zuweisung ändert sich. Fehlt den Nodes das Modul, bleiben die Pods Pending. Und gehen eine ganze Minute lang 30 Prozent der Pakete verloren, bewegt sich kein einziger Pod.</p>
<p>Anfangs lag das Timeout bei drei Sekunden. Auf einem Funkkanal mit 30 Prozent Verlust fielen mehrmals pro Minute drei Heartbeats in Folge aus, und die Control Plane hielt den Node für tot und verschob Pods, die nie irgendwohin verschwunden waren. Mit fünf Sekunden wurden Fehlalarme dutzendfach seltener, und der Preis war eine langsamere Erholung von einem echten Ausfall. Kubernetes geht denselben Handel in einem anderen Maßstab ein: Das Kubelet meldet sich alle zehn Sekunden, und die Control Plane wartet vierzig bis fünfzig.</p>
<p>Am lehrreichsten war der Verlust des Funkkanals. Verstummt das Relay für zwanzig Sekunden, verstummen alle Nodes auf einmal. Eine Control Plane, die einfach ihren Timeouts vertraut, schließt daraus, dass die Nodes gestorben sind, und versucht, jeden Pod zu verschieben, obwohl es nirgendwohin zu verschieben gibt. Und wenn der Funkkanal zurückkommt, erwachen die Nodes einer nach dem anderen: Der erste, der zurück ist, bekommt die Pods aller anderen, der zweite holt sich einen Teil davon zurück und so weiter. In der ersten Version änderten zwanzig Sekunden Ausfall 74 Zuweisungen. Die Nodes arbeiteten die ganze Zeit weiter und bemerkten nichts, während der Cluster sich selbst eine Katastrophe inszenierte.</p>
<p>Kubernetes kennt diese Falle: Werden alle Nodes einer Zone gleichzeitig NotReady, versetzt der Node-Controller die Zone in den Zustand FullDisruption und hört auf, Pods zu evicten, mit der Überlegung, dass alle Nodes im selben Moment weit seltener sterben, als eine Verbindung abreißt. Kube macht dasselbe, wenn alle Nodes NotReady werden oder, bei drei und mehr, mindestens 55 Prozent. Auf Anhieb funktionierte es aber nicht: Es brauchte zwei Details, die erst bei einer fehlgeschlagenen Prüfung ans Licht kamen.</p>
<p>Erstens werden Nodes nicht im selben Moment NotReady; ihre Heartbeats liegen bis zu einer Sekunde auseinander. Der erste verstummte Node verlor also seine Pods, bevor die anderen verstummten und klar wurde, dass es sich um einen Ausfall handelte. Jetzt ziehen die Pods eines Nodes erst um, wenn er zwei Sekunden lang NotReady ist, und bis dahin sind auch alle anderen verstummt. Kubernetes wartet darauf standardmäßig fünf Minuten. Zweitens kommen Nodes auch einzeln zurück, und schon der erste zurückgekehrte holte den Cluster aus diesem Zustand, bevor die anderen sich gemeldet hatten, sodass deren Pods sofort umzogen. Jetzt bekommen die stummen Nodes nach dem Verlassen des Zustands noch ein weiteres Timeout, um sich zu melden, wie es auch Kubernetes macht, das die Timer der Nodes zurücksetzt, wenn eine Zone FullDisruption verlässt. Mit diesen beiden Korrekturen ändern zwanzig Sekunden Ausfall keine einzige Zuweisung.</p>
<h3 id="fremde-auf-dem-funkkanal">Fremde auf dem Funkkanal</h3>
<p>Einmal landeten in der Sandbox zwei Cluster auf demselben Funkkanal, und beide hatten einen Node gleichen Namens. Ein Node des einen Clusters startete und stoppte ständig seine Pods, weil er abwechselnd den Zuweisungen beider Control Planes gehorchte. Also kam an den Anfang jeder Nachricht ein Cluster-Tag, ein aus dem Namen des Clusters berechnetes Byte, und ein Node begann, Nachrichten mit fremdem Tag zu ignorieren.</p>
<p>Doch ein Tag beweist nichts; senden kann es jeder, also kam als Nächstes eine Signatur. Jede Nachricht trägt einen Authentifizierungscode, einen MAC, berechnet aus der Nachricht selbst und dem geheimen Schlüssel des Clusters, und ohne den Schlüssel lässt sich der richtige Code nicht erraten. Berechnet wird er mit HalfSipHash-2-4, einer reduzierten Variante von SipHash, die mit 32-Bit-Wörtern arbeitet und ein 32-Bit-Ergebnis liefert. HMAC-SHA256 kommt hier nicht in Frage: Wirths Prozessor ist 32-bittig und läuft mit 25 MHz, und von den 24 Bytes der Nachricht darf die Signatur höchstens vier belegen. HalfSipHash wurde genau für solche kleinen Geräte entwickelt und umfasst in Oberon rund dreißig Zeilen. Zweiunddreißig Bit sind für ernsthafte Kryptografie etwas knapp, aber für einen Lehr-Cluster ein ehrlicher Kompromiss.</p>
<p>Eine Signatur verhindert nicht, dass eine aufgezeichnete echte Nachricht erneut eingespielt wird, deshalb trägt jede Nachricht auch einen 16-Bit-Zähler, und der Empfänger verwirft alles, was nicht neuer ist als die letzte vom selben Absender angenommene Nachricht. Auch das prüft der Ausfalltest. Direkt nach einer echten Zuweisung schickt er dem Node im Namen eines Fremden „nichts betreiben“, und zwar auf drei Arten: mit dem Tag eines anderen Clusters, mit dem falschen Schlüssel signiert und als früher aufgezeichnete echte Zuweisung. Der Node ignoriert alle drei. Derselben Nachricht, ehrlich mit dem Schlüssel und einem frischen Zähler signiert, gehorcht er, und das ist der Kontrollfall, ohne den die Prüfung nichts beweisen würde.</p>
<h3 id="was-es-aushält">Was es aushält</h3>
<p>Ein eigener Lasttest startet eine Control Plane und zwei bis acht Nodes mit drei Pods pro Node und misst anhand des Funkkanals, wie schnell der Cluster konvergiert und wie schnell er sich vom Verlust eines Nodes erholt. Bei jeder Größe konvergiert er in rund drei Sekunden, und der Verlust eines Nodes kostet rund acht: fünf Sekunden Timeout, zwei Sekunden Pause vor der Eviction und bis zu einer Sekunde bis zur nächsten Zuweisung. Ein falsches NotReady gab es nie.</p>
<p>Eine Obergrenze hat der Cluster dennoch, und sie liegt nicht im Funk selbst, sondern in Wirths Treiber. Vor jedem Senden wartet <code>SCC</code> 50 Millisekunden, damit die Bestätigung eines anderen zu Ende gehen kann, und die Maschine tut währenddessen nichts anderes. Eine Station kann also höchstens zwanzig Nachrichten pro Sekunde senden. Die Control Plane braucht jede Sekunde eine Zuweisung pro Node, mit acht Nodes verbringt sie also fast die Hälfte ihrer Zeit mit Warten, während sich empfangene Frames im Puffer mit drei Plätzen stauen und die überzähligen verloren gehen. Während eines Rollouts kommen zu den Zuweisungen noch Specs hinzu, eine pro Tick, und das Warten nimmt fast die gesamte Zeit ein. Nach meiner Rechnung trägt das Protokoll im Leerlauf rund zwanzig Nodes und während eines Rollouts rund zehn. Das ist eine Rechnung anhand des Codes, keine Messung. Außerdem belegt jede Oberon-Maschine einen ganzen Kern des Hosts, weil ihre Schleife nie untätig ist, und acht Nodes auf einer Maschine belasten eher diese Maschine als den Funkkanal.</p>
<h3 id="zwei-bugs-in-unserem-qemu">Zwei Bugs in unserem QEMU</h3>
<p>Damit all das funktioniert, mussten zwei Bugs behoben werden, nicht in Kube, sondern in unserem Maschinenmodell für QEMU, und ohne den Cluster hätte ich keinen davon gefunden. Die Operation <code>MOD</code> nach einer Multiplikation lieferte manchmal die falsche Hälfte des Produkts, sodass die Prüfsumme des Stores immer null ergab. Der Hintergrund-Task sah darin keine Änderungen, und der Store wurde kein einziges Mal geschrieben. Und eine Maschine, die einmal ihr Relay verloren hatte, hörte den Funkkanal für immer nicht mehr, weil der UDP-Kanal von QEMU nach einem fehlgeschlagenen Lesen stillschweigend seinen Leser fallen ließ. Beide Funde sind im Repository beschrieben, und sie sind ein gutes Beispiel dafür, warum ich es so mag, echte Programme auf einem Emulator laufen zu lassen: Das Booten des Systems hat keinen der beiden Bugs ausgelöst.</p>
<h3 id="befehle-beim-start-und-oberonkube">Befehle beim Start und OberonKube</h3>
<p>Der letzte Schritt diente dem Komfort, aber ohne ihn hätte alles andere seinen Sinn verloren. Niemand startet einen Cluster ein zweites Mal, wenn auf jeder Maschine Befehle über VNC eingetippt werden müssen. Jede Maschine sollte beim Start wissen, wer sie ist, so wie eine Cloud-VM ihre Rolle aus cloud-init erfährt.</p>
<p>QEMU nimmt jetzt eine Zeichenkette mit Befehlen entgegen, die die Maschine beim Start ausführen soll, und speist sie in die serielle Schnittstelle ein, als wären sie an einer Konsole getippt worden. Ein kleines Modul, <code>Boot</code>, liest die Zeichenkette und führt die Befehle nacheinander aus, jeden mit seinen Parametern. Aufgerufen wird es ganz am Ende des Rumpfs von <code>System</code>, dem Modul, das beim Systemstart geladen wird. <code>System</code> selbst wird aus den Quellen des Images mit genau dieser einen zusätzlichen Zeile neu gebaut, sodass seine Schnittstelle und der Schlüssel, den jedes andere Modul prüft, gleich geblieben sind.</p>
<p>Hier hat mir der Cluster noch eine Lektion erteilt. Die Befehle beim Start laufen bei jedem Booten, nicht nur beim ersten. Steht <code>Kube.Apply web 4 Ticker</code> darunter, kehrt das Deployment nach einem Neustart der Control Plane zu dem zurück, was die Befehle sagen, und ein inzwischen von Hand durchgeführter Rollout wird stillschweigend rückgängig gemacht. Ob das gut oder schlecht ist, hängt davon ab, was man als Source of Truth betrachtet. In der Cloud ist es das Bestellformular, und dorthin zurückzukehren ist dort genau das richtige Verhalten. Im Browser-Lab dagegen, wo ein Mensch eine neue Version von Hand ausrollt, war es ein Bug, und gefunden hat ihn übrigens das Lab selbst, nicht die QEMU-Tests. Für solche Fälle gibt es jetzt das Kommando <code>Kube.Ensure</code>, das ein Deployment nur anlegt, wenn es noch keines gibt.</p>
<p>In Cozystack kam all das in einer einzigen Katalog-Anwendung zusammen, <code>OberonKube</code>. Ein Benutzer gibt an, wie viele Nodes er braucht, den Cluster-Schlüssel und eine Liste von Deployments, und der Katalog legt den Funkkanal, die Control-Plane-Maschine und die Nodes an und gibt jeder Maschine die Befehle für ihre Rolle. Der Cluster bildet sich von selbst. Das Formular ist hier die Source of Truth: Eine geänderte Liste von Deployments greift beim nächsten Neustart der Control Plane. Die Maschinen eines Funkkanals versuchen außerdem, auf verschiedenen Hosts zu landen, damit der Verlust eines Hosts so wenige Nodes wie möglich kostet.</p>
<h2 id="was-oberon-erzwungen-hat">Was Oberon erzwungen hat</h2>
<p>Wenn man Kubernetes in Go für Linux schreibt, kann fast jede Entscheidung in jede Richtung fallen. Braucht man eine Queue, sind Channels zur Hand; braucht man eine Datenbank, gibt es etcd; braucht man ein Netzwerk, gibt es gRPC über TCP; braucht man Isolation, gibt es Kernel-Namespaces. Es gibt immer eine Wahl, und deshalb fallen Entscheidungen oft aus Gewohnheit. Bei Oberon gibt es fast nichts zu wählen, und das ist der interessanteste Teil: Jede Grenze der Sprache und des Systems hat eine ganz bestimmte Entscheidung erzwungen, und diese Entscheidungen zeigen deutlich, welche Eigenschaften von Kubernetes aus seiner Idee selbst folgen und welche aus dem, worauf es gebaut wurde.</p>
<p>Ich teile die Grenzen in solche, die von der Sprache kamen, und solche, die vom Betriebssystem und der Maschine kamen, obwohl die Grenze dazwischen bei Wirth eine Konvention ist: Alles stammt aus einer Hand.</p>
<h3 id="was-die-sprache-erzwungen-hat">Was die Sprache erzwungen hat</h3>
<p><strong>Größen sind vorab bekannt.</strong> In Oberon-07 ist die Größe eines Arrays fast immer zur Compile-Zeit bekannt, und dynamischer Speicher wird nur für Records angelegt, die über Pointer erreicht werden. Ein Programm, in dem alles nach Bedarf wächst, ist in einer solchen Sprache umständlich zu schreiben, und ich habe es gar nicht erst versucht. Kubes Store ist ein Array aus 256 Objekten, ein Node hat höchstens zehn Pods, ein Node-Name höchstens sechs Zeichen, ein Image-Name höchstens fünfzehn, eine Pod-ID belegt ein Byte. Jede dieser Zahlen hat einen Grund, und alle stehen in zwei Konstantenblöcken am Anfang der Module <code>Kube</code> und <code>KubeNet</code>. Dadurch allokiert Kube in seiner Arbeitsschleife keinen Speicher, kann ihn bei einer Flut von Objekten nicht erschöpfen und verhält sich an seinen Grenzen vorhersehbar: Ein überzähliger Pod wird schlicht nicht angelegt. Auch das echte Kubernetes lebt mit Grenzen, etwa standardmäßig 110 Pods pro Node oder anderthalb Megabyte pro Objekt in etcd, aber dort sind sie über die Dokumentation verstreut, während sie sich hier nicht verstecken lassen.</p>
<p><strong>Ganzzahlen sind 32-bittig, und nur Bytes sind vorzeichenlos.</strong> HalfSipHash arbeitet mit genau 32-Bit-Wörtern und erzeugt eine 32-Bit-Signatur, die in den Frame passt. Daher auch die Zählerarithmetik modulo 65.536 mit einer sorgfältigen Prüfung „ist diese Zahl neuer“, die auch nach einem Überlauf korrekt bleibt. Daher auch die Prüfsumme des Stores, die so berechnet wird, dass sie nicht vom Vorzeichen abhängt. Eine Kleinigkeit, aber genau dort ist der Bug mit <code>MOD</code> in unserem QEMU aufgetaucht.</p>
<p><strong>Kommandos ohne Parameter.</strong> Eine exportierte Prozedur ohne Parameter gilt als Kommando, eine mit Parametern nicht. Das Kubelet kann also nicht <code>Start(pod)</code> aufrufen: Es legt die ID des Pods im Modul <code>Pods</code> ab und ruft <code>Start</code> ohne Argumente auf. In jeder anderen Sprache gälte das als schlechter Stil, aber hier gibt es keinen anderen Weg, und es ist sicher, weil immer nur ein Kommando läuft.</p>
<p><strong>Module mit Schlüsseln.</strong> Jedes kompilierte Modul trägt den Schlüssel seiner Schnittstelle, und beim Laden prüft das System ihn gegen das, womit die importierenden Module kompiliert wurden. Das Image eines Pods ist in Kube also nicht nur ein Name, sondern ein Name mit eingebauter Kompatibilitätsprüfung. Wurde ein Workload-Modul gegen eine alte Version von <code>Pods</code> kompiliert, weigert sich das System, es zu laden, und der Pod bleibt Pending, statt mitten in der Arbeit abzustürzen. In der Container-Welt kommt dem ein gepinnter Image-Digest am nächsten, aber der garantiert nur, dass man genau diese Bytes bekommen hat, keineswegs, dass sie zu ihrer Umgebung passen.</p>
<p><strong>Die Sprache ist klein.</strong> Das klingt nach einem Nachteil, diszipliniert in der Praxis aber mehr als alles andere. Oberon hat keine generischen Collections, keine Exceptions, keine Interfaces, keine Goroutinen und keine Reflection, also ist ganz Kube als schlichte Schleifen über Arrays geschrieben und als Prozeduren, die einen Wahrheitswert zurückgeben, statt etwas zu werfen. Es liest sich fast wie Pseudocode, und genau so wollte ich es haben.</p>
<h3 id="was-das-system-und-die-maschine-erzwungen-haben">Was das System und die Maschine erzwungen haben</h3>
<p><strong>Eine Schleife und kooperative Tasks.</strong> Das ist die wichtigste Grenze. Oberon hat keine Threads, also laufen Kubes Controller als Tasks in der zentralen Schleife, und auch das Kubelet auf einem Node ist ein Task. Jeder Task erledigt ein kurzes Stück Arbeit und kehrt zurück, und daraus folgen sofort drei Dinge. Erstens hat Kube keinen einzigen Lock, keinen Mutex und keinen Channel, denn Race Conditions können nicht entstehen: Solange ein Controller läuft, stehen die anderen still. Zweitens ist das Verhalten deterministisch: Bei gleicher Eingabe tun die Controller dasselbe in derselben Reihenfolge, und ein solches System ist weitaus leichter zu debuggen. Drittens, und das ist ein Minus, friert jeder Task, der lange nachdenkt, die ganze Maschine ein, Kubelet und Funk inklusive. Ein Pod, dessen Kommando <code>Start</code> in eine Endlosschleife gerät, legt den gesamten Node lahm.</p>
<p><strong>Kein Speicherschutz.</strong> Alle Module leben in einem Adressraum, und das Einzige, was ein Modul davon abhält, den Speicher eines anderen zu beschädigen, ist eine streng typisierte Sprache mit Prüfung der Array-Grenzen. Für Kube bedeutet das, dass Pods in keiner Weise isoliert sind, weder voneinander noch vom Kubelet. Das ist der gravierendste Unterschied zum echten Kubernetes, und ich komme darauf zurück, wenn es darum geht, was Oberon fehlte.</p>
<p><strong>Die Oberfläche ist Text.</strong> In Oberon ist jede Zeile der Form <code>Module.Command</code> in jedem Fenster ein Kommando. Kube hat deshalb keinen API-Server, kein YAML und kein kubectl. Seine API besteht aus Kommandos wie <code>Kube.Apply web 6 Ticker2</code>, <code>Kube.Get</code> und <code>Kube.DeletePod</code>, die ein Mensch in ein beliebiges Fenster schreibt und mit einem Mittelklick ausführt, das Ergebnis liest er im Systemlog. Dasselbe Prinzip hat die Befehle beim Start möglich gemacht: Die Rolle einer Maschine wird durch eine gewöhnliche Befehlszeile festgelegt, die QEMU in die serielle Schnittstelle einspeist, und das Modul <code>Boot</code> führt sie genau so aus, wie es ein Mensch täte. Ein spezielles Konfigurationsformat war nicht nötig; die Konfiguration einer Maschine wurde zum Text ihrer Befehle.</p>
<p><strong>Ein Dateisystem alter Schule.</strong> Oberon gibt den Platz ersetzter Dateien erst beim nächsten Booten frei. Deshalb wird Kubes Store an Ort und Stelle überschrieben, abwechselnd in zwei Dateien, statt bei jeder Änderung neu angelegt, und das hat ihn zugleich gegen einen Stromausfall mitten im Schreiben geschützt. Eine Lösung, zu der Datenbanken vor Jahrzehnten gekommen sind, ergab sich hier von selbst, aus einer Beschränkung des Dateisystems.</p>
<p><strong>Funk statt Netzwerk.</strong> Das habe ich schon ausführlich behandelt: ein 32-Byte-Frame, Broadcast an alle, keine Kollisionsvermeidung. Daraus folgt ein Protokoll aus Nachrichten mit je einem Frame, vollständiger Zustand statt Bestätigungen, ein Cluster-Tag und eine Signatur in jeder Nachricht. Und daraus folgt auch die unerwartetste Eigenschaft des ganzen Systems, um die es im nächsten Abschnitt geht: Alles, was der Cluster weiß, ist auf dem Funkkanal zu hören.</p>
<p><strong>Fünfundzwanzig Megahertz.</strong> Die Geschwindigkeit der Maschine hat die Perioden bestimmt: Controller laufen alle 50 Millisekunden, das Kubelet alle 100, ein Heartbeat geht einmal pro Sekunde hinaus. Die Control Plane braucht sehr wenig echte Rechenarbeit, und fast ihre gesamte Zeit geht ins Warten. Doch leider ist auch das Warten nicht umsonst: Vor jedem Senden dreht der Funktreiber fünfzig Millisekunden lang eine Schleife, und genau dieses Warten, nicht die Rechenarbeit, begrenzt die Größe des Clusters.</p>
<h3 id="worin-sich-kube-von-echtem-kubernetes-unterscheidet">Worin sich Kube von echtem Kubernetes unterscheidet</h3>
<p>Damit keine Illusionen entstehen, hier ein kurzer Vergleich. Kube verkörpert die Idee von Kubernetes, nicht Kubernetes selbst, und der Unterschied zwischen beiden ist gewaltig.</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Kubernetes</th>
          <th>Kube</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Umfang</td>
          <td>Millionen Zeilen Go</td>
          <td>rund 1.400 Zeilen Oberon, davon rund 800 für die Control Plane</td>
      </tr>
      <tr>
          <td>Store</td>
          <td>etcd, verteilt und per Raft konsistent gehalten</td>
          <td>ein Array aus 256 Objekten im Speicher einer Maschine und zwei Dateien auf ihrer Festplatte</td>
      </tr>
      <tr>
          <td>API</td>
          <td>API-Server, REST, YAML, kubectl, RBAC</td>
          <td>Oberon-Kommandos, die ein Mensch in ein Fenster schreibt</td>
      </tr>
      <tr>
          <td>Objektarten</td>
          <td>Dutzende, plus eigene über CRDs</td>
          <td>vier: Deployment, ReplicaSet, Pod und Node</td>
      </tr>
      <tr>
          <td>Netzwerk zwischen Nodes</td>
          <td>TCP/IP, meist mit separatem Pod-Netzwerk</td>
          <td>Funk-Broadcast, 32-Byte-Frames</td>
      </tr>
      <tr>
          <td>Pod-Image</td>
          <td>ein Container-Image aus einer Registry</td>
          <td>ein Oberon-Modul auf der Festplatte des Nodes</td>
      </tr>
      <tr>
          <td>Pod-Isolation</td>
          <td>Namespaces und cgroups des Linux-Kernels</td>
          <td>keine, alle Pods teilen sich einen Adressraum mit dem Kubelet</td>
      </tr>
      <tr>
          <td>Ressourcen</td>
          <td>Requests und Limits für CPU und Speicher</td>
          <td>nur die Anzahl der Pods pro Node, höchstens zehn</td>
      </tr>
      <tr>
          <td>Scheduler</td>
          <td>Filter, Bewertung, Affinity, Prioritäten</td>
          <td>der am wenigsten ausgelastete Node</td>
      </tr>
      <tr>
          <td>Netzwerk für Anwendungen</td>
          <td>Service, DNS, Ingress</td>
          <td>keines</td>
      </tr>
      <tr>
          <td>Speicher für Anwendungen</td>
          <td>PersistentVolume</td>
          <td>keiner</td>
      </tr>
      <tr>
          <td>Verfügbarkeit der Control Plane</td>
          <td>mehrere Replikas von API-Server und etcd</td>
          <td>eine Maschine; nach einem Neustart wird der Zustand von der Festplatte gelesen</td>
      </tr>
      <tr>
          <td>Bereitschaft</td>
          <td>Readiness- und Liveness-Probes</td>
          <td>ein Pod ist bereit, sobald sein Kommando <code>Start</code> zurückkehrt</td>
      </tr>
      <tr>
          <td>Sicherheit des Protokolls</td>
          <td>TLS mit gegenseitiger Zertifikatsprüfung</td>
          <td>eine 32-Bit-Signatur mit gemeinsamem Schlüssel und einem Zähler gegen Replays</td>
      </tr>
      <tr>
          <td>Skalierung</td>
          <td>Tausende Nodes</td>
          <td>getestet mit bis zu acht Nodes, alle auf einem Funkkanal</td>
      </tr>
  </tbody>
</table>
<p>Diese Tabelle zeigt, dass Kube für nichts taugt, wofür Kubernetes taugt. Sie zeigt aber noch etwas anderes: Die gesamte Logik, für die es Kubernetes gibt, also der Sollzustand, unabhängige Reconcile-Loops, Rollouts ohne Downtime, Erholung vom Verlust eines Nodes und Vorsicht bei einer abgerissenen Verbindung, passt in ein kleines System, das fast nichts von dem hat, was in der mittleren Spalte steht. Alles andere in Kubernetes ist dazu da, dass diese Logik auf Tausenden Maschinen funktioniert, für Tausende Benutzer und für Anwendungen, denen niemand vertraut. Sehr wichtige Dinge, aber nicht das Fundament.</p>
<h2 id="wo-kube-besser-wurde-und-wo-oberon-versagte">Wo Kube besser wurde und wo Oberon versagte</h2>
<p>Einen Spielzeug-Cluster auf Funk mit dem Kubernetes zu vergleichen, auf dem das halbe Internet läuft, wirkt unfair, und ich werde nicht behaupten, Kube sei besser. Mich interessiert etwas anderes: welche Qualitäten in Kube ganz von selbst entstanden sind, ohne jede Mühe, einfach weil es auf Oberon herangewachsen ist. Ich meine die Eigenschaften, die dem gewöhnlichen Kubernetes entweder fehlen oder für die es viel zu viel bezahlt. Ich habe sechs gezählt.</p>
<h3 id="der-ganze-cluster-lässt-sich-an-einem-abend-lesen">Der ganze Cluster lässt sich an einem Abend lesen</h3>
<p>Die Control Plane umfasst rund achthundert Zeilen, das Netzwerkmodul mit Kubelet und Signaturen rund vierhundert, und mit dem Lehr-Workload und dem Modul für die Befehle beim Start kommt man auf rund vierzehnhundert. Darunter liegt nur noch das Oberon-System, das sich ebenfalls vollständig lesen lässt, und Wirths Prozessor in Verilog, für den ein paar Abende genügen. Der ganze Weg von „Ich will sechs Replikas von Ticker2“ bis zum Register des Funkchips, über das eine Zuweisung zu einem Node hinausfliegt, lässt sich also mit bloßem Auge verfolgen, ohne ein einziges Mal auf eine Bibliothek zu stoßen, die nie jemand gelesen hat.</p>
<p>Mit Kubernetes ist das schon lange nicht mehr möglich, und zwar nicht, weil es schlecht geschrieben wäre: Es löst eine riesige Zahl von Problemen, die Kube schlicht nicht hat. Am Ende weiß aber selbst ein erfahrener Engineer, der es seit Jahren betreibt, meist, wie es sich verhält, aber nicht, warum, und erfährt es erst während eines Ausfalls. In Kube steht die Antwort auf jedes „Warum“ in einer einzigen Prozedur.</p>
<h3 id="der-funkkanal-ist-die-observability">Der Funkkanal ist die Observability</h3>
<p>Diese Eigenschaft habe ich nicht geplant; sie ist von selbst entstanden, und sie gefällt mir am besten. Weil jede Nachricht an alle geht und den vollständigen Zustand statt einer Änderung trägt, ist auf dem Funkkanal in jedem Moment alles zu hören, was der Cluster über sich weiß: welche Nodes leben, was auf jedem läuft, was an jeden gebunden ist und welches Image jeder Pod hat. Ein passiver Lauscher, der nichts sendet, rekonstruiert das ganze Bild des Clusters, ohne ihm eine einzige Frage zu stellen.</p>
<p>Alle meine Prüfungen funktionieren so. Weder der Ausfalltest noch der Lasttest noch die Browser-Labs fragen jemals die Control Plane, was los ist. Sie hören den Funkkanal ab und vergleichen, was tatsächlich auf den Nodes lief, mit dem, was ihnen zugewiesen war. Ein Bug in Kube selbst kann eine solche Prüfung nicht täuschen, denn sie schaut nicht auf Kubes Berichte, sondern auf das Verhalten der Nodes. Im gewöhnlichen Kubernetes braucht man dafür Metriken, Logs, Audit, Exporter und ein eigenes System, das all das einsammelt, und trotzdem sieht man nur, was die Komponenten über sich selbst erzählen wollten.</p>
<h3 id="ein-pod-startet-im-handumdrehen">Ein Pod startet im Handumdrehen</h3>
<p>In Kubernetes heißt einen Pod starten: ein Image ziehen, Layer entpacken, Namespaces anlegen und einen Prozess starten, und das dauert Sekunden, bei kaltem Cache und großem Image sogar Minuten. In Kube heißt einen Pod starten: ein Oberon-Modul laden, falls es noch nicht geladen ist, und sein Kommando aufrufen, und ist das Modul bereits im Speicher, reduziert sich der Start eines Pods auf einen Prozeduraufruf. Der ganze Cluster konvergiert in drei Sekunden, und fast diese ganze Zeit geht ins Warten auf den nächsten Heartbeat, nicht in Arbeit.</p>
<p>Diese Geschwindigkeit wurde natürlich mit der Isolation bezahlt, der Vergleich ist also unfair. Aber er zeigt, wohin die Zeit tatsächlich geht. Wenn heute von Kaltstarts, von WebAssembly auf dem Server oder von V8-Isolates die Rede ist, geht es genau um diese Frage: Lässt sich eine Deployment-Einheit so klein und so modulartig machen, dass ihr Start so viel kostet wie ein Funktionsaufruf, ohne auf Isolation zu verzichten?</p>
<h3 id="kompatibilität-wird-beim-laden-geprüft">Kompatibilität wird beim Laden geprüft</h3>
<p>Darüber habe ich im Abschnitt über die Prinzipien schon geschrieben, aber es lohnt sich, es zu wiederholen, denn es ist eine starke Idee. Das Image eines Pods ist in Kube ein Modul mit einem Schnittstellenschlüssel, und das System weigert sich, es zu laden, wenn es gegen eine inkompatible Version dessen kompiliert wurde, was es importiert. Ein Pod mit inkompatiblem Image stürzt nicht nach einer Stunde Arbeit bei einem unerwarteten Aufruf ab: Er startet einfach nicht, bleibt Pending, und das sieht man sofort. In der Container-Welt prüft niemand die Kompatibilität eines Images mit seiner Umgebung außer Ihren Tests, und die Kompatibilität von Images, die einander aufrufen, prüft bestenfalls ein API-Schema, und auch nur, wenn Sie eines haben.</p>
<h3 id="keine-locks-und-daher-keine-race-conditions">Keine Locks und daher keine Race Conditions</h3>
<p>Kubes Code hat keine Mutexe, keine Channels und keine atomaren Operationen. Controller, Kubelet, das Schreiben des Stores auf die Festplatte und der Empfang von Funkpaketen laufen alle als Tasks einer Schleife und werden streng nacheinander ausgeführt. Data Races, Deadlocks und Bugs, die einmal in tausend Durchläufen auftreten, können in Kube also gar nicht entstehen. Das Verhalten ist deterministisch: Führt man dasselbe Szenario zweimal aus, tun die Controller dasselbe in derselben Reihenfolge.</p>
<p>Die Kehrseite kommt etwas weiter unten, aber schon der Gedanke, dass eine Control Plane nicht multithreaded sein muss, scheint mir unterschätzt. Die Control Plane von acht Nodes braucht sehr wenig Rechenarbeit. Die Control Plane von tausend Nodes braucht natürlich mehr, aber auch dort geht der größte Teil der Zeit nicht ins Rechnen, sondern ins Warten auf Netzwerk und Festplatte, und Single-Threaded-Event-Loops haben längst bewiesen, dass sich solches Warten ohne Threads bedienen lässt.</p>
<h3 id="sicherheit-ab-der-ersten-nachricht">Sicherheit ab der ersten Nachricht</h3>
<p>Das frühe Kubernetes ließ standardmäßig vieles offen; das Kubelet etwa akzeptierte lange Zeit anonyme Anfragen, und solche Löcher zu schließen dauerte Jahre. In Kube kamen Signatur und Replay-Schutz, bevor der Cluster überhaupt etwas Nützliches konnte, einfach weil der Funk keine Wahl ließ: Auf dem Funkkanal kann jeder alles sagen, und das ist vom ersten Tag an offensichtlich. Die Signatur ist 32-bittig, was für die reale Welt zu wenig ist, aber architektonisch ist das Protokoll richtig: Jede Nachricht ist authentisch und gehört zu ihrem Cluster, und die Prüfung kostet rund dreißig Zeilen.</p>
<h3 id="der-ganze-cluster-in-einem-browser-tab">Der ganze Cluster in einem Browser-Tab</h3>
<p>Und die letzte, nicht über die Architektur, sondern über das, was aus ihr folgt. Eine Oberon-Maschine ist so klein, dass drei von ihnen samt Funkkanal in einen Browser-Tab passen. Alles, was ich beschreibe, lässt sich also nicht nur lesen, sondern ohne jede Installation nachvollziehen: einen Node abschalten, den Funk stören, eine gefälschte Zuweisung einschleusen. Für Kubernetes gibt es gute Lern-Sandboxes, aber das ist immer jemandes Cluster irgendwo in einer Cloud, während der Cluster hier auf Ihrem Rechner lebt und sich nach Belieben kaputtmachen lässt, ohne jemanden zu stören.</p>
<h3 id="was-oberon-fehlte">Was Oberon fehlte</h3>
<p>Nun dazu, wo Oberon zu eng war und warum solche Systeme höchstwahrscheinlich verloren haben. Für die Forschung ist dieser Teil nicht weniger wichtig.</p>
<p><strong>Isolation.</strong> Das ist der Hauptpunkt. In Oberon leben alle Module in einem Adressraum und vertrauen einander. Ein Pod, der über <code>SYSTEM.PUT</code> Speicher beschädigt, beschädigt damit auch das Kubelet, den Funk und alles andere. Ein Pod, der in eine Endlosschleife gerät, friert den ganzen Node ein, weil ein kooperativer Task, der nicht zurückkehrt, das gesamte System anhält. Solange auf der Maschine Code eines einzigen Autors läuft, der diesem Code vertraut, ist alles gut, und genau so hat Wirth sein System entworfen: für einen Menschen an einem Computer. Ein Cluster existiert aber gerade dazu, fremden Code auszuführen, und ohne Isolation ist das unmöglich. Kubernetes auf Linux bekommt die Isolation vom Kernel, Oberon dagegen bräuchte dafür Speicherschutz im Prozessor, präemptives Multitasking und Ressourcen-Accounting, müsste also ein ganz anderes System werden.</p>
<p><strong>Präemption.</strong> Neben der Isolation kann die Control Plane weder einen Pod unterbrechen, der zu lange rechnet, noch die Prozessorzeit unter den Pods aufteilen. Keine Quotas, keine Prioritäten, keine Limits, nur gute Manieren. Einem Lehr-Workload, der einmal pro Sekunde einen Zähler um eins erhöht, ist das egal, aber jeder echte Workload stolpert sofort darüber.</p>
<p><strong>Ein Netzwerk.</strong> Funk mit 32-Byte-Frames eignet sich hervorragend zur Steuerung, aber für Anwendungsdaten ist darin kein Platz. Kubes Pods haben keine Adressen, keine Services und keine Möglichkeit, miteinander zu sprechen. Über Wirths Funk lassen sich Dateien verschicken, aber das wäre eher ein USB-Stick als ein Netzwerk.</p>
<p><strong>Flexible Größen.</strong> Die Grenzen, die ich für ihre Vorhersehbarkeit gelobt habe, werden zur Obergrenze: zehn Pods pro Node, 256 Objekte im Store, sechs Zeichen pro Name und zwanzig Nachrichten pro Sekunde und Station. Jede dieser Obergrenzen lässt sich anheben, aber nicht beliebig, denn alle folgen aus dem 24-Byte-Frame, statischen Arrays und einem einfachen Treiber. Kubernetes hat dafür, keine solchen Obergrenzen zu haben, mit enormer Komplexität bezahlt, und mit Blick auf Kube versteht man, dass dieser Preis bewusst gezahlt wurde.</p>
<p><strong>Eine hochverfügbare Control Plane.</strong> Kube hat eine einzige Control-Plane-Maschine. Stirbt sie endgültig samt ihrer Festplatte, steht der Cluster ohne Master da. Die Nodes betreiben weiter ihre letzte Zuweisung, was eine gute Eigenschaft ist, aber die Control Plane lässt sich nicht durch eine andere Maschine ersetzen, weil es keinen konsistenten Store über mehrere Maschinen gibt. Raft lässt sich in Oberon schreiben, aber über einen Funk ohne Zustellgarantien und mit 32-Byte-Frames wäre das ein großes Forschungsvorhaben für sich.</p>
<p><strong>Mehrere Benutzer.</strong> Oberon hat einen Benutzer, Kube einen Schlüssel pro Cluster. Keine Namespaces, keine Rollen, keine Rechtetrennung, und wer den Schlüssel kennt, kann alles. Kubernetes verwendet den größten Teil seiner Komplexität genau darauf, dass viele Menschen und Teams sich einen Cluster sicher teilen können, während Kube eine solche Schicht überhaupt nicht hat.</p>
<p>Nimmt man all diese Punkte zusammen, wird klar, dass Oberon nicht verloren hat, weil es schlecht entworfen war, sondern weil es für eine andere Welt entworfen wurde, in der ein Computer einem Menschen gehört, der gesamte Code darauf von diesem Menschen oder von Leuten seines Vertrauens geschrieben ist und ein Netzwerk eine Möglichkeit ist, dem Nachbarn eine Datei zu geben. Sobald Computer geteilt wurden und Code fremd wurde, brauchte man Isolation, Präemption und Rechte, und einfache Systeme mussten komplexen weichen.</p>
<h2 id="sechs-labs-in-ihrem-browser">Sechs Labs in Ihrem Browser</h2>
<p>Anfangs bezweifelte ich, dass sich der Cluster überhaupt im Browser betreiben lässt. Die Oberon-Maschine aus den Labs des vorigen Artikels lief bereits in einem Tab: Es ist Wirths tatsächliche Schaltung, nach C++ übersetzt und zu WebAssembly kompiliert. Aber sie hatte keinen Funk, und ein Cluster braucht drei Maschinen, die einander hören. Also bekam die Browser-Maschine dasselbe Modell des nRF24L01+-Transceivers wie die QEMU-Maschine und lernte, die von ihr gesendeten Frames nach außen zu geben und die Frames anderer Maschinen entgegenzunehmen. Jede Maschine läuft in einem eigenen Hintergrund-Thread, und die Seite nimmt ihre Frames und reicht sie an die anderen weiter, die Seite selbst ist also der Funkkanal. Sie kann außerdem einen vorgegebenen Anteil der Frames verlieren, eine einzelne Maschine vom Funkkanal trennen und Kubes Nachrichten samt Prüfung ihrer Signaturen lesen, weshalb rechts eine aus dem Funkverkehr aufgebaute Cluster-Tabelle erscheint.</p>
<p>Auch eine serielle Schnittstelle war nötig, damit die Maschinen ihre Rollen beim Einschalten erfahren, wie in der Cloud. Die Control Plane erhält die Befehle <code>Kube.Start</code>, <code>KubeNet.Serve kube 00c0ffee00c0ffee</code> und <code>Kube.Ensure web 4 Ticker</code>, die Nodes <code>KubeNet.Join</code> mit ihren Namen, sodass nichts eingetippt werden muss. <code>Kube.Ensure</code> steht dort nicht zufällig, aber dazu mehr im sechsten Lab.</p>
<p>Die Geschwindigkeit wurde zu einer eigenen Aufgabe. In WebAssembly führt Wirths Schaltung weniger als eine Million Instruktionen pro Sekunde und Maschine aus, also dutzendfach langsamer als das 25-MHz-Board. Kube zählt die Zeit dagegen in Maschinensekunden: ein Heartbeat pro Sekunde, ein Timeout von fünf. Hätte ich die Uhren der Maschinen ehrlich gehen lassen, bräuchte der Cluster mehrere Minuten, um sich zu bilden, und das Lab mit einem abgeschalteten Node dauerte rund fünf Minuten. Deshalb lässt die Seite die Uhren der Maschinen zehnmal schneller laufen als ihre Instruktionen, und die Maschinen glauben, sie liefen mit 2,5 MHz. Ihre Sekunden vergehen in einem Tempo, dem das Auge folgen kann, und dem Protokoll ist es egal: Es hat keine Ahnung, wie viele Instruktionen in eine Sekunde passen.</p>
<p>Hintergrund-Tabs hielten eine weitere unerwartete Falle bereit: Der Browser bremst Timer dort stark aus, und der Cluster fror fast ein. Deshalb drehen die Maschinen jetzt ihre eigene Schleife und hängen nicht von den Timern der Seite ab. Die letzte Falle war die Eingabe. Die Seite tippt einen Befehl mit Tasten und Mausklicks in eine Maschine, und anfangs tat sie das in einem Rutsch. Das sind rund elf Millionen Instruktionen, mit der schnellen Uhr also über vier Sekunden Maschinenzeit, in denen die Maschine den Funkkanal nicht hört. Nach jedem Tastendruck erklärte die Control Plane beide Nodes für NotReady, und gerettet hat sie nur, dass Evictions in FullDisruption ausgesetzt werden. Jetzt geht die Eingabe in kleinen Portionen hinein, abwechselnd mit der Arbeit der Maschine, und dazwischen wird der Funkverkehr zugestellt.</p>
<p>Jedes Lab prüft sich selbst und zeigt einen Haken, wenn das Beschriebene tatsächlich auf dem Funkkanal passiert ist. Einen Knopf zu drücken und einen Haken zu bekommen, funktioniert nicht: Die Prüfung schaut auf Heartbeats und Zuweisungen, nicht darauf, was Sie getan haben.</p>
<p><a href="https://tym83.github.io/paleocomputing/oberon/kube.html">Lab öffnen</a></p>
<figure><img src="en-kube-lab.gif" alt="Alle sechs Labs hintereinander, achtfach beschleunigt" width="860" height="538" loading="lazy" decoding="async">
  <figcaption><p>Alle sechs Labs hintereinander, achtfach beschleunigt. Der Cluster bildet sich, neuer Code wird ausgerollt, ein Node wird abgeschaltet, der Funk wird gestört, ein Eindringling versucht es auf vier Arten, die Control Plane wird neu gestartet</p></figcaption>
</figure>

<h3 id="1-der-cluster-bildet-sich-von-selbst">1. Der Cluster bildet sich von selbst</h3>
<p>Nichts zu tun außer warten. Die Maschinen booten, und auf dem Bildschirm der Control Plane sieht man, wie das Modul <code>Boot</code> die Befehle ausführt, die über die serielle Schnittstelle gekommen sind. Kube installiert drei Controller, beginnt den Funkkanal abzuhören und legt das Deployment <code>web</code> mit vier Pods an, und ein paar Sekunden später erscheinen im Log die Zeilen „node node1 Ready“ und „node node2 Ready“.</p>
<figure><img src="en-screen-plane.png" alt="Der Bildschirm der Control Plane" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Der Bildschirm der Control Plane. Alles im Log unterhalb der Versionszeile des Systems haben die Befehle beim Start erledigt; niemand hat eine einzige Taste gedrückt</p></figcaption>
</figure>

<p>Unterdessen zeigen die Nodes, wie das Kubelet seine Zuweisung empfängt und die Pods des Moduls Ticker startet.</p>
<figure><img src="en-screen-node1.png" alt="Der Bildschirm von node1" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Der Bildschirm von node1. Das Kubelet ist dem Funkkanal beigetreten, hat eine Zuweisung mit zwei Pods empfangen, das Modul Ticker geladen und für jeden Pod dessen Start aufgerufen. Die letzten Zeilen sind die Ausgabe von Ticker.Show: wie viele Sekunden jeder Pod schon lebt</p></figcaption>
</figure>

<p>Rechts auf der Seite füllt sich die Cluster-Tabelle. Für jeden Node zeigt sie, wann er zuletzt gehört wurde, welche Pods er nach eigener Aussage betreibt und welche an ihn gebunden sind. Unterscheiden sich diese beiden Spalten, ist der Cluster noch nicht konvergiert, oder etwas ist schiefgegangen.</p>
<figure><img src="en-panel-cluster.png" alt="Die aus dem Funkverkehr aufgebaute Cluster-Tabelle" width="840" height="336" loading="lazy" decoding="async">
  <figcaption><p>Die aus dem Funkverkehr aufgebaute Cluster-Tabelle. Die Seite fragt Kube nichts; sie hört nur Heartbeats und Zuweisungen mit</p></figcaption>
</figure>

<h3 id="2-neuen-code-ausrollen">2. Neuen Code ausrollen</h3>
<p>Drücken Sie den Knopf <strong>web 4 Ticker2</strong>. Die Seite tippt <code>Kube.Apply web 4 Ticker2 ~</code> auf der Control Plane und führt es mit einem Mittelklick aus, wie es ein Mensch täte. Kube legt ein neues ReplicaSet an und beginnt, Pods einen nach dem anderen umzuziehen. Die Prüfung lässt den Rollout gelten, wenn jeder Pod das neue Image betreibt, und nur dann, wenn die Zahl der Pods während der ganzen Zeit nie unter vier fiel und nie über fünf stieg. Gezählt wird anhand der Heartbeats, also anhand dessen, was die Nodes tatsächlich betrieben haben.</p>
<figure><img src="en-panel-air-rollout.png" alt="Der Funkkanal während des Rollouts" width="840" height="682" loading="lazy" decoding="async">
  <figcaption><p>Der Funkkanal während des Rollouts. Die Control Plane sendet die Specs neuer Pods mit dem Image Ticker2, und die Nodes melden in ihren Heartbeats, dass sie sie gestartet haben</p></figcaption>
</figure>

<p>Ist der Rollout abgeschlossen, drücken Sie auf einem Node <strong>Ticker2.Show</strong>, und er zeigt die neue Version beim Zählen. Die ganze Geschichte steht im Log des Nodes: Die Pods von Ticker v1 wurden gestoppt, die von Ticker v2 gestartet, und die neuen Pods haben andere IDs als die alten.</p>
<figure><img src="en-screen-node2-ticker2.png" alt="Der Bildschirm eines Nodes nach dem Rollout" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Der Bildschirm eines Nodes nach dem Rollout. Jeder alte Pod hat Stop bekommen, jeder neue Start, und Ticker2.Show listet die neuen Pods auf</p></figcaption>
</figure>

<h3 id="3-ein-node-stirbt">3. Ein Node stirbt</h3>
<p>Drücken Sie <strong>Power off</strong> über dem Bildschirm eines Nodes, der Pods betreibt. Sein Bildschirm wird dunkel, seine Heartbeats verstummen, und nach fünf Maschinensekunden markiert die Control Plane den Node als NotReady und verschiebt zwei Sekunden später seine Pods auf den verbliebenen. Schalten Sie den Node wieder ein, bootet er, tritt dem Funkkanal bei und wird Ready, aber seine Pods gibt ihm niemand zurück: Wie der echte Scheduler verschiebt Kube laufende Pods nicht auf einen Node, der später hinzugekommen ist. Neue Pods aus einem Hochskalieren landen dagegen auf ihm, als dem am wenigsten ausgelasteten Node.</p>
<figure><img src="en-06-moved.png" alt="Der Node ist aus" width="1440" height="900" loading="lazy" decoding="async">
  <figcaption><p>Der Node ist aus. In der Tabelle ist er rot und schon eine Weile nicht mehr gehört worden, und alle Pods laufen bereits auf dem zweiten Node</p></figcaption>
</figure>

<h3 id="4-der-funkkanal-stirbt">4. Der Funkkanal stirbt</h3>
<p>Drücken Sie <strong>Switch the air off</strong> und warten Sie eine halbe Minute. Alle Nodes werden gleichzeitig NotReady, aber Kube schließt daraus, dass die Verbindung abgerissen ist und nicht die Nodes ausgefallen sind, und verschiebt nichts. Schalten Sie den Funkkanal wieder ein, und ein paar Sekunden später laufen dieselben Pods auf denselben Nodes. Das Lab gilt nur als bestanden, wenn sich während des Ausfalls und danach keine einzige Zuweisung geändert hat.</p>
<figure><img src="en-07-air-off.png" alt="Der Funkkanal ist aus" width="1440" height="900" loading="lazy" decoding="async">
  <figcaption><p>Der Funkkanal ist aus. Beide Nodes sind NotReady, aber die Zuweisungen sind unverändert: Kube hat verstanden, dass die Verbindung abgerissen ist</p></figcaption>
</figure>

<p>Am interessantesten ist es hier, unter dem Lab „what is going on“ aufzuklappen und von den 74 Neuzuweisungen zu lesen, die die erste Version in zwanzig Sekunden Ausfall vorgenommen hat. Und wenn Sie mögen, schalten Sie den Funkkanal für ein paar Sekunden ab, kürzer als das Timeout, und sehen Sie, dass überhaupt nichts passiert.</p>
<h3 id="5-ein-eindringling">5. Ein Eindringling</h3>
<p>Der Abschnitt „An intruder on the air“ hat vier Knöpfe. Jeder schickt im Namen eines Fremden die Zuweisung „nichts betreiben“ an den Node, der Pods betreibt, und zwar direkt nach einer echten Zuweisung der Control Plane, damit die Fälschung das Letzte ist, was der Node gehört hat. Der erste Knopf versieht sie mit dem Tag eines anderen Clusters, der zweite signiert sie mit dem falschen Schlüssel, der dritte spielt eine früher aufgezeichnete echte Zuweisung erneut ein. Der Node ignoriert alle drei und betreibt seine Pods weiter.</p>
<p>Der vierte Knopf signiert die Fälschung mit dem echten Cluster-Schlüssel und einem frischen Zähler. Das ist der Kontrollfall, und der Node gehorcht und stoppt seine Pods. Ohne ihn würde das Lab nichts beweisen: Vielleicht hört der Node ja einfach auf niemanden außer der Control Plane? Eine Sekunde später sendet die Control Plane ihre nächste Zuweisung, und die Pods kommen zurück, weil das Protokoll den vollständigen Zustand trägt und keine Befehle.</p>
<figure><img src="en-panel-intruder.png" alt="Das Eindringlings-Panel nach dem vierten Versuch" width="840" height="470" loading="lazy" decoding="async">
  <figcaption><p>Das Eindringlings-Panel nach dem vierten Versuch: Der Node hat der mit dem Schlüssel signierten Zuweisung gehorcht. Die drei Fälschungen davor hat er ignoriert, und jedes Mal hat die Seite das genau hier angezeigt</p></figcaption>
</figure>

<p>Die Fälschungen sind übrigens auch im Funk-Log zu sehen: Die Seite prüft die Signaturen selbst und markiert Nachrichten mit fremdem Tag oder ungültiger Signatur.</p>
<h3 id="6-die-control-plane-startet-neu">6. Die Control Plane startet neu</h3>
<p>Schalten Sie die Control Plane ab und ein paar Sekunden später wieder ein. Sie bootet, führt ihre Befehle erneut aus, liest ihren Store von der Festplatte, und kein einziger Pod bewegt sich. Die Nodes haben die ganze Zeit ihre letzte Zuweisung betrieben, und die zurückgekehrte Control Plane hat ihnen ein Timeout Zeit gegeben, sich zu melden, und das haben sie alle getan.</p>
<p>Genau dieses Lab hat den letzten Bug vor der Veröffentlichung gefunden. In den Befehlen beim Start stand zuerst <code>Kube.Apply web 4 Ticker</code>, und nach einem Neustart kehrte das Deployment zu Ticker zurück und machte den Rollout aus dem zweiten Lab rückgängig. Die QEMU-Tests haben das nicht bemerkt, weil sie die Control Plane vor jedem Rollout neu gestartet haben. Hier, wo ein Mensch eine neue Version von Hand ausrollt, ist es richtig, das Getane zu bewahren, deshalb steht in den Befehlen jetzt <code>Kube.Ensure</code>, das ein Deployment nur anlegt, wenn es noch keines gibt. In der Cloud ist dagegen das Bestellformular die Source of Truth, und dort ist <code>Kube.Apply</code> geblieben.</p>
<figure><img src="en-11-labs-done.png" alt="Alle sechs Labs erledigt" width="420" height="1075" loading="lazy" decoding="async">
  <figcaption><p>Alle sechs Labs erledigt</p></figcaption>
</figure>

<h3 id="was-sie-sonst-noch-ausprobieren-können">Was Sie sonst noch ausprobieren können</h3>
<p>Die Seite kann mehr als die Labs. Mit dem Verlust-Schieberegler können Sie den Funkkanal verschlechtern, etwa 30 Prozent der Frames verlieren lassen, und sehen, dass die Pods sich nirgendwohin bewegen. Treiben Sie die Verluste deutlich höher, fallen früher oder später fünf Heartbeats in Folge aus, und Kube hält einen lebenden Node für tot; das ist der Preis eines Timeouts. <strong>Cut off the air</strong> isoliert eine Maschine, ohne sie abzuschalten, und Sie können zusehen, wie der abgeschnittene Node seine Pods weiter betreibt, obwohl die Control Plane sie bereits anderen übergeben hat. Das ist genau der Fall eines Pods, der an zwei Orten läuft, und Kubernetes lebt damit auf genau dieselbe Weise. Im Befehlsfeld können Sie jedes Oberon-Kommando eingeben, zum Beispiel <code>Kube.Apply api 2 Ticker ~</code>, um ein zweites Deployment anzulegen, oder Sie klicken direkt in den Bildschirm einer Maschine und arbeiten darin von Hand. Die mittlere Maustaste ist dort ein Klick mit Alt.</p>
<h2 id="so-probieren-sie-es-selbst-aus">So probieren Sie es selbst aus</h2>
<p>Es gibt vier Wege, vom ganz einfachen, bei dem nichts installiert werden muss, bis zur eigenen Cloud. Alles Folgende ist offen: Der Quellcode liegt im Repository <a href="https://github.com/tym83/paleocomputing">tym83/paleocomputing</a>, Kubes Code im Ordner <code>impl/kube</code>, eine ausführliche Beschreibung mit Messungen in <code>impl/kube/README.md</code>.</p>
<h3 id="im-browser">Im Browser</h3>
<p>Öffnen Sie das <a href="https://tym83.github.io/paleocomputing/oberon/kube.html">Cluster-Lab</a> und warten Sie eine halbe Minute. Installieren müssen Sie nichts: Alles läuft im Tab, der Server liefert nur Dateien aus. Am wohlsten fühlt sich die Seite in einem aktuellen Chrome oder Firefox auf einem Rechner mit mehreren Kernen, denn jede der drei Maschinen belegt einen eigenen Kern. Lassen Sie den Tab im Vordergrund: Im Hintergrund bremst der Browser ihn aus, und der Cluster bleibt zwar nicht stehen, lebt aber spürbar langsamer.</p>
<p>Um dieselbe Seite lokal zu betreiben, klonen Sie das Repository, starten im Ordner <code>impl/web</code> einen beliebigen statischen Server, zum Beispiel <code>python3 -m http.server 8765</code>, und öffnen <code>http://127.0.0.1:8765/kube.html</code>. Und wenn Sie gar keinen Browser brauchen, läuft derselbe Cluster aus drei Maschinen in Node.js mit <code>node impl/web/kube-test.mjs</code>. Er bootet drei Maschinen auf Wirths tatsächlicher Schaltung, wartet, bis sich der Cluster gebildet hat, und prüft anhand des Funkkanals, dass alle Pods laufen und alle Signaturen gültig sind. Die Uhren der Maschinen gehen hier ehrlich, deshalb dauert es rund eine Minute.</p>
<h3 id="in-qemu-auf-ihrem-rechner">In QEMU auf Ihrem Rechner</h3>
<p>Sie brauchen Docker, git und make. Bauen Sie zuerst unser Maschinenmodell für QEMU. Der Build läuft in einem Container, sodass die Abhängigkeiten von QEMU Ihrem System fernbleiben, dauert aber rund zehn Minuten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git clone https://github.com/tym83/paleocomputing
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> paleocomputing
</span></span><span class="line"><span class="cl">make -C qemu build
</span></span></code></pre></div><p>Die Systemplatte, auf der Kube, KubeNet, der Lehr-Workload und das Modul für die Befehle beim Start bereits kompiliert liegen, nehmen Sie am einfachsten aus dem veröffentlichten Image. Jede Maschine braucht ihre eigene Kopie der Platte, vergrößert auf acht Megabyte, damit das System Platz hat, seinen Store zu schreiben:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">docker create --name payload ghcr.io/tym83/paleocomputing/oberon-run:v0.1.21
</span></span><span class="line"><span class="cl">docker cp payload:/opt/oberon/payload/prom.bin .
</span></span><span class="line"><span class="cl">docker cp payload:/opt/oberon/payload/oberon.dsk .
</span></span><span class="line"><span class="cl">docker rm payload
</span></span><span class="line"><span class="cl"><span class="k">for</span> m in plane node1 node2<span class="p">;</span> <span class="k">do</span> cp oberon.dsk <span class="nv">$m</span>.dsk<span class="p">;</span> truncate -s 8M <span class="nv">$m</span>.dsk<span class="p">;</span> <span class="k">done</span>
</span></span></code></pre></div><p>Als Nächstes brauchen Sie den Funkkanal, also ein Docker-Netzwerk mit einem Relay darin:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">docker network create kube-air
</span></span><span class="line"><span class="cl">docker run -d --name relay --network kube-air -v <span class="s2">&#34;</span><span class="nv">$PWD</span><span class="s2">/qemu/radio:/r&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  qemu-build:risc5 <span class="s1">&#39;python3 -u /r/relay.py&#39;</span>
</span></span></code></pre></div><p>Und schließlich drei Maschinen, jede mit ihren Befehlen beim Start. Die Zeichenkette nach <code>commands=</code> ist genau das, was die Maschine nach dem Booten ausführt, die Befehle durch Semikolons getrennt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">run<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  docker run -d --name <span class="nv">$1</span> --network kube-air -p 127.0.0.1:<span class="nv">$2</span>:5900 <span class="se">\
</span></span></span><span class="line"><span class="cl">    -v <span class="s2">&#34;</span><span class="nv">$PWD</span><span class="s2">/.qemu-work:/src:ro&#34;</span> -v <span class="s2">&#34;</span><span class="nv">$PWD</span><span class="s2">:/w&#34;</span> -w /w qemu-build:risc5 <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="s2">&#34;/src/build/qemu-system-risc5 -machine &#39;oberon,radio=air,commands=</span><span class="nv">$3</span><span class="s2">&#39; \
</span></span></span><span class="line"><span class="cl"><span class="s2">     -bios prom.bin -drive if=none,id=sd0,file=</span><span class="nv">$1</span><span class="s2">.dsk,format=raw -vnc :0 \
</span></span></span><span class="line"><span class="cl"><span class="s2">     -chardev udp,id=air,host=relay,port=7524,localaddr=0.0.0.0,localport=7524&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="nv">KEY</span><span class="o">=</span>00c0ffee00c0ffee
</span></span><span class="line"><span class="cl">run plane <span class="m">5900</span> <span class="s2">&#34;Kube.Start;KubeNet.Serve kube </span><span class="nv">$KEY</span><span class="s2">;Kube.Apply web 4 Ticker&#34;</span>
</span></span><span class="line"><span class="cl">run node1 <span class="m">5901</span> <span class="s2">&#34;KubeNet.Join node1 kube </span><span class="nv">$KEY</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">run node2 <span class="m">5902</span> <span class="s2">&#34;KubeNet.Join node2 kube </span><span class="nv">$KEY</span><span class="s2">&#34;</span>
</span></span></code></pre></div><p>Hier steht <code>Kube.Apply</code> und nicht <code>Kube.Ensure</code> wie im Browser-Lab: Release v0.1.21 kennt <code>Kube.Ensure</code> noch nicht. Der Unterschied zeigt sich nur, wenn Sie eine neue Version von Hand ausrollen und die Control Plane neu starten: Mit <code>Kube.Apply</code> kehrt das Deployment zu dem zurück, was die Befehle sagen.</p>
<p>Die Bildschirme der Maschinen liegen auf den VNC-Ports 5900, 5901 und 5902. Das Booten in Software-Emulation dauert bis zu einer Minute, danach zeigt das Log der Control Plane Zeilen über bereite Nodes und die Logs der Nodes Zeilen über gestartete Pods. Die Maus von Oberon hat drei Tasten, und die mittlere führt das Kommando aus, auf das sie zeigt. <code>Kube.Get</code> in einem beliebigen Fenster der Control Plane zeigt also alle Objekte, und <code>Ticker.Show</code> auf einem Node zeigt seine Pods. Um eine neue Version auszurollen, schreiben Sie <code>Kube.Apply web 4 Ticker2 ~</code> auf der Control Plane und klicken mit der mittleren Taste auf diese Zeile.</p>
<figure><img src="qemu-plane.png" alt="Die Control Plane in QEMU nach einem Neustart" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Die Control Plane in QEMU nach einem Neustart. Der Store ist von der Festplatte zurückgekommen, und <code>Kube.Get</code> zeigt dieselben Pods auf demselben Node. Die Aufnahme stammt von einer automatisierten Prüfung, deren Befehle beim Start <code>Kube.Ensure</code> enthalten, weshalb das Log zeigt, dass es das bestehende Deployment in Ruhe gelassen hat</p></figcaption>
</figure>

<figure><img src="qemu-node-b.png" alt="Node node-b in QEMU" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Node node-b in QEMU. Er ist als Erster beigetreten und hat alle vier Pods bekommen: Wie der echte Scheduler verschiebt Kube laufende Pods nicht auf einen Node, der später hinzugekommen ist</p></figcaption>
</figure>

<p>Den Funkkanal können Sie von der Seite abhören, so wie es die Tests tun. Der Lauscher tritt dem Relay als weitere Maschine bei, sendet nichts und gibt mit <code>--json</code> jeden Heartbeat und jede Zuweisung aus, samt der Angabe, ob die Signatur gültig ist:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">docker run --rm -it --network kube-air -v <span class="s2">&#34;</span><span class="nv">$PWD</span><span class="s2">/qemu/radio:/r&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  qemu-build:risc5 <span class="s1">&#39;python3 -u /r/listen.py relay --json --key 00c0ffee00c0ffee&#39;</span>
</span></span></code></pre></div><p>Und dann können Sie Dinge kaputtmachen. <code>docker stop node2</code> schaltet einen Node ab, <code>docker stop relay</code> legt den Funkkanal lahm, und <code>docker start</code> bringt beides zurück. Bekommt das Relay nach einem Neustart eine andere Adresse, finden die Maschinen es selbst: Nach einem fehlgeschlagenen Senden löst unser Modell die Adresse erneut über den Namen auf. Im selben Ordner liegt <code>inject.py</code>, das den Eindringling spielen kann.</p>
<p>Die Prüfungen im Repository starten den Cluster genau auf diese Weise, nur automatisch. Nachdem Sie QEMU und die Werkzeuge mit <code>make -C impl tools</code> gebaut haben, können Sie sie selbst ausführen: <code>python3 qemu/test/kube_dr_check.py</code> prüft alle oben besprochenen Ausfälle (ihre Tabelle steht in <code>impl/kube/README.md</code>), <code>python3 qemu/test/kube_boot_check.py</code> prüft, dass sich der Cluster allein aus den Befehlen beim Start bildet, und <code>python3 qemu/test/kube_load_check.py --nodes 4</code> misst die Last. Diese Prüfungen bauen die Platte aus den Quellen, haben also bereits <code>Kube.Ensure</code>. Bedenken Sie, dass jede Oberon-Maschine einen ganzen Kern belegt, weil ihre Schleife nie untätig ist, und acht Nodes auf einem Laptop eher den Laptop messen als den Cluster.</p>
<p>Wenn Sie fertig sind, entfernen Sie die Container mit <code>docker rm -f plane node1 node2 relay</code> und das Netzwerk mit <code>docker network rm kube-air</code>.</p>
<h3 id="in-ihrem-eigenen-kubevirt">In Ihrem eigenen KubeVirt</h3>
<p>Eine Oberon-Maschine läuft auch in einfachem KubeVirt, ohne Cozystack. Sie braucht dafür unser virt-launcher-Image, das die Architektur RISC5 kennt, und die eingeschaltete Fähigkeit von KubeVirt, Hooks an virtuelle Maschinen anzuhängen. Wie das geht, beschreibt ausführlich der <a href="https://github.com/tym83/paleocomputing/blob/main/kubevirt/GUIDE.md">Guide</a>, der auch eine Beispiel-VirtualMachine enthält. Ein Cluster braucht drei solcher Maschinen, ein Relay als gewöhnlichen Pod mit einem UDP-Service und die Befehle beim Start in der Annotation der Maschine, die der Hook an QEMU weiterreicht. Genau das erledigt der Cozystack-Katalog für Sie, ohne Cozystack ist es daher am einfachsten, sich anzusehen, was seine Charts im Ordner <code>marketplace</code> anlegen.</p>
<h3 id="in-cozystack">In Cozystack</h3>
<p>Wenn Sie Cozystack haben, binden Sie unseren Katalog einmalig mit <code>cozypkg</code> ein:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cozypkg tap oci://ghcr.io/tym83/paleocomputing/machines:v0.1.21
</span></span><span class="line"><span class="cl">cozypkg add paleocomputing.machines
</span></span></code></pre></div><p>Der Cluster-Administrator muss dafür zwei Dinge tun: das Feature Gate Sidecar in KubeVirt einschalten und unser virt-launcher-Image für Ihre KubeVirt-Version installieren. Die Details stehen auf der <a href="https://tym83.github.io/paleocomputing/cozystack/">Projektseite</a>.</p>
<p>Danach sehen Benutzer im Dashboard einen Abschnitt Paleocomputing, darin unter anderem OberonVM, OberonAir und OberonKube. Ein Kube-Cluster wird mit einem Formular oder einer Ressource bestellt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps.cozystack.io/v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">OberonKube</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">farm</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">nodes</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">00c0ffee00c0ffee</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">deployments</span><span class="p">:</span><span class="w"> </span><span class="l">web 4 Ticker; api 2 Ticker2</span><span class="w">
</span></span></span></code></pre></div><p>Aus dieser Bestellung legt der Katalog einen Funkkanal, eine Control-Plane-Maschine und drei Nodes an, und der Cluster bildet sich von selbst. Den Bildschirm jeder Maschine öffnen Sie mit <code>virtctl vnc</code> unter den eigenen Rechten des Tenants, und die Namen der Maschinen stehen im Dashboard. Source of Truth ist hier das Formular: Seine Deployments werden bei jedem Start der Control Plane angewendet, ein geändertes Formular greift also nach einem Neustart, und eine über VNC vorgenommene Änderung hält nur bis dahin. Wird die Bestellung gelöscht, werden auch alle ihre Bestandteile gelöscht.</p>
<p>Sie können einen Cluster auch von Hand aus einzelnen Maschinen bauen. Legen Sie dann einen <code>OberonAir</code> an und tragen Sie in jeder <code>OberonVM</code> diesen Funkkanal im Feld <code>air</code> ein, die Rolle in <code>kubeRole</code> (<code>plane</code> für die Control Plane und <code>node</code> für die Nodes), den Node-Namen in <code>kubeNode</code> und denselben Schlüssel in <code>kubeKey</code>. Die Deployments der Control Plane gehören ins Feld <code>commands</code>, und der Cluster-Name, falls er nicht <code>kube</code> sein soll, in <code>kubeCluster</code>. Das macht mehr Spaß, wenn Sie zum Beispiel zwei Cluster mit unterschiedlichen Schlüsseln auf einen Funkkanal setzen und zusehen wollen, wie sie einander nicht in die Quere kommen.</p>
<h2 id="was-all-das-über-die-infrastruktur-von-morgen-sagt">Was all das über die Infrastruktur von morgen sagt</h2>
<p>Am Anfang habe ich erwähnt, dass dies auch Forschung ist und nicht nur ein Scherz, also will ich versuchen, in Worte zu fassen, was mich der Cluster auf Wirths Funk gelehrt hat. Nicht in dem Sinne, dass alle Kubernetes in Oberon neu schreiben sollten, sondern in dem Sinne, welche Ideen es wert sind, aus diesem kleinen System in ein großes mitgenommen zu werden.</p>
<p><strong>Zustand statt Ereignisse.</strong> Innerhalb seiner Control Plane arbeitet Kubernetes schon lange nach dem level-triggered Prinzip, aber zwischen den Komponenten gibt es nach wie vor Events, Watches, Änderungsströme und langlebige Verbindungen. Kube ist weiter gegangen, schlicht weil der Funk ihm keine Wahl ließ: Jede Nachricht trägt den vollständigen Zustand, und das Protokoll braucht keine Bestätigungen, keine Wiederholungen und keine Wiederherstellung nach einer abgebrochenen Verbindung. Ich glaube, dieser Ansatz ist weit breiter anwendbar, als gemeinhin angenommen wird. Überall dort, wo sich der Zustand knapp genug beschreiben lässt und das Netzwerk unzuverlässig ist, ob Edge-Netze, Satellitenverbindungen, Industrienetze oder Cluster aus Tausenden kleiner Geräte, erweist sich ein Protokoll, in dem jede Nachricht für sich steht, als zugleich einfacher und zuverlässiger.</p>
<p><strong>Observability als Eigenschaft des Protokolls.</strong> Weil auf dem Funkkanal alles zu hören ist, was der Cluster über sich weiß, musste ich keine Observability bauen. In einem großen System kann man natürlich nicht alles an alle senden, aber schon der Gedanke, dass man die Nachrichten zwischen den Komponenten beobachten sollte und nicht die Berichte der Komponenten über sich selbst, scheint mir interessant. Eine Prüfung, die auf das Verhalten der Nodes schaut und nicht darauf, was die Control Plane über sie denkt, fängt die eigenen Bugs der Control Plane ein, und so wurden fast alle Bugs von Kube gefunden.</p>
<p><strong>Eine Deployment-Einheit in Modulgröße.</strong> Ein Oberon-Modul mit Schnittstellenschlüssel kommt dem sehr nahe, wohin sich WebAssembly gerade mit seinem Komponentenmodell bewegt: ein kleines Stück Code mit explizit beschriebener Schnittstelle, das sich schnell laden und vor der Ausführung auf Kompatibilität prüfen lässt. Oberon fehlte die Isolation, und WebAssembly liefert sie ohne separaten Prozess oder Kernel. Bringt man beides zusammen, erhält man einen Pod, der startet wie ein Funktionsaufruf, isoliert ist wie ein Container und dessen Kompatibilität beim Laden geprüft wird, wie in Oberon. Ich halte es für gut möglich, dass die Infrastruktur von morgen auf solchen Prinzipien aufgebaut wird.</p>
<p><strong>Grenzen, die im Code stehen.</strong> Alle Obergrenzen von Kube stehen in zwei Konstantenblöcken, und jede hat einen Grund. Auch Kubernetes hat Grenzen, aber sie sind über Flags, Dokumentation und Betriebserfahrung verstreut, und von vielen erfährt man erst, wenn man an sie stößt. Ich wünschte mir, große Systeme würden ihre Grenzen und deren Gründe ehrlicher deklarieren, statt so zu tun, als gäbe es keine.</p>
<p><strong>Einfachheit, die in einen Kopf passt.</strong> Kube lässt sich an einem Abend lesen, und das ist keine Zierde, sondern eine Arbeitseigenschaft: Wenn etwas schiefging, fand ich die Ursache, indem ich eine Prozedur las, nicht indem ich Issues in einem Tracker durchging. So wird Kubernetes nie wieder sein, aber neue Systeme lassen sich so entwerfen, dass ihr Kern, der Teil, der für die Hauptidee zuständig ist, überschaubar bleibt und alles andere in Schichten darum herum gebaut wird, die man nicht lesen muss.</p>
<p><strong>Sicherheit schon in der ersten Version.</strong> Der Funk hat erzwungen, Nachrichten von Anfang an zu signieren, und das hat rund dreißig Zeilen gekostet. Systeme, die mit einem vertrauenswürdigen Netzwerk begannen und Schutz später nachrüsteten, haben dafür mehr bezahlt. Die Lehre ist banal, aber Oberon illustriert sie gut: Ist die Umgebung vom ersten Tag an feindlich, entsteht die richtige Architektur von selbst.</p>
<p>Und gesondert dazu, was man nicht tun sollte. Kube zeigt deutlich, dass Isolation, Präemption und Rechtetrennung keine überflüssige Komplexität sind, die man um der Einfachheit willen über Bord werfen sollte, sondern das, ohne das ein geteilter Computer nicht möglich ist. Genau hier hat Oberon verloren, und jedes System, das zugleich einfach und geteilt sein will, wird einen Weg finden müssen, Isolation zu bekommen, ohne die Überschaubarkeit zu verlieren. Mir scheint, dass es heute zum ersten Mal passende Bausteine dafür gibt, von WebAssembly bis zu kleinen verifizierbaren Kerneln, und die einzige Frage ist, ob jemand daraus ein System bauen will, das sich wieder vollständig lesen lässt.</p>
<h2 id="statt-eines-fazits">Statt eines Fazits</h2>
<p>Ich wollte prüfen, ob die Idee von Kubernetes in eine Maschine passt, die von Anfang bis Ende von einem einzigen Menschen entworfen wurde. Sie passt, samt Rollouts, Disaster Recovery, einem signierten Protokoll und einem Store auf der Festplatte, in rund vierzehnhundert Zeilen einer Sprache aus den späten Achtzigern. Unterwegs stellte sich heraus, dass die Grenzen der Maschine nicht nur im Weg standen, sondern auch Lösungen nahelegten, und manche davon erwiesen sich als besser als die, an die wir gewöhnt sind. Klar wurde auch, wo genau solche Systeme an ihre Decke stoßen, und das ist vielleicht der wertvollste Teil, weil es erklärt, warum die Welt einen anderen Weg eingeschlagen hat.</p>
<p>Als Nächstes stehen auf der Liste eine Bereitschaftsprüfung, die der Workload selbst beantwortet, damit ein Rollout wartet, bis neuer Code wirklich bereit und nicht bloß gestartet ist, und eine Möglichkeit, Deployments von außerhalb der Control Plane ohne VNC anzuwenden. Und vielleicht Isolation, zumindest teilweise, um zu sehen, wie viel Einfachheit sie kosten würde.</p>
<p>Das Projekt ist offen. Der Quellcode liegt im <a href="https://github.com/tym83/paleocomputing">Repository</a>; unser Code steht unter der Lizenz Apache-2.0, das QEMU-Maschinenmodell wie QEMU selbst unter der GPL. Das Cluster-Lab finden Sie unter <a href="https://tym83.github.io/paleocomputing/oberon/kube.html">tym83.github.io/paleocomputing/oberon/kube.html</a>, die übrigen Labs der Serie und die Seite zum Cozystack-Katalog auf der <a href="https://tym83.github.io/paleocomputing/">Projektseite</a>. Über Cozystack selbst können Sie auf <a href="https://cozystack.io/">cozystack.io</a> lesen. Ich freue mich, wenn jemand im Lab den Funkkanal nicht für eine halbe Minute, sondern auf eine raffiniertere Weise abschaltet und herausfindet, wo Kube bricht. Solche Funde gab es in dieser Geschichte schon viele, und jeder hat etwas gelehrt.</p>
<p>Im nächsten Teil der Paleocomputing-Serie bauen wir anhand der Spezifikationen und der Ausschreibungsunterlagen Adas Rivalen nach: die Programmiersprachen, die am Wettbewerb des US-Verteidigungsministeriums teilnahmen, ihn aber nicht gewannen.</p>
]]></content:encoded></item><item><title>Paleocomputing, Teil 1: Wirths Prozessor, Project Oberon, eine neue Architektur in QEMU und KubeVirt und der Betrieb in Cozystack und K8s</title><link>https://aenix.io/de/blog/2026/09/paleocomputing-teil-1-wirth-oberon-qemu-kubevirt/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/09/paleocomputing-teil-1-wirth-oberon-qemu-kubevirt/</guid><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><dc:creator>Timur Tukaev</dc:creator><category>Cozystack</category><category>KubeVirt</category><category>Kubernetes</category><category>Open Source</category><category>CHERI</category><category>Retrocomputing</category><description>Niklaus Wirths RISC5-Prozessor im Browser, in QEMU und in Kubernetes und eine ehrliche Messung, was Bounds-Checking auf einem offenen System wirklich kostet.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/paleocomputing-teil-1-wirth-oberon-qemu-kubevirt.jpg" alt=""></p><p>Am 1. Januar 2024 starb Niklaus Wirth – der Mann, der uns Pascal, Modula-2 und Oberon geschenkt hat, den Turing Award bekam und sein ganzes Leben lang einen hartnäckigen Krieg gegen aufgeblähte Software führte. Weniger bekannt ist, dass er sich, schon weit über siebzig, hinsetzte und einen eigenen Prozessor entwarf: klein und einfach, damit er Studierenden einen ganzen Computer auf einmal zeigen konnte, von den Logikgattern bis zu den Fenstern auf dem Bildschirm.</p>
<p>Im September 2026 habe ich diesen Prozessor genommen und versucht, ihn überall zum Laufen zu bringen, wo ich nur hinkam. Zuerst direkt in einem Browser-Tab – und zwar nicht als Emulator, sondern als genau die Schaltung, die Wirth gezeichnet hat. Dann in QEMU, als ganz gewöhnliche virtuelle Maschine. Dann in Kubernetes, wo normalerweise eine ganz andere Sorte VM zu Hause ist, nämlich die, auf der Ubuntu und Datenbanken laufen. Und schließlich in Cozystack, unserer Cloud-Plattform, wo sich Wirths Maschine jetzt mit einem einzigen Klick aus dem Katalog installieren lässt, so wie man PostgreSQL installiert. Nebenbei habe ich endlich etwas gemessen, worüber Programmierer seit Jahrzehnten streiten: was die Prüfung von Array-Grenzen tatsächlich kostet. Ich habe außerdem ein kleines Sprachmodell auf Wirths Prozessor laufen lassen. Und, wenn wir schon ehrlich sind: Mit einer unbedachten Bewegung habe ich sämtliche virtuellen Maschinen in einem produktiven Cluster auf Migration geschickt (verletzt wurde niemand, aber es waren ein paar unangenehme Sekunden).</p>
<p>Daraus ist ein sehr langer Artikel geworden, weil in neun Tagen sehr viel passiert ist und ein guter Teil davon meine eigenen Fehler waren, die ich anschließend finden und beheben musste. Ich habe versucht, so zu schreiben, dass auch jemand folgen kann, der noch nie von Oberon gehört hat, und alles, was nur Spezialisten interessiert, unter Spoilern versteckt. Sie können den Text am Stück lesen oder direkt zu dem Teil springen, der Sie interessiert. Zuerst kommt die Geschichte von Oberon selbst, dann, wie mein ursprünglicher Plan zerfiel, dann der Prozessor und die Bounds-Prüfung, dann der Browser und die Laborübungen, dann QEMU, Kubernetes und Cozystack und ganz am Ende das Sprachmodell und wie Sie das alles selbst installieren.</p>
<p>Der gesamte Quellcode, die Notizen und Anleitungen liegen im Repository <a href="https://github.com/tym83/paleocomputing">github.com/tym83/paleocomputing</a>, die Projektseite ist <a href="https://tym83.github.io/paleocomputing/">tym83.github.io/paleocomputing</a>. Wer lieber erst selbst Hand anlegt und danach liest, öffnet das <a href="https://tym83.github.io/paleocomputing/oberon/lab.html">Labor</a>: Es muss nichts installiert werden, die Maschine bootet direkt im Browser.</p>
<figure><img src="oberon-boot-screen.png" alt="Oberon, gebootet auf Wirths echter Schaltung" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Oberon auf Wirths echter Schaltung. Ich habe dieses Bild fünfhundert Mal gesehen, und fast jedes Mal stimmte es bis auf den letzten Punkt mit der Referenz überein.</p></figcaption>
</figure>

<h2 id="was-oberon-ist">Was Oberon ist</h2>
<p>Oberon ist zugleich eine Programmiersprache und ein Betriebssystem, entstanden Mitte der 1980er-Jahre an der ETH Zürich, entwickelt von Niklaus Wirth und Jürg Gutknecht. Sie begannen im Herbst 1985, und 1988 lief das System tatsächlich. Nach Wirths eigener Darstellung haben es zwei Leute in den Stunden geschrieben, die neben ihrer eigentlichen Arbeit übrig blieben – was, das müssen Sie zugeben, ziemlich verrückt klingt, wenn man bedenkt, wie viele Menschen heute nötig sind, um irgendein Betriebssystem zu schreiben. Es lief auf der Workstation Ceres, die ebenfalls an der ETH gebaut wurde, und bis etwa Anfang der 2000er-Jahre wurde darauf unterrichtet.</p>
<p>Der Name stammt übrigens von Voyager. Im Januar 1986 schickte die Sonde Bilder von Uranus und seinen Monden zur Erde, und Wirth – der Voyager für ein vorbildliches Ingenieurprojekt hielt, ein Gerät, das weit über seine geplante Lebensdauer hinaus funktionierte – benannte das System nach dem Mond Oberon. Im Buch nennt er Oberon den größten Uranusmond, tatsächlich ist aber Titania größer; auch Wirth hat Tippfehler. Und als Zugabe ist Oberon auch der König der Elfen, was als Namenspate ebenfalls nicht schlecht ist.</p>
<p>Die Leitidee des ganzen Unterfangens steht im Vorwort zum Buch des Projekts: Ein von Grund auf neu gebautes System sollte etwas sein, das man vollständig beschreiben, erklären und verstehen kann – ein einzelner Mensch sollte das Ganze lesen und verstehen können, vom Prozessor bis zur Fensteroberfläche. Nach heutigen Maßstäben klingt das fast wie Fantasy, denn niemand auf der Welt versteht ein modernes Betriebssystem samt Compiler und Prozessor vollständig.</p>
<p>2013 veröffentlichte Wirth eine Neuausgabe des Projekts und zog die Idee darin konsequent bis zum Ende durch. Der Prozessor, auf dem Ceres lief, wurde längst nicht mehr hergestellt, und Wirth entschied: Wenn alles andere im System von ihm stammt und verständlich ist, soll auch der Prozessor von ihm sein. Er entwarf einen einfachen RISC-Prozessor – in den Quellen heißt er RISC5 – und beschrieb ihn in Verilog, der Sprache, mit der man digitale Schaltungen beschreibt. Eine solche Schaltung lässt sich auf ein FPGA flashen, einen programmierbaren Chip, und heraus kommt ein echter, funktionierender Computer. Wirths Exemplar lief auf einem preiswerten Board mit einem Megabyte Speicher bei 25 MHz. Das ist ungefähr hundertmal langsamer als ein einzelner Kern Ihres Smartphones, für Oberon aber mehr als genug, denn der Compiler übersetzt sich, wie Wirth schreibt, in etwa drei Sekunden selbst. Das Buch und die Quellen von System, Compiler und Prozessor sind offen zugänglich, und genau das macht Oberon einzigartig. Noch ein Detail, das für uns wichtig wird: Das System selbst stammt aus den späten 1980er-Jahren, der Prozessor, auf dem wir es betreiben werden, entstand dagegen erst in den 2010er-Jahren.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Was Oberon so ungewöhnlich macht, falls Sie es noch nie gesehen haben</span>
  </summary>
  <div class="spoiler__body">
    <p><strong>Jeder Text kann ein Befehl sein.</strong> Eine Kommandozeile im üblichen Sinn gibt es in Oberon nicht. Steht irgendwo auf dem Bildschirm, in irgendeinem Fenster, etwas der Form <code>Module.Procedure</code>, dann ist das bereits ein Befehl. Sie zeigen mit der Maus darauf, drücken die mittlere Taste, und er wird ausgeführt. Menüs gibt es auch, aber ein Menü ist hier einfach eine Textzeile in der Titelleiste eines Fensters, in der Befehle aufgezählt sind. Sie wollen ein eigenes Menü? Schreiben Sie die gewünschten Befehle in eine Textdatei und öffnen Sie sie. Diese Idee hat später den Editor Acme in Plan 9 stark beeinflusst, und Rob Pike hat das auch selbst gesagt.</p>
<p><strong>Sie brauchen eine Drei-Tasten-Maus.</strong> Die linke Taste setzt den Cursor, die mittlere führt aus, die rechte markiert – und dazu gibt es Akkorde, bei denen man eine Taste gedrückt hält und, ohne sie loszulassen, eine zweite drückt. Auf einem Laptop ohne mittlere Taste ersetzen wir sie durch Klicks mit Modifikatortasten; mehr dazu weiter unten.</p>
<p><strong>Es gibt immer genau ein Programm.</strong> Das gewohnte Multitasking fehlt. Darunter dreht sich eine einzige Schleife, die Tastatur und Maus abfragt und Befehle einen nach dem anderen aufruft, und solange ein Befehl nicht fertig ist, passiert nichts anderes. Wirth räumt selbst ein, dass das sehr einschränkend klingt, und erklärt ausführlich, warum es für einen Menschen an einem Computer genügt.</p>
<p><strong>Keine Header-Dateien und keine Dependency-Hölle.</strong> Jedes Modul beschreibt seine eigene Schnittstelle, und diese Beschreibung trägt so etwas wie eine Prüfsumme. Ändert sich die Schnittstelle, weigert sich das System schlicht, Module zu starten, die gegen die alte Version gebaut wurden – dass ein Programm gegen eine veraltete Bibliothek gebaut wurde und irgendwo unergründlich abstürzt, ist hier also grundsätzlich unmöglich. Und das im Jahr 1988.</p>
<p><strong>Es gibt keinen Speicherschutz; die Sprache übernimmt seine Rolle.</strong> Der Prozessor hat keinen Mechanismus, der ein Programm daran hindern würde, in den Speicher eines anderen zu greifen. Die gesamte Sicherheit beruht darauf, dass die Sprache streng typisiert ist und ihren Müll selbst einsammelt und dass der Compiler jeden Array-Zugriff prüft. Genau das werden wir in den Laborübungen kaputt machen.</p>
<p><strong>Die Sprache ist klein.</strong> Der vollständige Report zu Oberon-07 umfasst 17 Seiten, und sein Motto ist Einsteins Satz, man solle alles so einfach wie möglich machen, aber nicht einfacher.</p>

  </div>
</details>

<p>Warum sich 2026 mit einem Museumsstück beschäftigen? Ich habe drei Gründe. Der erste: wie tief Oberon das geprägt hat, was wir heute benutzen. Go – die Sprache, in der die halbe heutige Cloud-Infrastruktur geschrieben ist, Kubernetes eingeschlossen – nennt Oberon ausdrücklich als einen seiner Vorfahren; das steht direkt in der <a href="https://go.dev/doc/faq">Go FAQ</a>. Und Robert Griesemer, einer der drei Autoren von Go, hat bei Wirth an der ETH promoviert und zeichnet in seinem Vortrag <a href="https://www.youtube.com/watch?v=0ReKdcpNyQg">&ldquo;The Evolution of Go&rdquo;</a> einen Stammbaum, in dem eine gerade Linie von Oberon zu Go führt. Der zweite Grund: Oberon passt wirklich in einen Kopf. Wer verstehen will, wie ein Computer vom Gatter bis zum Fenster funktioniert, für den kenne ich kein besseres Lehrmittel. Und der dritte Grund: 1995 schrieb Wirth <a href="https://people.inf.ethz.ch/wirth/Articles/LeanSoftware.pdf">&ldquo;A Plea for Lean Software&rdquo;</a>, ein Manifest gegen aufgeblähte Software – die Quelle des Wirthschen Gesetzes, wonach Software schneller langsamer wird, als Hardware schneller wird, wobei Wirth die Beobachtung redlicherweise seinem Kollegen Martin Reiser zuschrieb –, und Oberon war sein Beweis, dass es auch anders geht. Dreißig Jahre später ist es, vorsichtig gesagt, nur schlimmer geworden.</p>
<p>Und Oberon lebt erfreulicherweise noch. Es gibt aktive Forks, die erst vor wenigen Tagen aktualisiert wurden, und eine russischsprachige Community, OberonCore, die das alles lebhaft diskutiert.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Was man über Oberon lesen und ansehen sollte (das Beste, was ich gefunden habe)</span>
  </summary>
  <div class="spoiler__body">
    <ol>
<li><a href="https://people.inf.ethz.ch/wirth/ProjectOberon/index.html">Project Oberon, Ausgabe 2013</a> – die Primärquelle: das Buch über System, Compiler und Prozessor mit sämtlichen Quellen.</li>
<li><a href="https://www.projectoberon.net/">projectoberon.net</a> – die Seite von Paul Reed, der bequemste Einstieg: Mirrors, Archive, ein fertiges Disk-Image.</li>
<li><a href="https://people.inf.ethz.ch/wirth/Oberon/Oberon07.Report.pdf">The Programming Language Oberon (Oberon-07)</a> – die ganze Sprache auf 17 Seiten, Lektüre für einen Abend.</li>
<li><a href="https://people.inf.ethz.ch/wirth/Articles/Modula-Oberon-June.pdf">Wirth, &ldquo;Modula-2 and Oberon&rdquo;</a> – die Geschichte aus erster Hand: was Wirth von Xerox PARC übernommen und was er bewusst verworfen hat. Mein Lieblingssatz daraus: &ldquo;We were inspired by what could be done, and shown how not to do it.&rdquo;</li>
<li><a href="https://people.inf.ethz.ch/wirth/Articles/LeanSoftware.pdf">Wirth, &ldquo;A Plea for Lean Software&rdquo;</a> – das Manifest von 1995 selbst.</li>
<li><a href="https://people.inf.ethz.ch/wirth/CompilerConstruction/CompilerConstruction1.pdf">Wirth, &ldquo;Compiler Construction&rdquo;</a> – ein kurzes, sehr gut lesbares Lehrbuch über Compiler, aufgebaut um ein abgespecktes Oberon für denselben Prozessor.</li>
<li><a href="https://people.inf.ethz.ch/wirth/FPGA-relatedWork/RISC-Arch.pdf">The RISC Architecture</a> – der Prozessor, beschrieben auf wenigen Seiten.</li>
<li><a href="https://www.youtube.com/watch?v=5niGplCza7s">Video: Wirth führt Oberon auf Ceres vor, 2011</a>.</li>
<li><a href="https://inf.ethz.ch/news-and-events/spotlights/infk-news-channel/2021/11/niklaus-wirth-video-interview.html">Video-Interview der ETH mit Wirth, 2021</a> – der Link öffnet den ersten von drei Teilen.</li>
<li><a href="https://www.youtube.com/watch?v=0ReKdcpNyQg">Griesemer, &ldquo;The Evolution of Go&rdquo;</a> und die <a href="https://go.dev/talks/2015/gophercon-goevolution.slide">Folien</a> – die Brücke von Oberon zu Go.</li>
<li>Emulatoren: <a href="https://github.com/pdewacht/oberon-risc-emu">oberon-risc-emu</a> von Peter De Wachter, <a href="https://schierlm.github.io/OberonEmulator/">OberonEmulator</a> von Michael Schierl (läuft im Browser), <a href="https://github.com/pdewacht/project-norebo">Norebo</a> – ein Oberon-Compiler, den man von einer gewöhnlichen Kommandozeile aus starten kann und ohne den es die Hälfte dieses Artikels nicht gäbe – sowie <a href="https://github.com/andreaspirklbauer/Oberon-extended">Extended Oberon</a> von Andreas Pirklbauer.</li>
<li>Auf Russisch: die <a href="https://oberoncore.ru/library/start">OberonCore-Bibliothek</a> mit Übersetzungen von Wirth, das <a href="https://forum.oberoncore.ru/">Forum</a>, <a href="https://www.inr.ac.ru/~info21/">Informatika-21</a> und das Buch <em>Project Oberon: The Design of an Operating System and Compiler</em>, 2012 bei DMK Press erschienen. Dem Jahr nach zu urteilen ist das eine Übersetzung der Ausgabe vor 2013 – also der ohne Wirths Prozessor –, selbst nachgeprüft habe ich das allerdings nicht; korrigieren Sie mich, falls ich falschliege.</li>
</ol>

  </div>
</details>

<h2 id="woher-die-ganze-idee-kam">Woher die ganze Idee kam</h2>
<p>Ich führte schon lange eine Liste vergessener Systeme. Betriebssysteme, Sprachen und ganze Maschinen, die einmal funktionierten, manchmal sehr gut, und dann verschwanden – oft samt Ideen, die seither niemand richtig nachgebaut hat. Die Burroughs B5000, die schon 1961 Datentypen direkt in der Hardware prüfte. KeyKOS, für das ein aus der Wand gerissenes Stromkabel ein normales Ereignis war und keine Katastrophe. Transputer, Lilith, der iAPX 432. Über alle wurden Artikel und Bücher geschrieben, aber fast niemand betreibt sie tatsächlich, und genau das wollte ich – sie wirklich laufen lassen, mit allen Innereien, und sehen, was sie können.</p>
<p>So entstand die Reihe, die ich Paleocomputing genannt habe. Die Idee dahinter ist einfach. Viele dieser Systeme haben nicht verloren, weil sie schlecht waren, sondern weil sie teuer waren. Eigenes Silizium für eine eigene Sprache kostete Unsummen, während gewöhnliche Intel-Prozessoren schneller billiger wurden, als irgendjemand etwas Kluges bauen konnte. Heute sieht die Wirtschaftlichkeit anders aus. Programmierbare Chips kosten Centbeträge, die offene Architektur RISC-V erlaubt offiziell, dem Prozessor eigene Instruktionen hinzuzufügen, und das Projekt CHERI – dazu unten noch viel mehr – bringt im Grunde genau den Hardware-Speicherschutz in moderne Prozessoren zurück, den Burroughs schon vor meiner Geburt beherrschte. Das heißt, die alten Ideen lassen sich wieder von Hand ausprobieren, und genau das habe ich mir vorgenommen.</p>
<p>Für die erste Folge habe ich Oberon gewählt, obwohl ich eigentlich lieber Burroughs gemacht hätte. Der Grund ist simpel: Bei Oberon ist absolut alles vorhanden, was man zum Arbeiten braucht. Die Quellen des Prozessors, der Compiler, das Betriebssystem, das Buch, das alles erklärt, lebendige Emulatoren und fertige Disk-Images. Man kann sofort in die volle Tiefe eintauchen, statt einen Monat lang Dokumentation auszugraben – und für den Start einer Reihe brauchte ich genau diese Größenordnung.</p>
<h2 id="wie-es-gemacht-wurde">Wie es gemacht wurde</h2>
<p>Ich gebe gleich vorweg zu, dass der Großteil des Codes in diesem Projekt nicht von mir geschrieben wurde, sondern von einem neuronalen Netz. Genauer gesagt von mehreren KI-Agenten, denen ich verschiedene Rollen zugeteilt habe. Die einen schrieben Code, die anderen prüften ihn, und wieder andere bekamen die Aufgabe herauszufinden, warum das Ganze nicht funktionierte – und nahmen das sehr ernst. Sie tauchen im Text immer wieder als Reviewer und Auditoren auf, und ich möchte von Anfang an klarstellen, dass das keine lebenden Menschen sind, sondern dieselben neuronalen Netze, denen ich die Rolle eines pedantischen Lesers, eines Hardware-Spezialisten oder eines Messmethodikers zugewiesen habe. Sie arbeiteten unabhängig voneinander und unabhängig von dem Agenten, der den Code schrieb, und das war, glaube ich, die mit Abstand nützlichste Erfindung des ganzen Projekts. Bei mir blieben das Design, die Entscheidungen, die endlosen Fragen, ob wirklich alles geprüft wurde, und ein produktiver Cluster, den man, wie sich herausstellte, sehr leicht aus der Fassung bringt.</p>
<p>Ich erwähne das nicht, um auf einem Modethema mitzureiten, sondern weil der Rest der Geschichte ohne diesen Umstand keinen Sinn ergibt. Erstens wurde alles, was hier beschrieben ist, in neun Tagen erledigt, vom 21. bis zum 29. September, und dieses Tempo wäre unmöglich gewesen, hätte ich alles von Hand geschrieben. Zweitens ist es der Grund, warum sich ein Teil des Codes nicht an die großen Open-Source-Projekte übergeben lässt; dazu komme ich im Abschnitt über QEMU. Und drittens hat ein neuronales Netz eine sehr charakteristische Angewohnheit: Es meldet liebend gern, dass alles erledigt ist und alle Checks grün sind. In der Praxis hieß das oft, dass der Check schlicht gar nichts prüfte. Deshalb ging der größte Teil dieser neun Tage nicht ins Codeschreiben, sondern darein, den Checks beizubringen, ehrlich zu erröten, wenn etwas kaputt ist – ein roter Faden, der sich durch den ganzen Artikel zieht.</p>
<h2 id="der-plan-der-an-einem-tag-zerfiel">Der Plan, der an einem Tag zerfiel</h2>
<p>Auf dem Papier klang der Plan großartig. Wirths echter Prozessor sollte direkt in einem Browser-Tab laufen, Takt für Takt – und nicht als Emulator, der nach der Dokumentation geschrieben wurde, sondern als seine eigene Schaltung. Ein Leser könnte den Befehlssatz dieses Prozessors direkt auf der Seite ändern, einen Knopf drücken und ein paar Sekunden später zusehen, wie das Betriebssystem auf der veränderten Hardware weiterläuft. Und obendrauf wollte ich drei laute Behauptungen setzen. Dass der ganze Computer, von den Gattern bis zu den Fenstern, in einem Browser läuft. Dass ein kleines neuronales Netz mindestens doppelt so schnell läuft, wenn man dem Prozessor eine spezielle Instruktion hinzufügt, die in einem Zug multipliziert und addiert, und dass man das in etwa einer Minute erledigt. Und dass man, wenn man dem Prozessor eine Hardware-Prüfung der Array-Grenzen hinzufügt, zum ersten Mal ehrlich messen kann, was eine solche Prüfung kostet – denn, wie ich im Entwurf selbstbewusst schrieb, diese Zahl hat niemand.</p>
<p>Ich gab mir zwei bis vier Wochen. Na klar.</p>
<p>Bevor ich mich ans Codeschreiben machte, schickte ich den Plan an fünf Reviewer, jeder mit eigenem Fachgebiet: Zeitplan, Hardware, Compiler, Messmethodik und Browser. Die Aufgabe war für alle dieselbe: herausfinden, warum das nicht funktionieren wird. Die Kommentare summierten sich auf mehr als achtzig Kilobyte Text, und danach stand vom Plan nicht mehr viel.</p>
<p>Am ärgerlichsten war, dass der Platz für neue Instruktionen im Prozessor, den ich gefunden zu haben glaubte, gar nicht frei war. Ich hatte in der Instruktionskodierung ein Bit gesehen, das immer null ist, und wollte dort meine neuen Instruktionen unterbringen. Der Hardware-Reviewer öffnete Wirths Schaltung und zeigte, dass der Prozessor dieses Bit schlicht nicht beachtet – auf einem echten Prozessor würden also alle meine neuen Instruktionen stillschweigend als die häufigste Instruktion überhaupt ausgeführt, als Datentransfer, und das Programm würde in aller Ruhe etwas völlig anderes tun als das, was geschrieben steht. Freien Platz gab es im Befehlssatz überhaupt nicht. Später fand sich zwar doch eine kleine Stelle, an der Wirths Compiler immer Nullen schreibt, und darüber, wie ich mich dort hineinzuquetschen versuchte, gibt es eine eigene Geschichte.</p>
<p>Auch die Verdopplung der Geschwindigkeit für das neuronale Netz überstand das Review nicht. Die Reviewer zählten direkt an der Schaltung ab, wie viele Takte jede Operation braucht, und selbst wenn die neue Instruktion völlig kostenlos wäre, könnte sie das Programm grundsätzlich nicht um mehr als den Faktor zwei beschleunigen – und die tatsächlich gebaute würde mit Glück ein paar Prozent schaffen. Und genau hier lag der entscheidende Punkt, der sich später bestätigte: Der Engpass ist gar nicht die fehlende Instruktion, sondern Wirths sehr langsamer Multiplizierer, der das Produkt mit einem Bit pro Takt berechnet.</p>
<p>Die Zahl, die angeblich niemand hat, wurde zur ziemlichen Blamage. Der Methodiker brachte eine Liste von Arbeiten mit, in denen die Kosten von Hardware-Speicherschutz vielfach gemessen worden waren, auch auf modernen Arm-Prozessoren und im CHERI-Projekt. Relativ neu war eigentlich nur, dass ich als Last ein System verwenden wollte, das sich selbst neu baut – aber auch das ist eher ein Detail als eine Entdeckung.</p>
<p>Außerdem stellte sich heraus, dass man in Oberon die Prüfung der Array-Grenzen in gewöhnlichem Code überhaupt nicht abschalten kann; sie ist fest in den Compiler eingeschweißt. Es gab schlicht nichts, womit man Wirths System ohne Prüfungen hätte vergleichen können, und ich musste von Anfang an einen eigenen Compiler-Patch einplanen, der einen Build ohne Prüfungen erzeugt.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Was die Reviewer sonst noch zerlegt haben</span>
  </summary>
  <div class="spoiler__body">
    <p>Ich wollte die Ergebnisse mit einem Konfidenzintervall angeben, wie es ordentliche Statistik verlangt. Der Methodiker wies darauf hin, dass das auf einem Simulator sinnlos ist, weil derselbe Lauf immer dieselbe Zahl liefert, bis auf den Takt genau – es gibt dort keine Streuung, aus der ein Intervall entstehen könnte. Streuung entsteht erst, wenn man viele verschiedene Programme nimmt, und genau das sollte man messen.</p>
<p>Die Reviewer merkten außerdem an, dass auf einer echten Maschine der Videocontroller etwa 7 % der Prozessorzeit beansprucht, weil er ständig Speicher für den Bildschirm liest, und dass jede Zahl ein wenig rosiger als die Wirklichkeit ausfällt, wenn man das ignoriert. Dass zwei Multiplikationen direkt hintereinander auf Wirths Maschine mehr kosten als zwei Multiplikationen mit Abstand. Dass das gängige offene Werkzeug zur Abschätzung der Schaltungsfläche standardmäßig mehr als die Hälfte der Speicherelemente verliert. Und dass der ganze Plan keinen einzigen Zwischenpunkt hatte, an dem man anhalten und den Leuten etwas zeigen konnte – was für ein Projekt in der Freizeit tödlich ist.</p>
<p>Die überarbeitete Zeitschätzung nach dem Review: neun bis dreizehn Wochen Arbeit an den Abenden. Wir haben es in neun Tagen geschafft, aber nur, weil den Code Agenten geschrieben haben – das hatte ich ja schon erwähnt.</p>

  </div>
</details>

<p>Nach dem Review habe ich den Plan neu geschrieben. In der ersten Folge blieben zwei Behauptungen übrig. Erstens, dass der ganze Computer in einem Browser läuft. Zweitens, dass man die Kosten der Bounds-Prüfung auf einem vollständig offenen System ehrlich messen kann, auf dem alles sichtbar ist, von der Prozessorschaltung bis zum Compiler. Das neuronale Netz und seine neue Instruktion habe ich in eine eigene Folge verschoben. Und in der Risikotabelle tauchte ein Satz auf, den ich sehr mag: dass die Zahl höchstwahrscheinlich langweilig ausfallen wird, um die sechs Prozent – und dass genau das das Ergebnis ist.</p>
<p>Um vorzugreifen: Ich habe am Ende doch ein neuronales Netz auf Wirths Prozessor laufen lassen, und in der Hauptsache hatten die Reviewer recht – alles lief auf den Multiplizierer hinaus. Aber dazu mehr gegen Ende.</p>
<h2 id="wirths-echten-prozessor-zum-laufen-bringen">Wirths echten Prozessor zum Laufen bringen</h2>
<p>Alles beginnt ganz einfach. Wirth hat seinen Prozessor in Verilog beschrieben, und diese Beschreibung ist kein Programm, sondern eine Schaltung – Register, Leitungen und die Logik dazwischen. Um eine solche Schaltung ohne echten Chip auszuführen, gibt es ein Werkzeug namens Verilator, das daraus ein C++-Programm macht, das in jedem Takt jede Leitung des Prozessors getreu neu berechnet. Das läuft langsamer als echte Hardware, aber genau wie sie, ohne Näherungen. An den Prozessor müssen noch Bildschirm, Festplatte, Tastatur und Maus angeschraubt werden. Diese Umgebung habe ich selbst gebaut und dabei exakt die Schnittstelle nachgebildet, die das System erwartet, den Prozessor selbst aber um keine einzige Zeile verändert. Das war mir grundsätzlich wichtig, denn alles, was ich später messe, muss auf seiner Schaltung gemessen werden, nicht auf meiner.</p>
<p>Der erste Arbeitstag begann am 22. September um ein Uhr nachts, und bis zum Mittag hatte Wirths echte Schaltung das echte Project Oberon gebootet. Der Bootvorgang umfasst etwa zwölf Millionen Instruktionen, und auf meinem Laptop schafft die Simulation das in vier Sekunden. Das Bild ganz oben im Artikel stammt aus genau diesem Lauf.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Woran das Booten bis zum Mittag hing</span>
  </summary>
  <div class="spoiler__body">
    <p>Zuerst hatte ich den falschen Bootloader erwischt. In Wirths Repository liegt ein Bootloader, der das System über eine serielle Schnittstelle empfängt und überhaupt nicht von der Festplatte liest, und weil sein Anfang mit dem identisch ist, den ich brauchte, habe ich ziemlich lange auf Code gestarrt, der richtig aussah.</p>
<p>Dann führte der Prozessor als erste Instruktion Unsinn aus. Während der Prozessor zurückgesetzt wird, liest er trotzdem eine Instruktion vom Datenbus, und stehen dort in diesem Moment Nullen, wird als Erstes ein sinnloser Datentransfer ausgeführt statt eines Sprungs zum Bootloader, und die Maschine steht einfach still. In genau diesen Bug bin ich auf verschiedenen Prüfständen noch dreimal getreten, und einmal hat er sich extrem gut versteckt – dazu weiter unten mehr.</p>
<p>Und das Dritte war ein auf dem Kopf stehender Bildschirm, weil Wirths Videocontroller das Bild von unten nach oben aus dem Speicher liest. Der Hardware-Reviewer hatte das vorhergesagt, und die Warnung hat mir einen Haufen Zeit gespart.</p>

  </div>
</details>

<p>Es zum Laufen zu bringen, ist nur die halbe Arbeit; man muss sicher sein, dass es korrekt läuft. Dafür gibt es eine Technik namens Lockstep-Vergleich. Man nimmt eine Referenz, der man vertraut, und lässt sie parallel zur eigenen Maschine dasselbe Programm abarbeiten, Instruktion für Instruktion, wobei nach jeder einzelnen der Inhalt sämtlicher Register verglichen wird. Weicht irgendwo auch nur ein einziges Bit ab, erfährt man es sofort und weiß genau, bei welcher Instruktion es passiert ist. Als Referenz nahm ich den Emulator aus dem Projekt Norebo, und über den gesamten Systemstart – fast fünfzehn Millionen Instruktionen – wich meine Schaltung kein einziges Mal von ihm ab. Anfangs gab es allerdings eine Abweichung, und die ging auf mein Konto: Auf Anraten eines Reviewers hatte ich vorsorglich einen Verwaltungswert in den Speicher geschrieben, den der Emulator nur in einer bestimmten Situation schreibt, die in diesem Lauf gar nicht eintrat. Richtig war, gar nichts anzufassen.</p>
<p>Hier sollte ich sagen, warum das überhaupt wichtig ist. Alle Taktzahlen in diesem Artikel berechnet ein separates schnelles Modell, weil die echte Schaltung unter schwerer Last viel zu lange braucht. Und diesem Modell kann man genau so weit trauen, wie es mit der Schaltung übereinstimmt. Ich habe die beiden auf demselben Bootvorgang gegeneinander geprüft und eine perfekte Übereinstimmung bekommen, bis auf den Takt genau – aber zunächst behauptete der Vergleich, das Modell liege um fast sechzehn Prozent daneben, und ich hätte es beinahe geglaubt. Gelogen hatte der Vergleich selbst, weil er die Instruktionsadresse einen Takt früher abgriff als vorgesehen. Hätte ich damals veröffentlicht, dass das Modell um 16 % danebenliegt, wäre jede Zahl im Projekt entwertet gewesen. Seitdem habe ich eine Regel: Ein negatives Ergebnis muss genauso sorgfältig geprüft werden wie ein positives, denn man kann sich in beide Richtungen irren.</p>
<h2 id="was-die-prüfung-von-array-grenzen-kostet">Was die Prüfung von Array-Grenzen kostet</h2>
<p>Nun zur zentralen Frage der ersten Folge. Schreibt man in C <code>a[i]</code> und ist <code>i</code> zufällig größer als das Array, liest oder schreibt das Programm stillschweigend fremden Speicher. Aus diesem simplen Fehler ist ein riesiger Teil der Sicherheitslücken der letzten fünfzig Jahre erwachsen, von den Buffer Overflows der Neunziger bis zu den heutigen Sicherheitsbulletins der Browser. Sich davor zu schützen, ist sehr einfach: Vor jedem Array-Zugriff wird der Index mit der Länge verglichen und, falls er außerhalb liegt, das Programm angehalten. Viele Sprachen tun genau das, Oberon tut es immer, und in C und C++ wird diese Prüfung traditionell nicht geschrieben, weil sie als langsam gilt. Ich wollte also herausfinden, wie langsam sie tatsächlich ist, und zwar auf einem System, auf dem absolut alles sichtbar ist.</p>
<p>Dafür braucht man drei Varianten desselben Systems. Die erste ohne jede Prüfung – ein solches Oberon gibt es nicht, also habe ich es selbst gebaut, indem ich eine einzige Zeile im Compiler geändert habe. Die zweite mit der Software-Prüfung, wie bei Wirth, bei der der Compiler vor jedem Zugriff einen Vergleich und einen Sprung zum Fehlerbehandler einfügt. Und die dritte mit einer Hardware-Prüfung, bei der der Prozessor eine neue Instruktion bekommt, die all das selbst in einem Takt erledigt. Diese Instruktion bekommt einen eigenen Abschnitt. Als Last nahm ich den Oberon-Compiler, der mehrere Module des Systems selbst übersetzt, denn das ist ein echtes, großes Programm und kein synthetischer Test.</p>
<p>Die erste Zahl, die ich bekam, lag unter einem halben Prozent, und ich freute mich, dass Prüfungen fast nichts kosten. Dann merkte ich, dass ich das Falsche verglichen hatte. Ich hatte zwei verschiedene Compiler laufen lassen, einen mit Prüfungen und einen ohne, und der Compiler ohne Prüfungen hatte schlicht weniger Arbeit, weil er niemandem sonst Prüfungen in den Code einfügen musste. Vergleichen muss man dieselbe Arbeit – also ein und denselben Compiler in zwei Varianten bauen und beiden dieselbe Aufgabe geben. Nachdem ich das korrigiert hatte, wuchs die Zahl um ein Mehrfaches.</p>
<p>Danach gab es noch einige Durchgänge, und die ehrliche Antwort lautete so. Solange die Prüfungen nur aus dem Compiler selbst entfernt werden, kosten sie etwa zwei Prozent der Zeit. Entfernt man sie aus dem gesamten System, auf dem der Compiler läuft, einschließlich der Verarbeitung von Text, Dateien und Speicher, sind es fast fünf Prozent. Von je hundert Takten Compilerarbeit gehen also zwischen zwei und fünf dafür drauf, dass das Programm nie über das Ende eines Arrays hinausläuft. Ob das viel oder wenig ist, mag jeder Leser selbst entscheiden; für meinen Geschmack ist es sehr billig dafür, dass eine ganze Klasse von Sicherheitslücken wegfällt. Mit einem Vorbehalt, den die Reviewer schon am ersten Tag gemacht hatten: Ich habe nur eine einzige Last, das ist also eine Zahl über den Oberon-Compiler und nicht über alle Programme der Welt.</p>
<p>Hier wartete die erste Überraschung auf mich. Als ich nachzählte, welche Prüfungen tatsächlich im Code stehen, stellte ich fest, dass es in Oberon sehr wenige Prüfungen von Array-Grenzen gibt und die überwältigende Mehrheit Prüfungen darauf sind, dass ein Zeiger nicht leer ist – also nicht NIL. Allein im Compiler sind es mehr als dreihundert davon gegenüber einer Handvoll Indexprüfungen. Die Kosten der Sicherheit in Oberon entstehen also hauptsächlich dadurch, dass das Programm keinen Nullzeiger dereferenzieren kann, und Arrays als solche sind hier Nebensache.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie ich beim Nacherzählen fremder Arbeiten erwischt wurde</span>
  </summary>
  <div class="spoiler__body">
    <p>Zuerst verglich ich meine Prozentwerte mit veröffentlichten Arbeiten zum Speicherschutz auf anderen Prozessoren und bekam eine sehr hübsche kleine Tabelle. Der Auditor zog sie komplett zurück, weil ich drei der vier Zahlen falsch wiedergegeben hatte. An einer Stelle hatte ich den Wert für einen leichtgewichtigen Schutzmodus genommen, während der vollständige fünfmal mehr kostete. An einer anderen kam der Großteil des Verlusts von Cache-Misses, und Wirths Prozessor hat überhaupt keinen Cache, ein Vergleich mit unserer Zahl ist also sinnlos. An einer weiteren hatte ich zwei verschiedene Betriebsmodi für eine Wertespanne gehalten. Und in einer Arbeit war das Ergebnis als Faktor angegeben, ich aber hatte es als Prozentwert gelesen, sodass aus einer Verlangsamung um das Anderthalb- bis Zweieinhalbfache in meinen Händen eine Verlangsamung um anderthalb bis zweieinhalb Prozent wurde. Für Letzteres schäme ich mich am meisten.</p>
<p>Am nächsten an meinem eigenen Aufbau lag schließlich eine Dissertation, in der mehrere CHERI-Prozessoren bei 10–16 % landeten, gemessen wird dort aber vollständiger Zeigerschutz, eine deutlich breitere Sache, das ist also eher eine Orientierung als ein Vergleich. Und die Behauptung, diese Zahl habe niemand, überlebte nicht einmal das, denn schon 1981 gab es eine Arbeit, die die Kosten von Prüfungen in Pascal maß. Und zwar gemessen. Korrekt kann man nur sagen, dass wir in diesen und jenen Quellen etwas nicht gefunden haben, und nur so formuliere ich es heute.</p>

  </div>
</details>

<h2 id="wie-ich-dem-prozessor-beibrachte-selbst-zu-prüfen">Wie ich dem Prozessor beibrachte, selbst zu prüfen</h2>
<p>Jetzt zur Hardware-Prüfung. Die Idee ist einfach. Statt zweier Instruktionen – eines Vergleichs und eines bedingten Sprungs – bekommt der Prozessor eine neue Instruktion, die ich <code>CHK</code> genannt habe. Sie nimmt einen Index und eine Array-Länge und springt, wenn der Index außerhalb des Bereichs liegt, selbst zum Fehlerbehandler. Alles in einem Takt statt in zweien.</p>
<p>Die Schwierigkeit lag darin, wo in der Instruktion die Array-Länge unterzubringen ist. Eine Instruktion auf Wirths Prozessor hat 32 Bit, und fast alle sind schon belegt. Die einzige Stelle, die der Prozessor wirklich nicht nutzt – was ich durch Aufzählen aller möglichen Werte bewiesen habe –, sind zwölf Bit in der Mitte der Instruktion. Zwölf Bit bedeuten Arrays mit bis zu viertausend Elementen, und das ist in Oberon die überwältigende Mehrheit, also war ich zufrieden und legte die Länge dorthin.</p>
<p>Und bekam ein sehr hässliches Ergebnis. Schlägt in Oberon eine Prüfung an, meldet das System, wo und welcher Fehler genau aufgetreten ist, und die Fehlernummer entnimmt es genau den Bits der Instruktion, in die ich die Länge gelegt hatte. Ich machte ein Experiment mit einem echten Fehler, einem Programm, das über das Ende eines Arrays mit hundert Elementen hinausgreift. Das gewöhnliche System meldete ehrlich, dass der Index außerhalb der Array-Grenzen lag. Meines, mit der neuen Instruktion, meldete ebenso selbstbewusst, es habe eine Nullzeiger-Dereferenzierung gegeben, weil ein Stück der Zahl 100 im Feld für die Fehlernummer gelandet war. Ein Programmierer, der diese Meldung bekommt, würde einem nicht existierenden Zeiger-Bug hinterherjagen und einen halben Tag damit verlieren. Das ist schlimmer, als wenn das System gar nichts sagt.</p>
<p>Danach versuchte ich ein paarmal, mich herauszuwinden, indem ich die Länge auf acht Bit verkürzte, und beide Male ging es schief. Zuerst zeigte die Statistik, dass acht Bit für die meisten Arrays reichen, dann stellte sich aber heraus, dass die Mehrheit in dieser Statistik aus identischen Puffern für Dateinamen bestand, die kaum je benutzt werden, während die heißen Schleifen, die millionenfach laufen, gerade mit den großen Arrays arbeiten und nicht in acht Bit passen. Die Lösung fand sich an anderer Stelle. Die neue Instruktion braucht nämlich kein Zielregister, weil sie nichts berechnet, sondern nur prüft, und die vier Bit, die gewöhnlich dieses Register bezeichnen, sind frei. Die Länge lässt sich in zwei Teile schneiden: Die vier oberen Bit kommen dorthin, die acht unteren in die Mitte der Instruktion, so platziert, dass sie die Fehlernummer nicht berühren. Das ergab sowohl die zwölf Bit Länge als auch korrekte Fehlermeldungen.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie die neue Instruktion in der Prozessorschaltung aussieht und welche Fallen sie barg</span>
  </summary>
  <div class="spoiler__body">
    <p>Die gesamte Änderung am Prozessor steckt hinter einem einzigen Schalter, sodass man exakt dieselbe Schaltung mit und ohne die neue Instruktion bauen und vergleichen kann (hier vereinfacht, ohne das Zusammensetzen der Länge aus zwei Teilen):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-verilog" data-lang="verilog"><span class="line"><span class="cl"><span class="no">`ifdef</span> <span class="n">WITH_CHK</span>
</span></span><span class="line"><span class="cl"><span class="k">assign</span> <span class="n">CHK</span>     <span class="o">=</span> <span class="o">~</span><span class="n">p</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">q</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">u</span> <span class="o">&amp;</span> <span class="n">v</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">op</span> <span class="o">==</span> <span class="mh">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">assign</span> <span class="n">chkFail</span> <span class="o">=</span> <span class="n">CHK</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">B</span> <span class="o">&gt;=</span> <span class="n">chkLim</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="no">`else</span>
</span></span><span class="line"><span class="cl"><span class="k">assign</span> <span class="n">CHK</span>     <span class="o">=</span> <span class="mh">1</span><span class="mb">&#39;b0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">assign</span> <span class="n">chkFail</span> <span class="o">=</span> <span class="mh">1</span><span class="mb">&#39;b0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="no">`endif</span>
</span></span></code></pre></div><p>Anfangs fehlte in der ersten Zeile das <code>~u</code>, und deshalb belegte die neue Instruktion zwei Kodierungen statt einer und kaperte dabei nebenbei eine andere, völlig unbeteiligte. Gefunden hat das ein Check, der jede mögliche Instruktion auf dem gewöhnlichen Prozessor und auf dem Prozessor mit der neuen Instruktion durchspielt und sucht, wo sie sich unterschiedlich verhalten. Die richtige Antwort ist genau eine Stelle; er fand zwei.</p>
<p>Der Auditor hat außerdem durchgespielt, was passiert, wenn ein Modul mit der neuen Instruktion versehentlich auf einem gewöhnlichen Prozessor gestartet wird. Der gewöhnliche Prozessor hält sie für einen Shift und beschädigt stillschweigend eines der Register – welches, hängt von der Array-Länge ab, und bei einer Länge um die viertausend ist es das Register mit der Rücksprungadresse einer Prozedur. Von außen sähe das wie eine unerklärliche Stack-Beschädigung aus. Inzwischen werden solche Module mit einer neuen Formatversion gekennzeichnet, und das gewöhnliche System weigert sich schlicht, sie zu laden. Das Komische daran: Die Forderung nach der Versionskennzeichnung stand schon im allerersten Review; ich hatte sie angenommen und dann verloren.</p>

  </div>
</details>

<p>Wie viel spart die Hardware-Prüfung also am Ende? Beim Compiler fällt etwa ein Sechstel der Prüfkosten weg, bei einer gemischten Last mit Arrays unterschiedlicher Größe ein Zehntel und bei rein rechnendem Code mit kleinen Arrays die Hälfte. Die Hälfte ist übrigens die Obergrenze, mehr wird es nie, denn aus zwei Instruktionen wurde eine. Der Unterschied zwischen den Lasten hat eine ganz einfache Erklärung. Die Instruktion hilft nur dort, wo die Array-Länge in zwölf Bit passt. Wo das Array größer ist, greift der Compiler auf die alte Software-Prüfung zurück, und es gibt keinen Gewinn.</p>
<p>Und noch eine schöne Geschichte aus diesem Abschnitt. Für die zweite Last schrieb ich ein kleines Programm mit einer Sortierung und einer Matrixmultiplikation. In der Variante mit Prüfungen stürzte es sofort mit einer Out-of-Bounds-Meldung ab, und der Fehler steckte in meinem Programm selbst: Ich hatte einen Index falsch berechnet und lief um das Dreieinhalbfache über das Array hinaus. Die Variante ohne Prüfungen lief stillschweigend durch, als sei alles in Ordnung, und schrieb in aller Ruhe zweieinhalbtausend Zahlen in fremden Speicher. Gefunden wurde der Bug nur, weil die Prüfungen eingeschaltet waren, und ehrlich gesagt fällt mir keine bessere Werbung für Bounds-Checking ein.</p>
<p>Wie viel die neue Instruktion in Hardware kostet – wie viel Platz sie auf dem Chip einnimmt und ob sie den Prozessor verlangsamt –, habe ich ebenfalls gemessen, und die Antwort fiel langweilig aus. Sie fügt weniger als ein Prozent Logik hinzu und berührt die Taktfrequenz überhaupt nicht. Interessant ist hier, wie ich zu dieser langweiligen Antwort kam, denn unterwegs erwies sich das Rauschen bei solchen Messungen als größer als der Effekt selbst.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie das Rauschen größer ausfiel als der Effekt</span>
  </summary>
  <div class="spoiler__body">
    <p>Die Fläche einer Schaltung schätzt man mit offenen Synthesewerkzeugen ab, die eine Verilog-Beschreibung in eine Menge von Logikelementen übersetzen. Die erste Falle: Das Werkzeug ließ im Standardmodus stillschweigend drei Viertel der Speicherelemente weg, und der einzige Hinweis darauf war ein Pluszeichen ganz am Ende einer Zeile im Bericht. Die zweite: Ohne explizit angegebene Constraints ignorierte es das Geschwindigkeitsziel einfach, und die Schaltung für 200 Pikosekunden und für 50 Nanosekunden fiel bis auf die letzte Ziffer identisch aus.</p>
<p>Das Schlimmste aber war etwas anderes. Ich nahm Wirths Schaltung und schrieb sie viermal so um, dass sich an der Logik überhaupt nichts änderte – etwa mit überflüssigen Klammern oder einem sinnlosen ODER mit null. Die Fläche schwankte danach um etwa so viel, wie meine neue Instruktion hinzufügt. Der Effekt, den ich messen wollte, war also genauso groß wie der Unterschied, der sich allein daraus ergibt, wie ein völlig unveränderter Ausdruck zufällig hingeschrieben ist. Ehrlich sagen kann man also nur, dass es unter einem Prozent liegt; und was die Frequenz angeht, zeigte eine Bauweise ein wenig schneller, eine andere ein wenig langsamer, und sich eine davon auszusuchen, hieße, eine bequeme Antwort zu wählen, statt eine zu messen.</p>
<p>Dann habe ich die Schaltung auf einem echten FPGA platziert und geroutet – also die Werkzeuge gebeten, sie auf die tatsächlichen Zellen eines bestimmten Chips zu verteilen und die Leitungen dazwischen zu ziehen. Erst danach sieht man, mit welcher Frequenz die Schaltung wirklich laufen wird. Die nativen 25 MHz hielten mit großer Reserve, die neue Instruktion beeinflusste die Frequenz nicht, und der Großteil der Verzögerung in der Schaltung steckt in den Leitungen, nicht in der Logik.</p>

  </div>
</details>

<h2 id="die-auditoren-haben-die-arbeit-nicht-abgenommen">Die Auditoren haben die Arbeit nicht abgenommen</h2>
<p>Am Abend des ersten Tages hatte ich viele hübsche Zahlen und übergab sie fünf Auditoren zur Abnahme. Um 17:40 meldeten sie sich zurück, und alle fünf schrieben dasselbe Wort: NICHT ABGENOMMEN, in Großbuchstaben.</p>
<p>Am unangenehmsten und zugleich am nützlichsten war das Mutations-Audit. Seine Idee ist einfach und sehr grausam. Der Auditor baut absichtlich plausible Fehler in den Prozessor ein – ändert etwa in einem Vergleich „größer oder gleich“ in „größer“ – und schaut, ob meine Tests es bemerken. Bleiben die Tests auf einem kaputten Prozessor grün, prüfen sie gar nichts. Von dreißig eingebauten Fehlern fingen meine Tests zehn. Zwei Drittel der kaputten Prozessoren bestanden jede Prüfung als einwandfrei.</p>
<p>Die Gründe waren sehr lehrreich. An einer Stelle zählte ein Check, der gar nicht gelaufen war, als bestanden, und der Bericht verkündete stolz, drei von fünf Fällen seien geprüft und keine Fehler gefunden worden. An einer anderen war der Test-Build so konfiguriert, dass sein Scheitern den Lauf nicht stoppte, und Erfolg wurde an einem Smiley in der letzten Ausgabezeile festgemacht, sodass null ausgeführte Tests einen vollständig grünen Bericht ergaben. Und eine Instruktion, die angeblich den Systemstart prüfte, prüfte in Wahrheit überhaupt nichts: Mit einem Prozessor, bei dem eine seiner Instruktionen kaputt war, blieb die Maschine gleich zu Beginn des Bootvorgangs hängen, und der Check meldete trotzdem Erfolg. Obendrein enthält der Systemstart keine einzige Operation mit Gleitkommazahlen, meine Behauptung, der Vergleich habe die gesamte Arithmetik des Prozessors geprüft, war also schlicht falsch.</p>
<p>Die Hauptschlussfolgerung der Auditoren war, dass fast alle Fehler beim Übertragen der Ergebnisse in den Text passierten. Eine Zahl, die unter bestimmten Bedingungen gewonnen wurde, wanderte als allgemeine Aussage in die Zusammenfassung. Wir haben alles umgeschrieben, was wir fanden, dieselbe Art absichtlicher Sabotage in den automatischen Check bei jeder Änderung aufgenommen und eine Regel eingeführt: Jeder Check muss scheitern können, und das muss vorgeführt werden. Und am nächsten Tag tauchte noch ein Juwel auf. In allen gut zweihundert Prozessortests wurde die allererste Instruktion des Programms gar nicht ausgeführt, und zwar wegen genau jenes Bus-beim-Reset-Bugs, über den ich oben geschrieben habe. Bemerken konnte man das unmöglich, weil jeder Test mit einer Instruktion begann, deren Ergebnis ohnehin keine Rolle spielte. Am ärgerlichsten: Ich hatte diesen Bug auf einem anderen Prüfstand schon gefunden und behoben und dort sogar einen Kommentar hinterlassen, dass ich genau darüber gestolpert war.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Kleine Freuden der ersten Tage</span>
  </summary>
  <div class="spoiler__body">
    <p>Ich schrieb ein Skript, das auf das Ende eines langen Laufs wartet und das anhand des Prozessnamens prüft. Das Skript wartete anderthalb Stunden, weil es sich selbst fand – der Prozessname stand in seiner eigenen Kommandozeile. Sehr zen, und die ganze Zeit dachte ich, eine lange Kompilierung sei im Gange.</p>
<p>Vier Milliarden Instruktionen gingen ins Leere, weil Emulator und Prozessor Geräteadressen unterschiedlich schreiben und der Check, ob das Programm ein Gerät anfasst, kein einziges Mal anschlug.</p>
<p>Ein und dasselbe Feld einer Sprunginstruktion behandelt Wirths Compiler als 24-Bit-Feld, der Disassembler als 20-Bit-Feld und der Prozessor selbst als 22-Bit-Feld. Drei Teile eines Systems, geschrieben von einem Mann, und jeder hat auf seine Weise recht.</p>
<p>Eines der Werkzeuge zur Testvorbereitung beschädigte stillschweigend das Referenz-Disk-Image direkt im Repository, und der Bildschirm-Check stimmte auf dem beschädigten Image trotzdem überein. Inzwischen läuft alles auf Kopien, und neben der Referenz liegen Prüfsummen.</p>
<p>Zwei Multiplikationen direkt hintereinander kosten auf Wirths Maschine fast anderthalbmal mehr als zwei Multiplikationen mit Abstand, weil der Multiplizierer seinen Zähler nicht rechtzeitig zurücksetzt. Zuerst freute ich mich über den Fund, dann erfuhr ich, dass die Langsamkeit des Multiplizierers schon 2016 in den Oberon-Foren diskutiert worden war. Genau diesen Mechanismus habe ich dort nicht gefunden, aber dass ich etwas nicht gefunden habe, heißt nicht, dass es niemand wusste.</p>

  </div>
</details>

<p>Und um 19:30 am ersten Tag schloss sich der Kreis. Der Oberon-Compiler, der auf Wirths echter Schaltung lief, übersetzte sich selbst, und das Ergebnis stimmte Byte für Byte mit dem überein, was der Emulator erzeugt. Am nächsten Tag gelang dasselbe innerhalb des Systems selbst, mit Fenstern und Maus. Ein Skript aus Klicks und Tastendrücken ließ das System sich vollständig neu bauen, und jede Datei kam genau so heraus wie im ursprünglichen Disk-Image. Nebenbei stellte sich heraus, dass das offizielle System-Image von 2016 nicht ganz mit sich selbst konsistent ist: Ein paar seiner Module waren veraltet, und eines fehlte ganz. Der ganz normale Alltag eines lebendigen Projekts – und ehrlich gesagt hat mich das ziemlich gerührt.</p>
<h2 id="oberon-in-einem-browser-tab">Oberon in einem Browser-Tab</h2>
<p>Jetzt zur ersten Behauptung dieser Folge, der über den Browser. Wirths Schaltung, die Verilator in ein C++-Programm verwandelt hat, lässt sich weiter nach WebAssembly übersetzen – in das Format, in dem ein Browser gewöhnlichen kompilierten Code mit nahezu nativer Geschwindigkeit ausführen kann. Und dann dreht sich im Tab kein Emulator, den jemand nach der Dokumentation geschrieben hat, sondern genau die Schaltung, die Wirth auf sein FPGA geflasht hat, mit allen ihren Leitungen und Takten. Ich betone noch einmal: Bildschirm, Festplatte, Tastatur und Maus rund um den Prozessor stammen von mir, gebaut nach derselben Schnittstelle wie bei Wirth, und der Videocontroller, der auf einer echten Maschine ein wenig Prozessorzeit beansprucht, geht in die Messungen nicht ein.</p>
<p>Anfangs hieß es, das sei eine schlechte Idee, weil das Neuberechnen jeder Leitung für einen Browser zu langsam sei. In der Praxis läuft die Browser-Version fast so schnell wie dieselbe Simulation, die direkt auf dem Rechner gestartet wird – der Unterschied liegt bei ein paar Prozent. Das ist etwa sechsmal langsamer als Wirths echte Maschine, das System braucht also ein paar Sekunden zum Booten, danach kann man ganz entspannt damit arbeiten. Und die ganze Maschine samt Disk-Image wiegt etwa dreihundert Kilobyte – weniger als ein durchschnittliches Bild auf einer beliebigen Nachrichtenseite.</p>
<figure><img src="oberon-in-browser.png" alt="Dasselbe System im Browser" width="778" height="1156" loading="lazy" decoding="async">
  <figcaption><p>Dasselbe System im Browser. Das Log mit dem Oberon-Startbildschirm und ein System.Tool-Fenster, dessen Text man mit der mittleren Taste anklickt.</p></figcaption>
</figure>

<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Was nötig war, damit das funktioniert</span>
  </summary>
  <div class="spoiler__body">
    <p>Der WebAssembly-Build brauchte ein paar Stubs für Funktionen, die der Browser nicht hat, und ein paar Workarounds in Verilator selbst, aber das ist der langweilige Teil. Interessanter war, was danach kam.</p>
<p>Öffnet man die Seite in einem Hintergrund-Tab, zeichnet der Browser darauf nichts, und der Bildschirm blieb schwarz, selbst nachdem man zu diesem Tab gewechselt hatte. Ich musste den Moment, in dem der Tab sichtbar wird, gesondert abfangen.</p>
<p>Am interessantesten war die Maus. Oberon muss wissen, welche der drei Tasten gleichzeitig gedrückt sind, der Browser meldet Tastendrücke aber einzeln, also muss der Zustand aller Tasten von Hand zusammengesetzt werden. Auf einem Laptop wird die mittlere Taste durch einen Klick mit gedrückter Alt-Taste ersetzt – nicht Ctrl, wie man es gern hätte, denn auf einem Mac ist Ctrl-Klick die rechte Taste. Und ein Shift-Klick ersetzt einen kniffligen Akkord, bei dem man die linke Taste drückt und, ohne sie loszulassen, die rechte dazunimmt. Die Seite drückt zuerst selbst die linke und nimmt dann die rechte dazu, weil es für Oberon eine Rolle spielt, mit welcher Taste alles begann.</p>
<p>Die Maschine selbst läuft in einem eigenen Thread, um die Seite nicht einzufrieren, und übergibt fertige Bildschirm-Frames ohne Kopieren an den Haupt-Thread. Außerdem rechnet sie nur, solange jemand hinsieht, und ist der Tab verborgen oder hat man die Maschine aus dem Bildschirm gescrollt, hält sie an. Andernfalls würde sie ehrlich einen ganzen Kern Ihres Prozessors verheizen, denn die Schaltung kann nicht untätig sein und zählt einfach Takte.</p>

  </div>
</details>

<p>Dadurch lässt sich die Maschine mit zwei Zeilen in jede beliebige Seite einbetten:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;module&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://tym83.github.io/paleocomputing/oberon/embed.js&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">oberon-machine</span> <span class="na">base</span><span class="o">=</span><span class="s">&#34;https://tym83.github.io/paleocomputing/oberon/&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">oberon-machine</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Details und Einstellungen stehen auf der Seite <a href="https://tym83.github.io/paleocomputing/oberon/embed.html">Embed it</a>. Dort können Sie die Maschine auch auf den Prozessor mit der neuen Prüfinstruktion umschalten und vor dem Booten eigene Dateien auf ihre Festplatte legen.</p>
<h2 id="die-seite-auf-der-man-den-prozessor-wechselt">Die Seite, auf der man den Prozessor wechselt</h2>
<p>Ursprünglich wollte ich, dass der Leser den Befehlssatz des Prozessors selbst ändern kann, direkt auf der Seite. Das habe ich, wie ich offen zugebe, nicht umgesetzt, weil sich das Neubauen der Schaltung aus Verilog direkt im Browser als zu schwer erwies. Stattdessen funktionierte die Ausweichidee aus demselben Plan: mehrere Prozessorvarianten vorab bauen und zwischen ihnen umschalten lassen. Auf der Seite <a href="https://tym83.github.io/paleocomputing/oberon/checks.html">Change the processor</a> gibt es zwei Kerne – den gewöhnlichen, wie bei Wirth, und einen mit der neuen Instruktion <code>CHK</code> –, und auf jedem lässt sich dieselbe Schleife ausführen, die ein Array durchläuft.</p>
<p>Auf dem gewöhnlichen Prozessor braucht ein Array-Zugriff in dieser Schleife elf Takte, von denen zwei auf die Software-Prüfung entfallen. Auf dem Prozessor mit der neuen Instruktion sind es zehn, weil die Prüfung einen Takt statt zwei braucht. Ein Takt von elf, genau wie beabsichtigt. Jener langweilige Satz aus der Risikotabelle hat sich bewahrheitet.</p>
<figure><img src="checks-page.png" alt="Die Seite, auf der der Prozessor umgeschaltet wird" width="940" height="760" loading="lazy" decoding="async">
  <figcaption><p>Die Seite, auf der man den Prozessor wechselt. Ein Kernumschalter und die Listings der beiden Varianten der Schleife.</p></figcaption>
</figure>

<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie diese Messung anfangs um den Faktor zehn log</span>
  </summary>
  <div class="spoiler__body">
    In der ersten Version ließ die Seite das Programm bis zum Ende laufen und stellte den Moment seines Endes fest, indem sie alle zweihunderttausend Instruktionen einmal in den Speicher schaute. Dadurch erfasste die Messung auch den Leerlauf nach dem Ende der Schleife, und die Prüfung schien zehn Instruktionen zu kosten statt einer. Das sah durchaus plausibel aus, und ich hätte es beinahe geglaubt. Inzwischen ist die Schleife absichtlich länger als das, was wir messen, beide Prozessorversionen führen exakt dieselbe Anzahl Instruktionen aus, und wie oft die Schleife durchlaufen wurde, schreibt das Programm selbst in ein Register.
  </div>
</details>

<p>Und das Wichtigste, was diese Seite prüft, sind nicht einmal die Kosten der Prüfung. Das gewöhnliche System, ganz ohne neue Instruktionen, muss auf beiden Prozessoren exakt gleich booten, mit demselben Bild auf dem Bildschirm und derselben Anzahl ausgeführter Instruktionen. Verhalten sich die alten Programme nach dem Hinzufügen der neuen Instruktion auch nur ein wenig anders, dann habe ich die Kompatibilität gebrochen und eine andere Maschine erhalten.</p>
<figure><img src="checks-measure.gif" alt="Eine Messung auf dem gewöhnlichen Kern, ein Wechsel zum CHK-Kern und eine weitere Messung" width="720" height="429" loading="lazy" decoding="async">
  <figcaption><p>Eine Messung auf dem gewöhnlichen Kern, ein Wechsel zum Kern mit CHK und noch eine. Der Unterschied ist, wie versprochen, ein einziger Takt.</p></figcaption>
</figure>

<h2 id="dreizehn-laborübungen">Dreizehn Laborübungen</h2>
<p>Da die Maschine im Browser läuft, kann man an ihr lernen. Das <a href="https://tym83.github.io/paleocomputing/oberon/lab.html">Labor</a> umfasst dreizehn Übungen, und jede wird von der Maschine geprüft, statt auf Treu und Glauben angenommen zu werden. Die Prüfung schaut in den Speicher, die Register oder die Festplatte des emulierten Computers selbst und sieht nach, ob Sie getan haben, was verlangt war. Die Übungen sind nach Stufen gegliedert: zuerst nur anschauen, dann verändern, kaputt machen, messen und schließlich selbst bauen.</p>
<figure><img src="lab-page.png" alt="Das Labor: links die Maschine, rechts die Übung und ein Prüfknopf" width="1440" height="1000" loading="lazy" decoding="async">
  <figcaption><p>Das Labor. Links die Maschine, rechts die Übung und ein Prüfknopf, der direkt in den Speicher des emulierten Computers schaut.</p></figcaption>
</figure>

<p>Und so sieht die Oberfläche von Oberon in Aktion aus. Ein Mittelklick auf den Text <code>System.ShowModules</code> öffnet die Liste der geladenen Module, ein weiterer, auf <code>Hilbert.Draw</code>, zeichnet eine Hilbert-Kurve. Keine Buttons, nur Text:</p>
<figure><img src="lab-showmodules-hilbert.gif" alt="Ein Mittelklick auf Text startet ein Programm" width="720" height="540" loading="lazy" decoding="async">
  <figcaption><p>Ein Mittelklick auf Text – so startet man ein Programm.</p></figcaption>
</figure>

<table>
  <thead>
      <tr>
          <th>#</th>
          <th>Übung</th>
          <th>Stufe</th>
          <th>Was Sie lernen</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>Das System auf echter Hardware</td>
          <td>anschauen</td>
          <td>dass unter dem Bild Wirths Schaltung läuft und wie eine Oberfläche aufgebaut ist, in der jeder Text ein Befehl sein kann</td>
      </tr>
      <tr>
          <td>2</td>
          <td>Ihr erstes Modul</td>
          <td>anschauen</td>
          <td>wie man im eingebauten Editor ein Programm eintippt, speichert und kompiliert</td>
      </tr>
      <tr>
          <td>3</td>
          <td>Der Schnittstellenschlüssel</td>
          <td>verändern</td>
          <td>warum Oberon keine Header-Dateien hat und wie sich das System vor inkompatiblen Modulen schützt</td>
      </tr>
      <tr>
          <td>4</td>
          <td>Hier gibt es keinen Speicherschutz</td>
          <td>kaputt machen</td>
          <td>was passiert, wenn man Müll direkt in den Bildschirmspeicher schreibt, und wie eine einzige Instruktion die Maschine sofort tötet</td>
      </tr>
      <tr>
          <td>5</td>
          <td>Wie viele Takte pro Instruktion</td>
          <td>messen</td>
          <td>warum man auf einer Maschine ohne Cache die Takte im Kopf zählen kann</td>
      </tr>
      <tr>
          <td>6</td>
          <td>Der Speicher geht mitten in einer Instruktion aus</td>
          <td>kaputt machen</td>
          <td>warum die Garbage Collection nur zwischen Instruktionen funktioniert</td>
      </tr>
      <tr>
          <td>7</td>
          <td>Das System baut sich selbst neu</td>
          <td>bauen</td>
          <td>wie man ein Modul innerhalb des Systems neu baut und die Inkonsistenz des Images mit eigenen Händen findet</td>
      </tr>
      <tr>
          <td>8</td>
          <td>Zwei Compiler-Generationen</td>
          <td>anschauen</td>
          <td>warum ein Compiler, der sich selbst baut, noch gar nichts beweist</td>
      </tr>
      <tr>
          <td>9</td>
          <td>Im Inneren des Compilers</td>
          <td>verändern</td>
          <td>wo im Compiler die Instruktionen des Prozessors entstehen</td>
      </tr>
      <tr>
          <td>10</td>
          <td>Der Garbage Collector von innen</td>
          <td>anschauen</td>
          <td>dass die Garbage Collection eine gewöhnliche Aufgabe ist, die das System etwa einmal pro Sekunde aufruft</td>
      </tr>
      <tr>
          <td>11</td>
          <td>Eine Aufgabe nach der anderen</td>
          <td>kaputt machen</td>
          <td>warum eine einzige hängende Aufgabe das ganze System anhält</td>
      </tr>
      <tr>
          <td>12</td>
          <td>Die Kosten einer Prüfung, von Hand</td>
          <td>messen</td>
          <td>wie man drei Varianten an einer eigenen Schleife misst – ohne Prüfung, in Software und in Hardware</td>
      </tr>
      <tr>
          <td>13</td>
          <td>Ihre eigene eingebaute Prozedur</td>
          <td>bauen</td>
          <td>wie man der Sprache eine neue eingebaute Prozedur hinzufügt, indem man den Compiler direkt im System neu baut</td>
      </tr>
  </tbody>
</table>
<p>Standardmäßig öffnet sich das Labor auf Englisch und wechselt per Button oder über einen Link mit <a href="https://tym83.github.io/paleocomputing/oberon/lab.html?lang=ru"><code>?lang=ru</code></a> auf Russisch, die Wahl wird gespeichert. Daneben gibt es ein <a href="https://tym83.github.io/paleocomputing/oberon/book/">Handbuch</a> mit acht Kapiteln, das damit beginnt, was hier echt ist, und damit endet, was wir gemessen haben; es gibt auch eine <a href="https://tym83.github.io/paleocomputing/oberon/book/en/">englische Fassung</a>. Wenn Sie Rechnerarchitektur unterrichten und diese Übungen für sich übernehmen möchten, schreiben Sie mir, und ich helfe Ihnen beim Einrichten. Sie sind offen, und die Maschine lässt sich mit demselben Tag in Ihre eigene Seite einbetten.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Was mir die Laborübungen gezeigt haben</span>
  </summary>
  <div class="spoiler__body">
    <p>Der Garbage Collector in Oberon ist sehr faul. Er läuft nur, wenn der Benutzer zwanzig Aktionen geschafft hat oder der Speicher fast erschöpft ist, sodass ein paar hundert Kilobyte Müll unbegrenzt herumliegen können. Und er arbeitet nur zwischen Instruktionen, weil er den Stack nicht durchsuchen kann und alle lebenden Objekte ausschließlich über die globalen Variablen der Module findet.</p>
<p>Das automatische Tippen in einer der Übungen beschädigte stillschweigend das Programm. Wegen eines Fehlers in der Tastentabelle wurde die schließende Klammer nicht getippt, die Datei wurde aber problemlos gespeichert, sodass die Prüfung, die nur auf das Vorhandensein der Datei schaute, nichts bemerkte.</p>
<p>Und der Knopf, der die Maschine auf den Anfang zurücksetzt, funktionierte lange nicht, weil in Wirths Schaltung die Register des Prozessors beim Reset nicht genullt werden. Beim ersten Start nullt Verilator sie, bei einem weiteren bleibt drin, was drin war. Auf einem echten FPGA wäre es genauso, das ist also eine Krücke, die speziell mein Prüfstand braucht.</p>

  </div>
</details>

<p>Eine eigene Blamage dieses Abschnitts ist, dass das Labor auf der Website eine Zeit lang tot war. Die Übungsliste war leer, und auf dem Bildschirm drehte sich ein ewiger Spinner. Zuerst fand und behob ich einen Fehler im Code der Seite, aber das half nicht. Die eigentliche Ursache war, dass in der Datei der Seite das schließende Tag eines Scripts fehlte. Ich hatte das für harmlos gehalten – der Browser verzeiht das schon – und sogar dem automatischen Check der Website beigebracht, es ebenfalls zu verzeihen. Nach dem HTML-Standard markiert der Browser ein Script jedoch, wenn eine Datei innerhalb eines nicht geschlossenen Scripts endet, als bereits ausgeführt und führt es schlicht nicht aus, ohne Fehler und ohne Warnung. Inzwischen öffnet der automatische Check die Website in einem echten Browser und verlangt, dass die Seite so viele Übungen hat wie die Quellen. Kurz: Ich sage nicht mehr, dass der Browser alles verzeiht.</p>
<h2 id="und-was-kostet-die-prüfung-auf-modernen-prozessoren">Und was kostet die Prüfung auf modernen Prozessoren?</h2>
<p>Schön – auf Wirths Prozessor kostet die Software-Prüfung zwei Takte von elf und die Hardware-Prüfung einen einzigen. Aber Wirths Prozessor ist eine sehr einfache Maschine, die eine Instruktion nach der anderen ausführt und nichts errät. Wie sieht es auf den Prozessoren in unseren Laptops und Servern aus?</p>
<p>Ich nahm dieselbe Array-Schleife und schrieb sie in C und in Rust in drei Varianten. In der ersten gibt es überhaupt keine Prüfung, in der zweiten ist sie so geschrieben, wie die Sprache selbst sie schreibt, und in der dritten ist es dem Compiler verboten, sie wegzuwerfen. Alle drei Varianten ließ ich überall laufen, wo ich hinkam. Gleich vorweg, weil man die Zahlen sonst nicht lesen kann: Die Schleife ist absichtlich so gewählt, dass sie für die Prüfung so günstig wie möglich ist. Das Array ist klein und liegt immer im schnellsten Speicher des Prozessors, und die Prüfung geht immer durch, sodass der Prozessor ihr Ergebnis leicht vorhersagen kann. Obendrein habe ich dem Compiler das Vektorisieren verboten – also mehrere Array-Elemente mit einer Instruktion zu verarbeiten –, obwohl Prüfungen in echtem Code vor allem deshalb teuer sind, weil sie genau dabei im Weg stehen. Ich wollte die Prüfung für sich sehen, ohne alles andere.</p>
<table>
  <thead>
      <tr>
          <th>Prozessor</th>
          <th>Wie stark die Prüfung diese Schleife verlangsamt</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RISC5, Software-Prüfung</td>
          <td>um 22 %</td>
      </tr>
      <tr>
          <td>RISC5, neue Instruktion <code>CHK</code></td>
          <td>um 11 %</td>
      </tr>
      <tr>
          <td>Apple M4</td>
          <td>nicht sichtbar, geht im Rauschen unter</td>
      </tr>
      <tr>
          <td>AMD EPYC</td>
          <td>nicht sichtbar, geht im Rauschen unter</td>
      </tr>
      <tr>
          <td>Server-Arm Neoverse N2</td>
          <td>um 2–6 %</td>
      </tr>
      <tr>
          <td>CHERIoT, Hardware-Prüfung</td>
          <td>keine einzige zusätzliche Instruktion</td>
      </tr>
  </tbody>
</table>
<p>Erstens hat sich die Prüfung selbst in vierzig Jahren überhaupt nicht verändert – überall ist es derselbe Vergleich mit bedingtem Sprung wie auf Wirths Maschine. Zweitens kostete die Prüfung, so wie die Sprache sie schreibt, nirgends irgendetwas, denn moderne C- und Rust-Compiler fanden selbst heraus, dass der Index in dieser Schleife nie die Grenzen überschreitet, und warfen die Prüfung weg. Wirths Compiler kann das nicht; er lässt die Prüfung immer drin.</p>
<p>Und warum ist die Prüfung auf AMD und Apple unsichtbar, auf dem Server-Arm aber sichtbar? Das halte ich für das interessanteste Ergebnis der ersten Projekthälfte. Ein moderner Prozessor führt mehrere Instruktionen pro Takt aus und ordnet sie selbst um, damit alle seine Ausführungseinheiten beschäftigt sind. Hat ein Programm wenig Arbeit, fallen die zusätzlichen Prüfinstruktionen einfach in die freien Slots und kosten nichts, wie ein Fahrgast, der in einen halb leeren Bus steigt und niemanden bedrängt. Ich habe das überprüft, indem ich der Schleife schrittweise Arbeit und Prüfungen hinzufügte und beobachtete, ab wann die Prüfungen Zeit kosten. Auf AMD kosten eine oder zwei Prüfungen tatsächlich nichts, ab der vierten fangen sie an zu kosten. Auf dem Server-Arm fügt jede Prüfung von Anfang an ein wenig Zeit hinzu, weil dieser Kern weniger freie Slots hat. Wirths Prozessor hat überhaupt keine freien Slots – er führt eine Instruktion nach der anderen aus, und jede Prüfinstruktion ist ein Takt, der immer bezahlt wird.</p>
<h2 id="was-cheri-macht">Was CHERI macht</h2>
<p>CHERI ist eine Architektur, in der ein Zeiger seine eigenen Grenzen kennt – er speichert also neben der Adresse, wo der Speicherbereich beginnt und endet, auf den er zugreifen darf, und der Prozessor prüft diese Grenzen bei jedem Speicherzugriff selbst. Ein solcher Zeiger ist doppelt so breit wie eine gewöhnliche Adresse, und ein Programm kann ihn nicht fälschen. Ich wollte CHERI auf dieselbe Leiter stellen, und zwar nicht auf einem großen, komplexen Prozessor, auf dem eine zusätzliche Instruktion alles Mögliche kosten kann, sondern auf dem nächsten Verwandten von Wirths Prozessor. Ich nahm CHERIoT-Ibex, einen einfachen 32-Bit-Kern, der ebenfalls Instruktionen eine nach der anderen ausführt und keinen Cache hat, und ließ dieselbe Schleife auf seiner Schaltung laufen.</p>
<p>Das Ergebnis war sehr aufschlussreich. Auf CHERI kostet die Prüfung in der Schleife keine einzige Instruktion, weil sie in den Speicherzugriff selbst eingebaut ist. Die Schleife mit Schutz ist exakt so lang wie die Schleife ohne. Um sicherzugehen, dass der Schutz wirklich greift, habe ich die Grenzen des Zeigers auf 32 Elemente verengt, und das Programm stürzte genau beim 33. ab. Eine Variante ohne Prüfung gibt es auf CHERI nicht und wird es nie geben, weil es schlicht nichts gibt, womit man sie abschalten könnte. Die veröffentlichten Arbeiten bestätigen das. Auf CHERI ist die Prüfung selbst nahezu kostenlos, bezahlt wird die Zeigerbreite, denn breite Zeiger belegen doppelt so viel Platz im Speicher und im Cache.</p>
<p>So entstand eine Leiter. Auf Wirths Prozessor kostet die Software-Prüfung zwei Instruktionen und zwei Takte, die neue Instruktion <code>CHK</code> eine Instruktion und einen Takt, und CHERI null Instruktionen. Die breiten modernen Prozessoren stehen abseits: Sie haben genauso viele Instruktionen wie Wirths, aber solange der Kern freie Slots hat, kosten diese Instruktionen fast nichts. Und zwischen <code>CHK</code> und CHERI klaffte auf dieser Leiter lange eine Lücke – die ich erst ganz am Ende dieser neun Tage geschlossen habe.</p>
<h2 id="wirths-maschine-in-qemu">Wirths Maschine in QEMU</h2>
<p>Der Browser ist wunderbar, aber ich wollte, dass Wirths Maschine dort lebt, wo gewöhnliche virtuelle Maschinen leben, mit eigener Konsole, Festplatten, Neustarts und allem, was zu einem richtigen Hypervisor gehört. Fast jede VM unter Linux wird auf die eine oder andere Weise von QEMU gestartet, einem Programm, das Computer der unterschiedlichsten Architekturen nachahmen kann. Wirths Prozessor ist natürlich nicht darunter, er musste also von Grund auf geschrieben werden – QEMU musste lernen, sämtliche Instruktionen von RISC5 und seine eigenwillige Gleitkommaarithmetik zu verstehen, und dann musste um den Prozessor herum ein Board zusammengebaut werden, mit Speicher, Festplatte, Tastatur, Maus und Bildschirm.</p>
<p>Wir hatten hier einen Vorteil, den fast niemand hat, der eine neue Architektur für QEMU schreibt. Normalerweise wird die Korrektheit einer solchen Arbeit gegen Dokumentation und Testsuiten geprüft, wir dagegen hatten die Schaltung des Prozessors selbst und einen Referenzemulator, der bereits über fünfzehn Millionen Instruktionen gegen sie geprüft war. Also prüften wir QEMU nicht gegen Papier, sondern gegen die Schaltung, Instruktion für Instruktion, mit derselben Lockstep-Technik. Über anderthalb Millionen Instruktionen des Bootvorgangs fand sich keine Abweichung, das Bild auf dem Bildschirm stimmte bis auf den letzten Punkt mit der Schaltung überein, und die Modulliste, die sich nach einem Klick auf <code>System.ShowModules</code> öffnet, war exakt dieselbe, mit denselben Adressen im Speicher. Die Zahl der dunklen Punkte auf dem Bildschirm nach dem Booten – 18.607 – wurde von da an meine Referenz, und wo auch immer die Maschine lief, verglich ich den Bildschirm damit.</p>
<figure><img src="qemu-oberon-showmodules.png" alt="Ein Mittelklick auf System.ShowModules in QEMU" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Ein Mittelklick auf System.ShowModules in QEMU. Dieselben Module an denselben Adressen wie auf Wirths Schaltung.</p></figcaption>
</figure>

<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Eine Regel, die in keiner Beschreibung des Prozessors steht</span>
  </summary>
  <div class="spoiler__body">
    <p>Die erste Abweichung im Lockstep-Vergleich trat sehr früh auf, bei der zweihundertvierundzwanzigsten Instruktion, und der Bootloader war noch nicht einmal bis zu seinem ersten Festplattenzugriff gekommen. Wirths Prozessor, so stellte sich heraus, aktualisiert die Flags, die anzeigen, ob ein Ergebnis negativ und ob es null ist, bei jedem Schreiben in ein Register, auch wenn er bloß eine Zahl aus dem Speicher lädt. In der Beschreibung des Prozessors steht das nicht, in der Schaltung aber schon, und Wirths Bootloader verlässt sich darauf: Direkt nach dem Laden einer Zahl aus dem Speicher prüft er, ob sie null ist, ohne einen eigenen Vergleich durchzuführen. Wegen solcher Dinge prüft man gegen die Schaltung und nicht gegen die Dokumentation.</p>
<p>Die Gleitkommaarithmetik habe ich ebenfalls selbst umgesetzt, statt die fertige Version aus QEMU zu nehmen, denn Wirths Arithmetik ist nicht standardkonform. Sie rundet anders, behandelt sehr kleine Zahlen anders und so weiter, und eine Standardimplementierung würde plausible, aber andere Ergebnisse liefern. Der erste Vergleich zeigte ein paar Dutzend Abweichungen, und ich war schon dabei, meinen Code zu korrigieren, als sich der Vergleich selbst als falsch herausstellte – die Arithmetik hatte auf Anhieb gestimmt. Hätte ich ihm vertraut, hätte ich funktionierenden Code kaputt gemacht.</p>

  </div>
</details>

<p>Bauen und starten lässt sich das so (ausführlich im <a href="https://github.com/tym83/paleocomputing/blob/main/qemu/GUIDE.md">QEMU-Leitfaden</a>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git clone https://github.com/tym83/paleocomputing <span class="o">&amp;&amp;</span> <span class="nb">cd</span> paleocomputing
</span></span><span class="line"><span class="cl">make -C qemu build        <span class="c1"># builds QEMU in a Docker container</span>
</span></span><span class="line"><span class="cl">docker create --name oberon-payload ghcr.io/tym83/paleocomputing/oberon-run:v0.1.17
</span></span><span class="line"><span class="cl">docker cp oberon-payload:/opt/oberon/payload/prom.bin .
</span></span><span class="line"><span class="cl">docker cp oberon-payload:/opt/oberon/payload/oberon.dsk .
</span></span><span class="line"><span class="cl">docker rm oberon-payload
</span></span><span class="line"><span class="cl">.qemu-work/build/qemu-system-risc5 -machine oberon -bios prom.bin <span class="se">\
</span></span></span><span class="line"><span class="cl">  -drive <span class="k">if</span><span class="o">=</span>none,id<span class="o">=</span>sd0,file<span class="o">=</span>oberon.dsk,format<span class="o">=</span>raw -vnc :0
</span></span></code></pre></div><p>Der erste Befehl baut QEMU mit unserem Prozessor, die nächsten drei holen den Bootloader und die Systemfestplatte aus einem fertigen Image, und der letzte startet die Maschine. Den Bildschirm sehen Sie mit jedem VNC-Client unter <code>127.0.0.1:5900</code>, und wenn Sie <code>chk=on</code> an <code>-machine oberon</code> anhängen, bekommen Sie den Prozessor mit der Hardware-Prüfung. Das Booten ohne Hardwarebeschleunigung dauert bis zu einer Minute, erschrecken Sie also nicht, wenn Sie zunächst nur den Bildschirm des Bootloaders sehen.</p>
<p>Warum das ein eigener Build ist und kein Patch für das Mainline-QEMU, sollte ich ebenfalls erklären. Die Projekte QEMU und libvirt nehmen keinen Code an, an dessen Entstehung ein Sprachmodell beteiligt war – selbst wenn das nur vermutet wird. Ich habe ein öffentliches Repository, in dem ehrlich steht, wie es entstanden ist, upstream kann das also nur gehen, wenn jemand den Code von Hand neu schreibt. Die GPL erlaubt einen eigenen Build ausdrücklich, und der schwierigste Teil der Arbeit – eine exakte Beschreibung des Prozessorverhaltens und eine Möglichkeit, jede Implementierung davon zu prüfen – bleibt ohnehin nützlich. Ein weiteres Ärgernis: Unser Prozessor ist gegen die allerneueste Entwicklungsversion von QEMU geschrieben, bereits veröffentlichte Versionen bauen ihn also nicht.</p>
<h2 id="libvirt-das-einem-nicht-aufs-wort-glaubt">libvirt, das einem nicht aufs Wort glaubt</h2>
<p>Die nächste Schicht ist libvirt. Das ist die Bibliothek, über die fast alles, was unter Linux VMs verwaltet, mit QEMU spricht, vom Kommandozeilenwerkzeug virsh bis zu KubeVirt, um das es gleich geht. Die Frage war, ob sich eine neue Architektur ganz ohne Änderungen anbinden lässt. Es ging nicht – aber nicht aus dem Grund, den ich erwartet hatte.</p>
<p>Zuerst trug ich einfach die Architektur <code>risc5</code> in die Maschinenbeschreibung ein, und libvirt lehnte sofort ab mit dem Hinweis, eine solche Architektur kenne es nicht. Also wurde ich schlau, gab mich als eine Architektur aus, die es kannte, und schob ihm mein eigenes Programm unter. libvirt lehnte wieder ab, diesmal aber tiefer. Es traut nicht dem, was in der Maschinenbeschreibung steht, sondern fragt QEMU selbst, was es nachahmen kann, QEMU nennt sich ehrlich risc5, und diesen Namen gibt es in der Liste von libvirt nicht. Es über die Maschinenbeschreibung zu täuschen, ist unmöglich.</p>
<p>An einer Änderung an libvirt führt also kein Weg vorbei, und die Änderung war winzig – etwa zehn Zeilen an fünf Stellen. Ich habe es so gebaut, dass die Liste der Architekturen aus einer separaten Datei gelesen wird und die nächste alte Maschine eine neue Zeile in dieser Datei ist statt neuen Codes. Der Build prüft jede Änderung einzeln, denn eine Änderung, die sich stillschweigend nicht anwenden ließ, ist schlimmer als gar keine: libvirt würde ohne Fehler bauen, die Architektur aber nicht kennen. Das zahlte sich sofort aus, als in einer neuen Version von libvirt das betreffende Stück Code in eine andere Datei wanderte und der Build das laut verkündete, statt stillschweigend eine kaputte Bibliothek zu bauen.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie libvirt an einer ehrlichen Antwort abstürzte</span>
  </summary>
  <div class="spoiler__body">
    Nach der Änderung erkannte libvirt die Architektur, stürzte aber bei seiner allerersten Anfrage an unser QEMU mit einer Nullzeiger-Dereferenzierung ab. Es fragt den Emulator nach einer Liste der unterstützten CPU-Modelle, und unser QEMU antwortete ehrlich, es habe keine Modelle, weil Wirths Maschine genau einen Prozessor hat. Auf eine solche Antwort ist libvirt schlicht nicht ausgelegt. Eine Möglichkeit war, libvirt beizubringen, eine solche Absage zu überleben, was in der Sache richtiger ist; eine andere, in QEMU ein einziges, einsames CPU-Modell zu deklarieren. Ich entschied mich für Letzteres, weil es weniger Änderungen an fremdem Code bedeutet.
  </div>
</details>

<p>Und gleich hier eine schöne Geschichte darüber, warum man seinen Augen nicht trauen darf. Der erste Screenshot unter libvirt sah völlig korrekt aus, aber ein byteweiser Vergleich mit der Referenz fand mehrere tausend Unterschiede. Ich verdächtigte nacheinander die Maus, den Zeitpunkt des Screenshots und libvirt selbst – dabei hatte ich schlicht die Adresse des Videospeichers falsch von hexadezimal nach dezimal umgerechnet und um 512 Byte danebengelegen. Das sind genau vier Bildschirmzeilen, und der Unterschied ist mit bloßem Auge völlig unsichtbar. Nach der Korrektur stimmte der Bildschirm Byte für Byte mit der Referenz überein.</p>
<figure><img src="libvirt-oberon-screen.png" alt="Oberon unter libvirt" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Oberon unter libvirt. Es sieht genau so aus wie mit der Verschiebung um 512 Byte, weshalb ich meinen Augen nicht mehr traue.</p></figcaption>
</figure>

<h2 id="kubevirt-ohne-fork">KubeVirt ohne Fork</h2>
<p>Eine Schicht darüber sitzt KubeVirt. Es erlaubt, virtuelle Maschinen in Kubernetes genauso zu betreiben wie gewöhnliche Container und sie mit denselben Werkzeugen zu verwalten. Im Inneren hat jede solche VM einen Verwaltungs-Pod, und dort leben libvirt und QEMU. Ich musste eine Maschine mit einer völlig anderen Architektur dort hineinschmuggeln, und zwar ohne eine eigene Kopie von KubeVirt oder Cozystack anzulegen. Eine private Kopie eines großen Projekts bleibt für immer an einem hängen, und man muss sie bei jedem Update von Hand mitschleppen, deshalb wollte ich das unbedingt vermeiden.</p>
<p>Zu Hilfe kam ein Standard-Erweiterungspunkt, den nur wenige kennen. Bevor KubeVirt eine VM startet, kann es ihre Beschreibung an einen externen Handler übergeben und dann ausführen, was der Handler zurückliefert. Der Handler kann ein gewöhnliches Skript sein, das in der Kubernetes-Konfiguration liegt, man muss dafür also nicht einmal ein eigenes Image bauen. Unser Handler bekommt die Beschreibung einer ganz gewöhnlichen VM – mit Intel-Prozessor, Festplatten und Netzwerk – und formt sie zu Wirths Maschine um. Er ändert die Architektur, schaltet die Hardwarebeschleunigung ab (die es für eine fremde Architektur ohnehin nicht gibt), setzt unseren Emulator, Bootloader und unser Disk-Image ein und wirft alles hinaus, was Wirths Maschine nicht hat – also fast alles, was KubeVirt standardmäßig hinzufügt.</p>
<p>Den Emulator selbst und das gepatchte libvirt muss man allerdings in das Verwaltungs-Image legen, aus dem KubeVirt alle seine VMs startet. Alles andere erledigen KubeVirt und Cozystack selbst. Für Wirths Maschine braucht der Cluster also genau zwei Dinge, die ein gewöhnlicher Benutzer nicht tun kann: externe Handler erlauben und unser Verwaltungs-Image installieren. Der Administrator stimmt dem einmal zu, und danach installiert jeder Benutzer die Maschine aus dem Katalog, ungefähr so, wie man ein Treiberpaket installiert.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Die Absagen, die erst auf echtem KubeVirt auftauchen</span>
  </summary>
  <div class="spoiler__body">
    <p>Zuerst schickte ich die Beschreibung, die KubeVirt einer gewöhnlichen VM gibt, durch den Handler und fütterte libvirt auf meinem eigenen Schreibtisch mit dem Ergebnis. Alles startete, der Bildschirm stimmte mit der Referenz überein, und ich hielt die Sache für erledigt. Auf echtem KubeVirt in unserem Cozystack startete die Maschine nicht, und es gab vier Absagen, von denen keine einzige auf dem Schreibtisch aufgetaucht war.</p>
<p>Zuerst lehnte QEMU ab, weil KubeVirt verlangt, dass die Maschine Energieverwaltung unterstützt, die Wirths Maschine nicht hat. Dann lehnte es ab, weil KubeVirt verlangt, Prozessoren im laufenden Betrieb hinzufügen zu dürfen, Wirths Maschine aber einen Prozessor hat und nie mehr. Die dritte Absage war die lustigste. Ich entfernte den Abschnitt mit den Systeminformationen aus der Beschreibung, und nun fiel KubeVirt selbst um, weil es diesen Abschnitt nach dem Start liest. Ich setzte den Abschnitt wieder ein, und QEMU lehnte erneut ab, weil es solche Informationen für diese Architektur nicht unterstützt. Am Ende musste der Abschnitt bleiben, und eine kleine Einstellung musste weg – die, die libvirt veranlasst, ihn an QEMU weiterzugeben. Seitdem entferne ich genau das, was abgelehnt wird, und keine Zeile mehr, denn wer mit dem großen Besen kehrt, macht kaputt, was funktioniert hat. Und die vierte Absage kam, als ich KubeVirt aktualisierte, während unser Verwaltungs-Image noch für die vorherige Version gebaut war. Inzwischen wird das Image für jede unterstützte KubeVirt-Version separat gebaut.</p>

  </div>
</details>

<p>Mit dem Verwaltungs-Image gab es noch eine stille Falle. Wir nehmen das Standard-Image von KubeVirt und ersetzen darin nur libvirt, und die Version unseres libvirt muss exakt der entsprechen, die bereits im Image steckt. Liegt man daneben, baut das Image ohne einen einzigen Fehler, aber unsere Bibliothek landet neben der Standardbibliothek statt an ihrer Stelle, und ausgeführt wird die Standardbibliothek. Deshalb prüft der Build inzwischen, dass im Image genau ein libvirt steckt, und die Zuordnung zwischen KubeVirt- und libvirt-Versionen ist in einer einzigen Datei festgehalten und lässt sich nicht von Hand setzen.</p>
<h2 id="sechzehn-sekunden-bis-zur-clusterweiten-migration">Sechzehn Sekunden bis zur clusterweiten Migration</h2>
<p>Das ist wahrscheinlich die lehrreichste Geschichte des Projekts, und sie handelt von meiner eigenen Unaufmerksamkeit; der Code hat damit nichts zu tun.</p>
<p>Das Verwaltungs-Image, aus dem KubeVirt VMs startet, wird für den gesamten Cluster auf einmal festgelegt. Um es auszutauschen, änderte ich die KubeVirt-Konfiguration direkt im laufenden Cluster – unserem Arbeitsstand, auf dem unter anderem die VMs anderer Leute liefen. Sechzehn Sekunden später begann KubeVirt, sämtliche virtuellen Maschinen im Cluster auf das neue Image zu migrieren, ohne sie anzuhalten. Die Sache ist die: In Cozystack sind automatische Updates laufender Maschinen standardmäßig eingeschaltet, und KubeVirt tat genau, was man ihm gesagt hatte – da sich das Verwaltungs-Image geändert hatte, mussten alle Maschinen auf das neue umziehen. Im Laufe von fünf Stunden versuchte es mehr als hundertmal, Maschinen zu migrieren, und mehr als die Hälfte der Versuche scheiterte. Nichts stürzte ab und keine Daten gingen verloren, und die erfolgreichen Migrationen zeigten nebenbei, dass unser Image Maschinen migrieren kann – aber ein schönes Bild war das nicht. So habe ich es gestoppt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">kubectl -n cozy-kubevirt patch kubevirt kubevirt --type<span class="o">=</span>merge <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p <span class="s1">&#39;{&#34;spec&#34;:{&#34;workloadUpdateStrategy&#34;:{&#34;workloadUpdateMethods&#34;:[]}}}&#39;</span>
</span></span></code></pre></div><p>Dieser Befehl schaltet automatische Updates der Maschinen ab, ist aber eine Notbremse und keine Lösung. Er bricht bereits laufende Migrationen nicht ab, die Einstellung kommt beim nächsten Cozystack-Update zurück, und ganz ohne automatische Updates auszukommen, ist ebenfalls schlecht, denn nach einem KubeVirt-Update blieben die Maschinen auf dem alten Verwaltungs-Image. Am ärgerlichsten an dieser Geschichte ist, dass ich wusste, wo ich hätte nachsehen müssen. Ich habe nur geprüft, dass das neue Image existiert, und nicht daran gedacht zu prüfen, was es mit dem Cluster anstellen würde.</p>
<p>Warum die Hälfte der Migrationen scheiterte, wurde aus den Logs klar, und mit dem Image hatte das nichts zu tun. Standardmäßig migriert KubeVirt nicht mehr als zwei Maschinen gleichzeitig von einem Server weg; die übrigen warten, bis sie an der Reihe sind, und kommen oft gar nicht dran. Auch Quotas standen im Weg. Während einer Migration existiert eine Maschine gleichzeitig in zwei Kopien und belegt doppelt so viel Speicher, eine Maschine, die das gesamte Quota ihres Benutzers aufgebraucht hat, wird also nie live migriert. Das Quota braucht Spielraum, mindestens so viel wie die größte Maschine.</p>
<h2 id="ein-katalog-für-cozystack">Ein Katalog für Cozystack</h2>
<p>Cozystack ist eine offene Plattform, aus der man auf Basis von Kubernetes seine eigene Cloud zusammenbaut. Wir bei Ænix entwickeln sie gemeinsam mit der Community, und sie gehört zur CNCF, der Foundation, in der auch Kubernetes selbst zu Hause ist. Die Plattform hat eine Weboberfläche, Benutzer – hier Tenants genannt (so etwas wie getrennte Konten in einer Cloud) –, virtuelle Maschinen und einen Anwendungskatalog mit Datenbanken, Kubernetes-Clustern, Caches und so weiter. Und vor Kurzem ist in der Community ein Mechanismus für einsteckbare Kataloge entstanden. Jeder kann seinen eigenen Satz Anwendungen veröffentlichen und in seine Plattform einbinden, und dann erscheinen diese Anwendungen für die Benutzer neben den eingebauten. Für Paleocomputing habe ich genau einen solchen Katalog gebaut und dabei nichts erfunden, was es in der Plattform nicht schon gibt.</p>
<p>Der Katalog ist in vier Teile gegliedert, weil man ihnen unterschiedlich weit vertrauen muss. Der erste enthält die Maschinen und Umgebungen für die Benutzer – die echte VM mit Wirths Prozessor, das Browser-Labor, das Handbuch und ein Bundle, das alles auf einmal installiert. Der zweite enthält die Oberon-Sprachumgebung, in der man Oberon-Programme als gewöhnliche Jobs im Cluster ausführen kann. Der dritte legt Boot-Images in den gemeinsamen Speicher der Plattform, und der vierte tauscht jenes Verwaltungs-Image von KubeVirt aus. Diese beiden letzten betreffen den gesamten Cluster und werden deshalb nur mit ausdrücklicher Zustimmung des Administrators installiert.</p>
<p>Eingebunden wird der Katalog so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">cozypkg tap oci://ghcr.io/tym83/paleocomputing/machines:v0.1.17
</span></span><span class="line"><span class="cl">cozypkg tap oci://ghcr.io/tym83/paleocomputing/languages:v0.1.17
</span></span><span class="line"><span class="cl">cozypkg add paleocomputing.machines
</span></span><span class="line"><span class="cl">cozypkg add paleocomputing.languages
</span></span><span class="line"><span class="cl"><span class="c1"># what touches the whole cluster is installed only with the administrator&#39;s explicit consent</span>
</span></span><span class="line"><span class="cl">cozypkg tap oci://ghcr.io/tym83/paleocomputing/images:v0.1.17
</span></span><span class="line"><span class="cl">cozypkg tap oci://ghcr.io/tym83/paleocomputing/platform:v0.1.17
</span></span><span class="line"><span class="cl">cozypkg add paleocomputing.platform --allow-privileged
</span></span></code></pre></div><p>Der Befehl <code>tap</code> bindet den Katalog nur in die Plattform ein; <code>add</code> installiert seinen Inhalt. Dieser Unterschied hat auch mich einmal verwirrt, und anfangs stand er überhaupt nicht in der Dokumentation.</p>
<p>Bevor Sie den letzten Teil installieren, schauen Sie sich unbedingt die Einstellung für automatische Maschinen-Updates in KubeVirt an. Mit den Standardeinstellungen von Cozystack schickt eine Änderung des Verwaltungs-Images jede VM im Cluster auf Migration, und zwar bei der Installation, bei der Deinstallation und bei jedem KubeVirt-Update. Genau das ist mir passiert. Dieses Loch hat einer der Reviewer beim Prüfen genau dieses Artikels gefunden; ist das automatische Update eingeschaltet, ändert die Komponente deshalb jetzt nichts und wartet, bis der Administrator die Migration ausdrücklich erlaubt. Erlauben lässt sie sich mit der Einstellung <code>allowWorkloadUpdate: true</code> bei der Installation oder mit der Annotation <code>paleocomputing.io/allow-workload-update=true</code> an der KubeVirt-Ressource. Und noch etwas. Das Werkzeug zum Einbinden von Katalogen prüft die digitale Signatur bisher nicht; wenn Sie das also irgendwo installieren, wo es ernster zugeht als auf einem Heim-Prüfstand, prüfen Sie die Signatur selbst – wie, steht in der Anleitung.</p>
<p>Nach dem Einbinden erscheint in den Katalogen der Benutzer ein eigener Bereich Paleocomputing. Allerdings gibt es einen Haken, auf den ich beim Anfertigen der Screenshots für diesen Artikel gestoßen bin. Die aktuelle Weboberfläche von Cozystack zeigt in ihrer Seitenleiste nur drei Bereiche – die, die fest in ihren Code eingebaut sind – und versteckt alle übrigen ganz am Ende der vollständigen Anwendungsliste. Zuerst fand auch ich meinen eigenen Bereich nicht. Dabei ist der ganze Sinn eines einsteckbaren Katalogs, eigene Bereiche mitzubringen, statt sich in fremden aufzulösen. Wir werden das also in Cozystack selbst beheben, und die Oberfläche wird alle Bereiche anzeigen müssen, die ein Katalog mitbringt.</p>
<figure><img src="cozystack-catalog.jpg" alt="Der Bereich Paleocomputing in der vollständigen Anwendungsliste" width="1456" height="827" loading="lazy" decoding="async">
  <figcaption><p>Der Bereich Paleocomputing in der vollständigen Anwendungsliste. In der Seitenleiste ist er noch nicht; das beheben wir in Cozystack.</p></figcaption>
</figure>

<p>Installiert wird die Maschine über ein Formular in der Weboberfläche oder mit einer kurzen Beschreibung:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps.cozystack.io/v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">OberonVM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">wirth</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">128Mi</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hardware</span><span class="p">:</span><span class="w"> </span><span class="l">chk    </span><span class="w"> </span><span class="c"># or base, the ordinary Wirth processor</span><span class="w">
</span></span></span></code></pre></div><figure><img src="cozystack-oberonvm-form.jpg" alt="Das OberonVM-Formular: Speicher, Prozessorvariante, Festplattengröße" width="1456" height="827" loading="lazy" decoding="async">
  <figcaption><p>Das OberonVM-Formular: Speicher, Prozessorvariante und Festplattengröße. Das ist die ganze Maschine.</p></figcaption>
</figure>

<figure><img src="cozystack-oberonvm-card.jpg" alt="Die laufende Maschine in der Oberfläche, mit Status und dem, was darunter läuft" width="1456" height="827" loading="lazy" decoding="async">
  <figcaption><p>Die fertige Maschine in der Oberfläche, mit ihrem Status und einer Liste dessen, was darunter läuft.</p></figcaption>
</figure>

<p>Einen Bildschirm für die Maschine gibt es in der Weboberfläche noch nicht; in den aktuellen Versionen haben ihn nur gewöhnliche VMs. Ansehen können Sie sie mit dem Werkzeug <code>virtctl</code>, mit den Rechten des Benutzers selbst und einem beliebigen VNC-Client:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">virtctl -n tenant-sandbox vnc oberon-vm-oberon-vm-habr
</span></span></code></pre></div><figure><img src="cozystack-habr-vnc.png" alt="Wirths Maschine in der Cloud, aufgenommen mit den Rechten eines gewöhnlichen Benutzers" width="1024" height="768" loading="lazy" decoding="async">
  <figcaption><p>Wirths Maschine in der Cloud, aufgenommen mit den Rechten eines gewöhnlichen Benutzers. Genau dieselben 18.607 dunklen Punkte.</p></figcaption>
</figure>

<p>Das Ganze ist so angelegt, dass die nächste alte Maschine keinen neuen Code erfordert. Alles, was Wirths Maschine von den anderen unterscheidet, steht in einer kleinen Datei, die ich den Pass der Maschine nenne: Architektur, Emulator, Bootloader, Festplatte, Prozessorvarianten und Speichergrenzen. Alles andere ist gemeinsam, und der Handler für KubeVirt ist für alle Maschinen ein und derselbe – er liest einfach den Pass. Die nächste Maschine, etwa Lilith, ist ein neuer Pass und keine Kopie des Codes. Um zu beweisen, dass das kein leeres Gerede ist, enthalten die Tests eine zweite, fiktive Maschine mit anderer Architektur, und sie baut ohne eine einzige Änderung am Code.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie der Pass einer Maschine aussieht</span>
  </summary>
  <div class="spoiler__body">
    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Machine</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">oberon</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/tym83/paleocomputing/oberon-run:v0.1.17</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">domain</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">arch</span><span class="p">:</span><span class="w"> </span><span class="l">risc5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">machine</span><span class="p">:</span><span class="w"> </span><span class="l">oberon</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">emulator</span><span class="p">:</span><span class="w"> </span><span class="l">/usr/local/bin/qemu-system-risc5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">vcpus</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">graphics</span><span class="p">:</span><span class="w"> </span><span class="l">vnc</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">terminationGracePeriodSeconds</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">payload</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/payload</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- {<span class="nt">name: prom.bin,   role: firmware, qemu</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;-bios&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;{path}&#34;</span><span class="p">]</span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- {<span class="nt">name: oberon.dsk, role: disk,     qemu</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;-drive&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;if=none,id=sd0,file={path},format=raw&#34;</span><span class="p">]</span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">variants</span><span class="p">:</span><span class="w"> </span>{<span class="nt">base</span><span class="p">:</span><span class="w"> </span>{<span class="nt">}, chk</span><span class="p">:</span><span class="w"> </span>{<span class="nt">chk</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;on&#34;</span>}}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">memory</span><span class="p">:</span><span class="w"> </span>{<span class="nt">default: 128Mi, min: 128Mi, max</span><span class="p">:</span><span class="w"> </span><span class="l">1Gi}</span><span class="w">
</span></span></span></code></pre></div><p>Die Zeit für ein ordentliches Herunterfahren ist hier auf null gesetzt, weil Wirths Maschine eine Aufforderung zum Herunterfahren nicht hören kann und KubeVirt bei jedem Neustart vergeblich eine halbe Minute darauf warten würde. Der Bootloader wird bei jedem Katalog-Update durch einen neuen ersetzt, die Festplatte dagegen wird einmal angelegt und gehört danach dem Benutzer, sodass ihre Dateien Updates überstehen.</p>
  </div>
</details>

<h2 id="alles-grün-und-nichts-funktioniert">Alles grün, und nichts funktioniert</h2>
<p>Während ich mit dem Cluster hantierte, tauchte dieselbe Falle an einem Abend sechsmal auf, und ich legte eine Notiz mit genau diesem Titel an. Jedes Mal meldete ein Check Erfolg, während in Wirklichkeit nichts funktionierte. Der Katalog ist gebaut, aber die Hauptdatei steckt nicht darin. Die Installation war erfolgreich, aber die Maschine läuft nicht. Der Server antwortet, alles sei in Ordnung, aber das Image enthält die Maschine selbst nicht. Der Build ist grün, aber die Datei, die kopiert wird, existiert nicht. Dann gab es noch ein siebtes Mal – eben jene sechzehn Sekunden.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Was sich erst auf einem lebenden Cluster zeigt</span>
  </summary>
  <div class="spoiler__body">
    <p>Das Image des Browser-Labors wurde lange ohne die Maschine selbst veröffentlicht. Die Seite war da, Prozessor und Festplatte nicht, und der Check gab sich damit zufrieden, dass die Seite ausgeliefert wurde. Nebenbei entdeckte ich, dass wegen einer einzigen Zeile in der Liste ignorierter Dateien und der Tatsache, dass das Dateisystem des Mac nicht zwischen Groß- und Kleinschreibung unterscheidet, eine komplette Sprachbibliothek mit einundvierzig Dateien es nie ins Repository geschafft hatte.</p>
<p>Die Maschine mit dem Prozessor mit Hardware-Prüfung startete, lief aber tatsächlich auf dem gewöhnlichen. Das Paket für Cozystack enthielt, wie sich herausstellte, eine eigene Kopie des Handlers, und ich hatte eine andere bearbeitet. Inzwischen vergleicht der automatische Check die Kopien.</p>
<p>Der Bildschirm der Maschine in Kubernetes war anfangs leer, weil der Handler die Bildausgabe zusammen mit allem anderen Überflüssigen hinausgeworfen hatte. Als ich sie zurückholte, startete QEMU nicht mehr, weil die Tastaturbelegungen nicht ins Image gelegt worden waren.</p>
<p>Eine Verwaltungsaufgabe hing ganz ohne Fehler. In Cozystack dürfen nur Pods mit einem speziellen Label den Kubernetes-Control-Plane-Server erreichen, und den übrigen antwortet die Netzwerkschicht stillschweigend nicht. Wären es fehlende Berechtigungen gewesen, wäre die Absage sofort gekommen, das Hängen selbst war also der Hinweis.</p>
<p>Und bei der digitalen Signatur passte keines meiner Releases zu dem, was der Community-Katalog erwartet, denn der Katalog erwartet eine Signatur aus einem Build vom Hauptzweig, ich aber hatte per Tag veröffentlicht. Gefunden habe ich das beim Lesen der Quellen des Werkzeugs, das, wie ich feststellte, die Signatur überhaupt nicht prüft.</p>

  </div>
</details>

<p>Am Abend des 27. September gab es eine Episode, für die ich mich bis heute ein wenig schäme. Wir bauten gerade um, wie die Maschine im Cluster beschrieben wird, und die Releases kamen in einer Schlange. Das erste blieb an seinen eigenen Checks hängen. Das zweite hing mausetot, weil die Aufgabe, die die Festplatte der Maschine vorbereitet, darauf wartete, dass die Maschine startet, und die Maschine auf die Festplatte wartete. Das dritte fand zwei weitere Bugs. An diesem Punkt riss mir der Geduldsfaden, und ich fragte den Agenten, warum wir ein Release nach dem anderen ausliefern und ob er die Dinge nicht einfach beim ersten Mal ordentlich prüfen könne (im Original war das deutlicher formuliert).</p>
<p>Er konnte, und danach änderte sich der Release-Prozess. Inzwischen wird jede Änderung zuerst als Testversion gebaut, eine separate Sandbox im Cluster wechselt auf sie, und ein Szenario installiert in der Rolle eines gewöhnlichen Benutzers die Maschine, prüft, dass sie auf dem richtigen Prozessor gestartet ist, vergleicht den Bildschirm mit der Referenz, startet sie neu, löscht sie und bestätigt, dass nichts zurückgeblieben ist. Nur wenn all das durchgeht, landet die Änderung im Hauptzweig und wird zum Release. Ein zweites solches Szenario prüft die Komponente, die das Verwaltungs-Image austauscht, und startet zur Sicherheit ein gewöhnliches Ubuntu auf unserem Image, um zu bestätigen, dass wir die Nachbarn nicht kaputt gemacht haben. Das erste Release, das all das vor der Veröffentlichung bestand, war v0.1.14, und die hängengebliebenen Maschinen kamen danach von selbst hoch.</p>
<p>Amüsanterweise hatte das Szenario selbst eigene Bugs, obwohl das System funktionierte. Zum Beispiel wurde der Start von Ubuntu anfangs über ein Hilfsprogramm im Gast geprüft, das es in einem sauberen Ubuntu-Image schlicht nicht gibt, der Check hätte also ewig gewartet. Dann wurde er über den Login-Prompt auf der Konsole geprüft, und eine Konsole ohne echtes Terminal bleibt stumm. Und die Wartefunktion zählte nur die Pausen, nicht die insgesamt vergangene Zeit, sodass aus zwanzig Minuten Warten zwei Stunden wurden. Das Skript wartete sehr geduldig neben einem längst gebooteten Ubuntu.</p>
<h2 id="die-komponente-die-das-verwaltungs-image-überwacht">Die Komponente, die das Verwaltungs-Image überwacht</h2>
<p>Das Verwaltungs-Image von KubeVirt von Hand auszutauschen, ist aus drei Gründen eine schlechte Idee. Es wird von allen VMs des Clusters gemeinsam genutzt, ein Fehler macht also alle kaputt. Es muss zur KubeVirt-Version passen und bleibt nach einem Cozystack-Update alt und macht dann alle Maschinen kaputt. Und meine erste manuelle Methode hat nebenbei mehrere andere KubeVirt-Einstellungen eingefroren, die ich gar nicht anfassen wollte.</p>
<p>Deshalb hat der Katalog eine eigene Komponente, die alle halbe Minute in die KubeVirt-Konfiguration schaut und ihren eigenen Teil in Ordnung bringt. Haben wir ein Image für die aktuelle KubeVirt-Version, installiert sie es. Wenn nicht, entfernt sie ihre Änderung, und der Cluster kehrt zum Standard-Image zurück. Wirths Maschinen starten dann nicht, aber alles andere funktioniert. Sieht irgendetwas fragwürdig aus, entfernt sie ihre Änderung ebenfalls, und konnte sie die Konfiguration nicht lesen, fasst sie nichts an. Ihre Änderung nimmt sie so vor, dass sie, falls KubeVirt jemals die Form seiner Konfiguration ändert, das Image nicht an die falsche Stelle setzt, sondern sich lautstark weigert, angewendet zu werden.</p>
<p>Und auch diese Komponente hat die Sandbox erwischt. Auf dem lebenden Cluster stürzte sie ab, weil sie einem der Werkzeuge Informationen über alle Server des Clusters auf einmal übergab, und auf einem echten Cluster sind diese Informationen riesig. In den Tests waren die Server winzig, und der Testcluster bestand aus einem einzigen, deshalb stürzte dort nichts ab. Inzwischen wird ein Test mit einem Cluster aus dreitausend großen Servern auf dem alten Code rot.</p>
<h2 id="server-mit-intel-und-mit-arm">Server mit Intel und mit Arm</h2>
<p>Als ich anfing, das alles auch für Arm-Server zu bauen, wurde ich gefragt, wozu überhaupt Builds für verschiedene Prozessoren nötig seien, wenn wir die Oberon-Architektur doch schon zu KubeVirt hinzugefügt haben. Eine gute Frage, und die Verwirrung ist natürlich, denn hier gibt es zwei Architekturen. Die eine ist die Architektur von Wirths Maschine, die QEMU nachahmt, und sie hängt nicht vom Server ab. Die andere ist der echte Prozessor des Servers, Intel oder Arm. Der Emulator und libvirt sind gewöhnliche Programme und müssen für jeden Serverprozessor separat gebaut werden. Das ist wie bei einem Emulator für eine Spielkonsole: Die Konsole ist eine, aber die Builds des Emulators für Windows und für Mac sind verschiedene.</p>
<p>Unser Verwaltungs-Image war nur für Intel gebaut. Und da es für jede VM im Cluster das Standard-Image ersetzt, würde auf einem Cluster aus Arm-Servern keine einzige Maschine starten – nicht nur Oberon. Der Arm-Build ging sofort durch, der eigentliche Start auf Arm blieb aber dreimal stecken. Zuerst, weil das Image mit Bootloader und Festplatte nur für Intel existierte. Dann, weil eines der Build-Werkzeuge ebenfalls nur für Intel veröffentlicht wird. Und das dritte Problem war das interessanteste. Auf Arm gibt KubeVirt einer VM immer moderne Firmware mit eigenem Flash-Speicher, und Wirths Maschine hat überhaupt keinen Flash-Speicher, also beendete sich QEMU sofort nach dem Start. Auf Intel sieht man das nicht, weil dort die Standard-Firmware eine andere ist. Keines dieser drei Probleme war im Code oder im gebauten Image zu sehen – nur auf einem lebenden Server mit dem richtigen Prozessor.</p>
<p>Inzwischen funktioniert all das auf zwei KubeVirt-Versionen und auf beiden Prozessortypen, und der Bildschirm stimmt in allen vier Kombinationen mit der Referenz überein. Der Fairness halber sei gesagt, dass ich auf Arm reines KubeVirt in einem Wegwerf-Testcluster getestet habe; Cozystack auf Arm-Servern habe ich noch nicht laufen lassen.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Wie man die Maschine ohne Cozystack auf dem eigenen KubeVirt installiert</span>
  </summary>
  <div class="spoiler__body">
    <p>All das funktioniert auch auf gewöhnlichem KubeVirt, ohne Cozystack, und der automatische Check beweist es bei jeder Änderung. Er fährt einen Wegwerf-Cluster hoch, installiert KubeVirt, tauscht das Verwaltungs-Image aus, startet die Maschine und vergleicht den Bildschirm. Eine ausführliche Anleitung steht in <a href="https://github.com/tym83/paleocomputing/blob/main/kubevirt/GUIDE.md">kubevirt/GUIDE.md</a>; kurz gesagt sind es drei Schritte:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># 1. allow external handlers (on servers without /dev/kvm you also need useEmulation: true)</span>
</span></span><span class="line"><span class="cl">kubectl -n kubevirt get kubevirt kubevirt -o json <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="p">|</span> jq <span class="s1">&#39;.spec.configuration.developerConfiguration.featureGates |= ((. // []) + [&#34;Sidecar&#34;] | unique)&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="p">|</span> kubectl replace -f -
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. install the housekeeping image for your KubeVirt version</span>
</span></span><span class="line"><span class="cl">git clone --depth <span class="m">1</span> -b v0.1.17 https://github.com/tym83/paleocomputing <span class="o">&amp;&amp;</span> <span class="nb">cd</span> paleocomputing
</span></span><span class="line"><span class="cl"><span class="nv">KV</span><span class="o">=</span><span class="k">$(</span>kubectl -n kubevirt get kubevirt kubevirt -o <span class="nv">jsonpath</span><span class="o">=</span><span class="s1">&#39;{.status.observedKubeVirtVersion}&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$KV</span><span class="s2"> ghcr.io/tym83/paleocomputing/virt-launcher:</span><span class="nv">$KV</span><span class="s2">-paleo-v0.1.17&#34;</span> &gt; /tmp/launchers.txt
</span></span><span class="line"><span class="cl">kubectl -n kubevirt create configmap kubevirt-paleo-launcher-status
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">KUBECTL</span><span class="o">=</span>kubectl <span class="nv">KUBEVIRT_NAMESPACE</span><span class="o">=</span>kubevirt <span class="nv">LAUNCHER_TABLE</span><span class="o">=</span>/tmp/launchers.txt
</span></span><span class="line"><span class="cl"><span class="nv">R</span><span class="o">=</span>marketplace/repos/platform/packages/system/kubevirt-paleo-launcher/files/reconcile.sh
</span></span><span class="line"><span class="cl"><span class="k">until</span> sh <span class="nv">$R</span> once <span class="o">&amp;&amp;</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>kubectl -n kubevirt get cm kubevirt-paleo-launcher-status <span class="se">\
</span></span></span><span class="line"><span class="cl">  -o <span class="nv">jsonpath</span><span class="o">=</span><span class="s1">&#39;{.data.state}&#39;</span><span class="k">)</span><span class="s2">&#34;</span> <span class="o">=</span> Applied <span class="o">]</span><span class="p">;</span> <span class="k">do</span> sleep 10<span class="p">;</span> <span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. install the machine with ordinary Helm and open its screen</span>
</span></span><span class="line"><span class="cl">python3 marketplace/tools/pin-images.py --release v0.1.17
</span></span><span class="line"><span class="cl">helm install wirth marketplace/repos/machines/packages/apps/oberon-vm <span class="se">\
</span></span></span><span class="line"><span class="cl">  -n oberon --create-namespace --set <span class="nv">storageClass</span><span class="o">=</span>&lt;your StorageClass&gt;
</span></span><span class="line"><span class="cl">virtctl -n oberon vnc oberon-vm-wirth
</span></span></code></pre></div><p>Bedenken Sie, dass das Erlauben externer Handler im gesamten Cluster wirkt und jeder, der VMs direkt anlegen kann, ihnen seinen eigenen Handler unterschieben kann. Auf einem gemeinsam genutzten Cluster sollte man das abwägen. Und an die automatischen Maschinen-Updates aus der Geschichte oben sollte man auch hier denken.</p>

  </div>
</details>

<h2 id="die-zweite-folge-ein-sprachmodell-auf-wirths-prozessor">Die zweite Folge: ein Sprachmodell auf Wirths Prozessor</h2>
<p>Erinnern Sie sich an die Behauptung aus jenem allerersten Plan, eine neue Instruktion, die in einem Zug multipliziert und addiert, würde die Geschwindigkeit eines neuronalen Netzes auf Wirths Prozessor verdoppeln? Die Reviewer haben sie zerlegt, aber in meiner Liste aufgeschobener Aufgaben blieb danach eine Zeile mit ihren Schätzungen stehen. Die neue Instruktion würde nach ihrer Rechnung ein paar Prozent bringen, ein schneller Multiplizierer mehr als das Anderthalbfache. Das klang nach einem Ergebnis, aber hinter diesen Zahlen standen weder ein Programm noch eine Möglichkeit, sie nachzuvollziehen – nur Arithmetik anhand der Takttabelle. Ich wollte das von Anfang an von Hand überprüfen.</p>
<p>Die Aufgabe lief auf Folgendes hinaus. Ein kleines Sprachmodell sollte im Oberon-System selbst laufen. Ein Programm in Oberon, übersetzt mit dem systemeigenen Compiler, liest die Gewichte des Modells aus einer Datei und gibt Text aus, und all das läuft auf Wirths echter Schaltung, Takt für Takt. Und dann müsste ich herausfinden, wohin die Zeit geht, und beide Schätzungen der Reviewer überprüfen.</p>
<p>Wirths Maschine hat nicht viel Speicher – ein Megabyte für alles, den Bildschirm eingeschlossen –, das Modell fiel also wirklich winzig aus. Es sagt den nächsten Buchstaben aus den vorangegangenen acht vorher und hat etwa dreiundvierzigtausend Parameter. Zum Vergleich: Die Modelle, mit denen wir chatten, haben millionenfach mehr. Und doch belegt selbst ein solches Modell fast die Hälfte des freien Speichers der Maschine. Trainiert habe ich es auf einem gewöhnlichen Laptop in ein paar Dutzend Sekunden, mit dem Text von <em>Alice&rsquo;s Adventures in Wonderland</em>, der längst gemeinfrei ist.</p>
<details class="spoiler spoiler--default">
  <summary class="spoiler__summary">
    <span class="spoiler__icon" aria-hidden="true">▸</span>
    <span class="spoiler__title">Warum kein Transformer und warum keine Ganzzahlen</span>
  </summary>
  <div class="spoiler__body">
    <p>Moderne Modelle sind als Transformer gebaut, und man könnte auch ein solches Modell schreiben, aber es führt im Kern dieselbe Arithmetik aus und verlangt obendrein mehrere hundert zusätzliche Zeilen verwickelter Mathematik auf Wirths nicht standardkonformen Gleitkommazahlen. Für die Frage, was eine Multiplikation kostet, würde das nichts beitragen.</p>
<p>Und das Modell auf Ganzzahlen umzustellen, was die Berechnung auf schwacher Hardware gewöhnlich beschleunigt, würde auf Wirths Prozessor nichts bringen. Auf Wirths Maschine ist die Ganzzahlmultiplikation sogar langsamer als die Gleitkommamultiplikation, Ganzzahlen würden also nur Arbeit hinzufügen. Entschieden hat das die Arithmetik, nicht die Mode.</p>

  </div>
</details>

<p>Das schreibt das Modell, wenn man es mit <code>alice was</code> startet:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">alice was one thought all the tell you spo
</span></span></code></pre></div><p>Shakespeare kann ruhig schlafen. Uns interessiert hier aber nicht die Literatur, sondern die Stoppuhr.</p>
<p>Die Hauptanforderung war, dass der Text, den das Modell auf Wirths Schaltung ausgibt, Byte für Byte mit einer Referenz übereinstimmt, die auf einem gewöhnlichen Computer berechnet wurde. Dafür durfte die Referenz nicht mit den üblichen Python-Mitteln berechnet werden, sondern in exakt derselben Arithmetik wie auf Wirths Prozessor, wobei jede Operation in derselben Reihenfolge wiederholt wird. Andernfalls hätte nichts übereingestimmt. Ich habe gesondert ausgerechnet, wie weit Wirths Arithmetik vom Standard abweicht, und festgestellt, dass sich fast alle Zwischenwerte in den letzten Stellen unterscheiden. Der erzeugte Text wich dabei allerdings kein einziges Mal ab, aber das ist schlichtes Glück. Ein Vergleich gegen gewöhnliches Python hätte fast immer gestimmt und eines Tages unerklärlich danebengelegen – die schlimmste Sorte Bug, weil er sich weder reproduzieren noch erklären lässt.</p>
<p>Der Text stimmte überall überein. Auf dem Emulator, wo dieser Check inzwischen bei jeder Änderung automatisch läuft; auf Wirths Schaltung; auf der Schaltung mit dem schnellen Multiplizierer, zu dem gleich mehr; und im echten System mit Fenstern. Programm und Gewichte werden auf die Festplatte gelegt, zwei Mittelklicks übersetzen erst das Programm und starten dann die Generierung, und der fertige Text wird von der Festplatte gelesen und stimmt mit der Referenz überein. In QEMU ebenso.</p>
<h2 id="wohin-die-zeit-geht">Wohin die Zeit geht</h2>
<p>Auf Wirths Prozessor mit seinem nativen Multiplizierer gibt das Modell etwa neun Buchstaben pro Sekunde aus. Auf einer lebenden Maschine, auf der der Videocontroller etwas Prozessorzeit beansprucht, etwas weniger. Kurz: neun Buchstaben pro Sekunde, mit Glück.</p>
<p>Als ich mir ansah, womit der Prozessor die ganze Zeit beschäftigt war, ergab sich ein sehr klares Bild. Fast vierzig Prozent aller Takte gehen auf Gleitkommamultiplikation, und den größten Teil dieser Zeit wartet er einfach darauf, dass der langsame Multiplizierer fertig zählt. Wirths Multiplizierer arbeitet seriell und berechnet das Produkt mit einem Bit pro Takt, eine einzige Multiplikation dauert also sechsundzwanzig Takte. Ein weiteres Viertel der Zeit geht auf das Lesen aus dem Speicher. Und hier zeigte sich noch etwas Interessantes. Die einfachste Zeile des Programms, in der ein Produkt zu einer Summe addiert wird, macht Wirths Compiler zu siebenundzwanzig Instruktionen, von denen nur vier nützlich sind. Der ganze Rest ist Lesen und Schreiben der Summe im Speicher, der Schleifenzähler und – ja – wieder Bounds- und NIL-Prüfungen. Die Sache ist die: Wirths Compiler kann Variablen nicht in den Registern des Prozessors halten und geht jedes Mal in den Speicher, um sie zu holen. Einer der Reviewer hatte das am ersten Tag aus den Quellen vorhergesagt und die Taktzahl fast genau erraten. Das ist übrigens kein Versehen, sondern bewusste Einfachheit: Wirths gesamter Compiler hat weniger als dreitausend Zeilen und baut sich in Sekunden selbst, und eine komplexe Optimierung passte schlicht nicht in dieses Budget.</p>
<h2 id="der-schnelle-multiplizierer">Der schnelle Multiplizierer</h2>
<p>Da alles auf den Multiplizierer hinausläuft, habe ich einen schnellen geschrieben. Er tut dasselbe wie Wirths, aber nicht ein Bit pro Takt, sondern alles auf einmal, in einem oder zwei Takten – mit Rundung und anderen Feinheiten exakt nach Wirths Vorbild nachgebaut. Eingeschaltet wird er genauso wie die Instruktion <code>CHK</code>, mit einem einzigen Schalter beim Bauen des Prozessors.</p>
<p>Die Hauptanforderung an ihn war so streng wie an alles andere: Die Ergebnisse müssen bis aufs letzte Bit mit Wirths Multiplizierer übereinstimmen. Ich habe zig Millionen Zahlenpaare durchgejagt, einschließlich aller unangenehmen Grenzfälle, und keine einzige Abweichung gefunden. Und um sicherzugehen, dass der Check überhaupt Fehler bemerken kann, habe ich die Rundung an einer Stelle absichtlich verdorben, und er fand Zehntausende Abweichungen.</p>
<p>Mit dem schnellen Multiplizierer lief das Modell 1,6-mal schneller – etwa vierzehn Buchstaben pro Sekunde statt neun. Die Schätzung aus dem Profil hatte genau das vorhergesagt, aber auf einer einfachen Maschine ohne Caches ist das eher eine Bestätigung, dass das Profil richtig berechnet wurde, als eine echte Vorhersage. Selbst wenn die Multiplikation völlig kostenlos würde, ließe sich das Programm nicht um mehr als das 1,64-Fache beschleunigen, weil die übrigen Takte ja nicht verschwinden. Die Zahl der Reviewer hat sich also nicht ganz bewahrheitet, aber in der Hauptsache hatten sie recht: Der Multiplizierer war tatsächlich der Engpass.</p>
<p>Für die gewöhnliche Arbeit des Systems bringt der schnelle Multiplizierer allerdings überhaupt nichts. Der Compiler, der sich selbst baut, führt in vierzig Millionen Instruktionen ganze einunddreißig Gleitkommamultiplikationen aus, und der Systemstart keine einzige. Der langsame Multiplizierer war eine völlig vernünftige Wahl für eine Maschine, auf der man Text schreibt und Programme baut. Das Sprachmodell war die erste Aufgabe, für die er zum Engpass wurde.</p>
<p>Und was ist mit der neuen Instruktion, die multipliziert und addiert, mit der alles angefangen hat? Implementiert habe ich sie nicht; ich habe sie anhand der Zähler abgeschätzt. Auf Wirths gewöhnlichem Multiplizierer würde sie anderthalb bis sechs Prozent bringen, auf dem schnellen bis zu zehn. Der Haupthebel ist hier also nicht die neue Instruktion, sondern ein Compiler, der lernt, die Summe in einem Register zu halten, statt für sie in den Speicher zu laufen. Das habe ich aber nicht mehr gemessen.</p>
<p>In Hardware fiel der schnelle Multiplizierer sogar kleiner aus als der native, weil ein FPGA fertige Hardware-Multiplikationsblöcke hat (seine DSP-Slices) und die ganze Logik für das serielle Zählen einfach wegfiel. Die Ein-Takt-Variante senkt allerdings die Höchstfrequenz des Prozessors spürbar, während die Zwei-Takt-Variante fast genauso schnell ist und die Frequenz nicht berührt. Die nativen 25 MHz halten in beiden Fällen mit großer Reserve, wählen müsste man also nur, wenn jemand Wirths Maschine übertakten wollte.</p>
<h2 id="zwei-funde-am-wegesrand">Zwei Funde am Wegesrand</h2>
<p>Der erste Fund betrifft den Vergleich von Gleitkommazahlen. Wirths Compiler vergleicht sie genauso wie Ganzzahlen, über eine Subtraktion und eine Prüfung der Prozessor-Flags, und bei einigen Vergleichen verwendet er das Overflow-Flag. Nur wird dieses Flag ausschließlich von Ganzzahloperationen verändert. Ist also irgendwo im Programm vor einem Vergleich von Gleitkommazahlen eine Ganzzahl übergelaufen, kann der Vergleich eine falsche Antwort liefern. Ich habe das mit einem sehr einfachen Programm geprüft. Zuerst sagt es ehrlich, dass eins kleiner als zwei ist; dann lässt es eine Ganzzahl überlaufen; und danach meldet es ebenso selbstbewusst, eins sei nicht kleiner als zwei. Das lässt sich sowohl auf dem Emulator als auch auf der Schaltung reproduzieren. Mein Modell hat keine Überläufe, und die Referenz prüft das. Neuheit beanspruche ich hier nicht: Bestimmt hat das schon jemand gesehen; korrigieren Sie mich, wenn Sie wissen, wo.</p>
<p>Der zweite Fund war lustiger. Das Modell musste eine Textdatei auf die Festplatte speichern, und dabei stellte sich heraus, dass im ganzen Projekt noch nie jemand etwas in unser QEMU geschrieben hatte, weil der Systemstart nur von der Festplatte liest. Und schreiben konnte es nicht, weil die Festplatte ohne Schreibrecht eingebunden war, und der allererste Versuch, irgendetwas zu speichern, riss QEMU komplett mit sich. Obendrein legt das Dateisystem von Oberon neue Daten hinter das Ende der Festplatte, und das Disk-Image war genau so groß wie das, was das System belegte, sodass die Datei auch noch stillschweigend nicht gespeichert wurde.</p>
<p>Als ich das behoben hatte und die Maschine in Kubernetes startete, funktionierte das Schreiben immer noch nicht – diesmal wegen der Dateiberechtigungen. Die Aufgabe, die die Festplatte der Maschine auf ihr Volume legt, sollte das Schreiben erlauben, tat es aber auf eine Weise, die tatsächlich gar nichts erlaubte. Die ganze Zeit über war die Festplatte im Cluster schreibgeschützt, und hätte jemand in Oberon eine Datei gespeichert, wäre die Maschine abgestürzt. Bemerkt hat es niemand, weil niemand etwas speicherte. Inzwischen werden die Berechtigungen explizit gesetzt, auch auf bereits angelegten Festplatten, und das Prüfszenario in der Sandbox fragt QEMU selbst, ob es die Festplatte zum Schreiben geöffnet hat.</p>
<p>Alle Details, Tabellen und Befehle zum Nachvollziehen stehen in der <a href="https://github.com/tym83/paleocomputing/blob/main/13-episode-lm-on-risc5.md">Beschreibung der Folge</a>, und das Wesentliche lässt sich in ein paar Minuten mit <code>cd impl &amp;&amp; make lm-check &amp;&amp; make lm-profile</code> reproduzieren.</p>
<h2 id="deskriptoren-zwischen-chk-und-cheri">Deskriptoren, zwischen CHK und CHERI</h2>
<p>Die Instruktion <code>CHK</code> prüft einen Index gegen eine Länge, die der Compiler in die Instruktion selbst eingebrannt hat, der Compiler muss die Array-Länge also im Voraus kennen. CHERI hält die Grenzen im Zeiger, und die Prüfung lässt sich weder vergessen noch umgehen. Zwischen diesen beiden Extremen standen historisch noch Deskriptoren, wie in eben jener Burroughs B5000 aus den frühen Sechzigern. Ein Deskriptor ist ein Zeiger, der die Array-Länge mit sich trägt, und der Prozessor prüft ihn bei jedem Zugriff, sodass der Compiler nichts mehr im Voraus wissen muss. Ich wollte diese Sprosse auf die Leiter setzen und sie auf demselben vollständig offenen System messen.</p>
<p>Schon die allererste Beobachtung engte die Aufgabe stark ein. In Oberon kennt der Compiler die Länge fast jedes Arrays im Voraus, weil die Sprache schlicht keine Zeiger auf Arrays und keine Arrays variabler Länge kennt. Es gibt eine Ausnahme: wenn ein Array an eine Prozedur übergeben wird, die ein Array beliebiger Länge entgegenzunehmen bereit ist. Innerhalb einer solchen Prozedur ist die Länge nicht im Voraus bekannt, und genau dort hat ein Deskriptor etwas zu tun. Überall sonst kommt <code>CHK</code> bereits zurecht.</p>
<p>Den Deskriptor habe ich in ein gewöhnliches 32-Bit-Wort gepackt. Wirths Prozessor hat eine 24-Bit-Adresse, die Maschine aber nur ein Megabyte Speicher, und für ein Megabyte reichen zwanzig Bit, also gab ich die übrigen zwölf Bit der Array-Länge – bis zu etwas über viertausend Elemente. Dazu eine neue Instruktion, die einen Deskriptor und einen Index nimmt, die Adresse des Elements berechnet und, wenn der Index über die Länge hinausläuft, zum Fehlerbehandler springt. Eine gewöhnliche Adresse, die anstelle eines Deskriptors übergeben wird, sieht aus wie ein Array der Länge null, sodass jeder Zugriff darüber sofort als Fehler behandelt wird. Das ist das nächste Analogon zur zentralen Regel von CHERI – ohne Berechtigung kein Zugriff –, das sich ohne spezielles Hardware-Tag bauen lässt.</p>
<p>Die neue Instruktion wurde so streng geprüft wie <code>CHK</code>: mit denselben absichtlichen Sabotagen, Lockstep-Vergleich gegen den Emulator und einem Check, dass das gewöhnliche System auf einem Prozessor mit der neuen Instruktion genauso bootet wie auf dem gewöhnlichen. Und wieder log der erste Versuch. Der Lauf mit absichtlichen Sabotagen meldete zunächst, er habe alle erwischt. Das Skript, das die Sabotagen einbaute, stürzte selbst ab, die Schaltung baute nicht, und die Tatsache, dass nichts gebaut wurde, zählte als erwischte Sabotage. Inzwischen gilt eine Schaltung, die nicht baut, als gescheiterter Check, nicht als bestandener.</p>
<p>Auf derselben Schleife wie auf der Seite mit den zwei Kernen erwies sich der Deskriptor als der schnellste von allen – schneller sogar als die Variante ganz ohne Prüfungen, acht Takte pro Zugriff gegenüber neun. Ein Wunder ist das nicht. Die neue Instruktion berechnet auch die Adresse des Array-Elements, wofür gewöhnlich zwei weitere Instruktionen nötig sind, und hätte ich eine identische Instruktion ohne Prüfung gebaut, liefe sie genauso schnell. Die Lehre ist hier eine andere, und sie gefällt mir: Wenn die Grenze mit dem Zeiger mitreist, lässt sich die Prüfung in einer Instruktion verstecken, die man ohnehin braucht. Genau so ist es in CHERI gelöst, wo die Prüfung im Speicherzugriff steckt.</p>
<p>Als Nächstes brachte ich dem Compiler bei, Deskriptoren dort zu verwenden, wo die Länge nicht im Voraus bekannt ist, und ließ das System sich mit dem neuen Compiler neu bauen. Es baute sich neu, und die nächste Compiler-Generation stimmte Byte für Byte mit der vorherigen überein. Das ist ein wichtiger Check, denn hätte der Compiler irgendwo vergessen, einen Deskriptor wieder in eine gewöhnliche Adresse zu verwandeln, wäre die Adresse falsch gewesen und es hätte keine Übereinstimmung gegeben.</p>
<p>Und dann fand das echte System zwei Grenzen, auf die ich selbst nie gekommen wäre. Die erste betrifft die Array-Länge. Im gesamten Project Oberon gibt es kein einziges Array mit mehr als viertausend Elementen, aber in den Werkzeugen, mit denen ich es gebaut habe, tauchte ein Puffer mit sechzehntausend Elementen auf, und der Compiler weigerte sich ehrlich, ihn zu bauen, statt die Länge stillschweigend abzuschneiden. Die zweite Grenze war interessanter. Als ich viele Module in einem Lauf baute, wuchs der Speicher im Emulator über ein Megabyte hinaus, mein Deskriptor kann aber nur ein Megabyte adressieren, also blieb der Build einfach hängen, und zwar stillschweigend. Daraus folgt eine sehr aufschlussreiche Schlussfolgerung. Ein Zeiger mit Grenzen lässt sich nicht in die Breite einer gewöhnlichen Adresse quetschen, denn sobald mehr Speicher da ist, bleibt kein Platz mehr für die Länge. Genau deshalb sind die Zeiger von CHERI doppelt so breit wie eine Adresse und komprimieren die Grenzen obendrein geschickt.</p>
<p>Was kostet diese ganze Konstruktion bei großen Lasten? Bei einem synthetischen Programm, das intensiv mit Arrays unbekannter Länge arbeitet, bringen Deskriptoren eine Beschleunigung um etwa ein Viertel, aus demselben Grund wie in der Schleife: Sie sparen bei der Adressberechnung. Beim Compiler dagegen – einem echten Programm – bringen sie eine winzige Verlangsamung, unter einem Prozent, und ich habe ziemlich lange gesucht, woher sie kommt, denn rechnerisch hätte es eine Beschleunigung sein müssen. Mit Deskriptoren hatte das nichts zu tun: Jedes Mal, wenn das Programm einer Prozedur einen String übergibt, baut der Compiler jetzt einen Deskriptor dafür zusammen, wodurch der Code etwas länger wurde, und das System verbringt etwas mehr Zeit mit dem Laden von Modulen. Hätte der Compiler die String-Deskriptoren im Voraus vorbereitet, wäre das nicht passiert, aber das habe ich nicht mehr umgesetzt.</p>
<p>Auf dem FPGA hält der Prozessor mit Deskriptoren weiterhin seine 25 MHz, hat etwa fünf Prozent mehr Logik, und die neue Instruktion landete zum ersten Mal auf dem kritischen Pfad der Schaltung – ihrem längsten Signalweg –, könnte also künftig die Frequenz begrenzen. <code>CHK</code> hat das kein einziges Mal getan.</p>
<p>Am Ende sieht die Leiter so aus:</p>
<table>
  <thead>
      <tr>
          <th>Sprosse</th>
          <th>Wo die Grenze gespeichert ist</th>
          <th style="text-align: right">Prüfinstruktionen in der Schleife</th>
          <th>Hauptkosten</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RISC5, Software-Prüfung</td>
          <td>im Code</td>
          <td style="text-align: right">2</td>
          <td>am langsamsten</td>
      </tr>
      <tr>
          <td>RISC5, <code>CHK</code></td>
          <td>in der Instruktion selbst</td>
          <td style="text-align: right">1</td>
          <td>funktioniert nicht, wenn die Länge nicht im Voraus bekannt ist</td>
      </tr>
      <tr>
          <td>RISC5, Deskriptor</td>
          <td>im Zeiger</td>
          <td style="text-align: right">0</td>
          <td>Speicher bis ein Megabyte, Arrays bis viertausend Elemente</td>
      </tr>
      <tr>
          <td>CHERI</td>
          <td>in einem breiten, getaggten Zeiger</td>
          <td style="text-align: right">0</td>
          <td>doppelt so breite Zeiger</td>
      </tr>
  </tbody>
</table>
<p>Ein Deskriptor entfernt die Prüfung aus der Schleife genauso wie CHERI, hat in Oberon aber fast nichts zu schützen, was <code>CHK</code> nicht schon schützt. Und das Entscheidende, was ihn von CHERI unterscheidet: Ein Deskriptor bleibt eine gewöhnliche Zahl, und ein Programm, dem Low-Level-Operationen erlaubt sind, kann aus beliebiger Länge und beliebiger Adresse jeden beliebigen Deskriptor zusammenbauen. Genau hier setzt CHERI ein spezielles Tag, das sich nicht fälschen lässt. Ein vollständig mit Deskriptoren gebautes System habe ich auf der echten Schaltung noch nicht gebootet; diesen Prozessor gibt es auch noch nicht im Browser oder im Katalog; und alle Details und Befehle zum Nachvollziehen stehen in der <a href="https://github.com/tym83/paleocomputing/blob/main/14-episode-descriptors.md">Beschreibung der Folge</a>.</p>
<h2 id="wie-sie-das-alles-selbst-installieren">Wie Sie das alles selbst installieren</h2>
<p>Es gibt vier Wege, vom allereinfachsten, bei dem Sie nichts installieren müssen, bis zur eigenen Cloud.</p>
<p>Am einfachsten ist es, das <a href="https://tym83.github.io/paleocomputing/oberon/lab.html">Labor</a> im Browser zu öffnen und zumindest die ersten vier Übungen zu machen. Sie sehen, wie eine Oberfläche funktioniert, in der jeder Text ein Befehl sein kann, schreiben Ihr erstes Modul und machen die Maschine kaputt, indem Sie Müll direkt in den Bildschirmspeicher schreiben. Wenn Sie keine Übungen wollen, finden Sie auf der Seite <a href="https://tym83.github.io/paleocomputing/oberon/run.html">Just run the system</a> das nackte System, und auf der Seite <a href="https://tym83.github.io/paleocomputing/oberon/checks.html">Change the processor</a> sehen Sie die Kosten einer Prüfung mit eigenen Augen. Die mittlere Maustaste wird durch einen Klick mit Alt ersetzt, der Zwei-Tasten-Akkord durch einen Klick mit Shift. Von dem, was man selbst ausprobieren sollte, empfehle ich einen Mittelklick auf <code>System.ShowModules</code>, um zu sehen, wie wenige Module das System nach dem Booten braucht, und auf <code>Hilbert.Draw</code>, weil es einfach hübsch ist. Und dann die Laborübungen zwölf und dreizehn, die am stärksten hardwarenahen: In der einen messen Sie die drei Prozessorvarianten selbst, in der anderen fügen Sie der Sprache eine neue eingebaute Prozedur hinzu und bauen den Compiler direkt im System neu.</p>
<p>Wenn Sie Wirths Maschine als gewöhnliche VM möchten, bauen Sie sich Ihr eigenes QEMU mit den Befehlen aus dem QEMU-Abschnitt oder nach dem <a href="https://github.com/tym83/paleocomputing/blob/main/qemu/GUIDE.md">Leitfaden</a>. Dort lohnt es sich, die Prozessorvarianten mit Hardware-Prüfung und mit Deskriptoren auszuprobieren.</p>
<p>Wenn Sie ein eigenes KubeVirt haben, gibt es einen <a href="https://github.com/tym83/paleocomputing/blob/main/kubevirt/GUIDE.md">Leitfaden</a> und die Kurzfassung im Spoiler oben. Unterstützt werden die beiden neuesten KubeVirt-Versionen sowie Server mit Intel und mit Arm. Sie können mit einem Wegwerf-Testcluster beginnen; dasselbe Szenario, das der automatische Check ausführt, lässt sich von Hand starten. Und ich wiederhole die Warnung noch einmal, weil ich mich selbst daran verbrannt habe: Das Verwaltungs-Image wird für alle VMs des Clusters auf einmal geändert, prüfen Sie auf einem Arbeitscluster also zuerst, ob automatische Maschinen-Updates eingeschaltet sind.</p>
<p>Und wenn Sie Cozystack haben, genügt es, den Katalog mit den Befehlen aus dem Cozystack-Abschnitt einzubinden, und Ihre Benutzer bekommen Wirths Maschine, das Labor, das Handbuch und ein Bundle, das alles auf einmal installiert. Die Details stehen auf der <a href="https://tym83.github.io/paleocomputing/cozystack/">Projektseite</a>. Wenn Sie Studierenden oder Kollegen zeigen müssen, wie ein ganzer Computer aufgebaut ist, ist das wahrscheinlich der schnellste Weg. Was die automatischen Maschinen-Updates angeht: Die Komponente fragt inzwischen selbst danach und fasst ohne ausdrückliche Zustimmung nichts an.</p>
<p>Und wenn Sie uns auf die Finger schauen möchten, führt der Befehl <code>cd impl &amp;&amp; make deps &amp;&amp; make check</code> in etwa acht Minuten sämtliche Prozessortests, den Systemstart, den Lockstep-Vergleich gegen die Referenz, den Selbst-Build des Compilers und einen Neubau des gesamten Systems mit byteweisem Vergleich aus. Dafür brauchen Sie Verilator und einen C++-Compiler.</p>
<h2 id="was-ich-daraus-mitgenommen-habe">Was ich daraus mitgenommen habe</h2>
<p><strong>Erstens, zur Bounds-Prüfung.</strong> Sie ist billiger, als man gemeinhin denkt, aber völlig kostenlos würde ich sie nicht nennen. Auf Wirths Prozessor – sehr einfach, ohne Caches, ohne Sprungvorhersage – kostete sie den Compiler zwischen zwei und fünf Prozent der Zeit, je nachdem, aus welchem Teil des Systems man sie entfernt. Und der Großteil dieser Kosten entfällt auf Nullzeiger-Prüfungen, nicht auf Prüfungen von Array-Grenzen. Auf großen modernen Prozessoren ist sie in meiner absichtlich günstigen Schleife unsichtbar, weil die zusätzlichen Instruktionen in freie Slots fallen; auf dem Server-Arm ist sie sichtbar, wenn auch nur ein wenig. In echten Programmen sind Prüfungen vor allem deshalb teuer, weil sie den Compiler daran hindern, Arrays stapelweise zu verarbeiten, und das habe ich nicht gemessen. CHERI versteckt die Prüfung direkt im Speicherzugriff, und dann gibt es im Programm überhaupt keine Prüfung mehr.</p>
<p><strong>Zweitens: Der Engpass liegt oft nicht dort, wo man ihn sucht.</strong> Für das neuronale Netz wollten alle, ich eingeschlossen, eine clevere neue Instruktion, dabei war der Engpass der alte langsame Multiplizierer. Ihn zu ersetzen, beschleunigte das Modell um das 1,6-Fache, während die neue Instruktion schätzungsweise ein paar Prozent gebracht hätte. Die Reviewer haben das am allerersten Tag gesagt, und eine Messung eine Woche später hat es bestätigt. Erst messen, dann Hardware hinzufügen.</p>
<p><strong>Drittens: Ein Zeiger, der seine eigenen Grenzen kennt, muss breiter sein als eine gewöhnliche Adresse.</strong> Meine Deskriptoren, in ein gewöhnliches Wort gepackt, stießen an ein Megabyte Speicher und Arrays mit bis zu viertausend Elementen, und genau deshalb sind die Zeiger von CHERI doppelt so breit.</p>
<p><strong>Viertens: Die fiesesten Bugs findet nur eine lebende Umgebung.</strong> Meine Tests waren gut, aber die interessantesten Dinge fanden echtes KubeVirt, echtes Cozystack und ein lebender Arm-Server – von einer Maschine, die keine Energieverwaltung braucht, über eine Netzwerkschicht, die stillschweigend nicht antwortet, bis zu sechzehn Sekunden, bevor der ganze Cluster migrierte. Seitdem veröffentliche ich eine neue Version nur, wenn sie vorher einen vollständigen Check in der Sandbox bestanden hat.</p>
<p><strong>Und fünftens: Ein neuronales Netz schreibt Code schnell und beweist langsam, dass er funktioniert.</strong> Neun Tage für all das waren nur möglich, weil den Code Agenten geschrieben haben. Aber mehr als die Hälfte dieser Tage ging darauf, den Checks beizubringen, ehrlich zu erröten, und zu jeder hübschen Zahl gab es einen Auditor – ebenfalls ein Agent –, der sie zerlegte. Ist ein Check noch nie rot geworden, prüft er höchstwahrscheinlich gar nichts, vor allem wenn man sich sehr wünscht, dass alles klappt. Und eine eigene offene Frage ist, was man mit solchem Code in Open-Source-Projekten macht. QEMU und libvirt nehmen ihn überhaupt nicht an; die CNCF dagegen sieht das gelassen; und wie Open Source damit leben soll, ist noch nicht recht klar.</p>
<h2 id="statt-eines-schlussworts">Statt eines Schlussworts</h2>
<p>All das ist offen. Die Quellen liegen im <a href="https://github.com/tym83/paleocomputing">Repository</a>, unser Code unter der Apache-2.0-Lizenz und der Prozessor für QEMU unter der GPL, wie QEMU selbst. Die Website mit dem Labor ist <a href="https://tym83.github.io/paleocomputing/">tym83.github.io/paleocomputing</a>. Jeder Fund samt Befehlen zum Nachvollziehen steht im Repository im Ordner <code>impl/docs</code>, und über Cozystack selbst können Sie auf <a href="https://cozystack.io/">cozystack.io</a> lesen.</p>
<p>Als Nächstes in der Reihe: die Burroughs B5000 mit ihrem Hardware-Speicherschutz; Lilith, Wirths allererste Maschine, die nur einen neuen Pass brauchen wird; und, sofern die Geduld reicht, mein eigenes Board mit Oberon auf einem FPGA, um die Takte endlich nicht in der Simulation, sondern auf echter Hardware zu messen.</p>
<p>Wenn Sie Oberon in der Lehre einsetzen oder einfach einmal darin geschrieben haben, erzählen Sie es mir in den Kommentaren – ich bin sehr neugierig, wo es heute lebt. Und korrigieren Sie mich unbedingt, wenn ich mich irgendwo geirrt habe; nach diesem Artikel zu urteilen, passiert mir das regelmäßig.</p>
<p><strong>Eine kurze Umfrage: Was machen Sie nach diesem Artikel?</strong></p>
<ul>
<li>Das Labor öffnen und die Maschine kaputt machen, indem ich Müll in den Bildschirmspeicher schreibe</li>
<li>Auf meinem eigenen Cluster die automatischen Updates der VMs prüfen. Und zwar sofort</li>
<li>Alles in Oberon neu schreiben (Go ist im Grunde Oberon, nur mit Goroutinen)</li>
<li>Für ein paar Prozent weiterhin die Bounds-Prüfung abschalten</li>
<li>Ich habe schon in den Neunzigern darin geschrieben und habe in den Kommentaren etwas zu sagen</li>
<li>Bis zur Umfrage durchgehalten, was an sich schon eine Leistung ist</li>
</ul>
<p>P.S. Ein besonderer Dank an Niklaus Wirth. Ich bin ihm nie begegnet, aber neun Tage lang habe ich mit seiner Schaltung gesprochen, und sie hat mich fast nie belogen. Im Gegensatz zu meinen eigenen Checks.</p>
]]></content:encoded></item><item><title>Was mich Dutzende KI-Agenten gelehrt haben: Wie ich das Speichersystem Blockstor als Experiment geschrieben habe</title><link>https://aenix.io/de/blog/2026/08/was-mich-dutzende-ki-agenten-gelehrt-haben-blockstor-speichersystem/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/08/was-mich-dutzende-ki-agenten-gelehrt-haben-blockstor-speichersystem/</guid><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><dc:creator>Andrei Kvapil</dc:creator><category>Kubernetes</category><category>LINSTOR</category><category>Storage</category><category>AI and ML</category><category>Cozystack</category><category>Open Source</category><description>Andrei Kvapil über Blockstor: ein Clean-Room-Orchestrator für Blockspeicher, gebaut mit bis zu 60 KI-Agenten, testgetriebener Entwicklung und harten Exit Gates.</description><content:encoded><![CDATA[<p>Vor ein paar Monaten habe ich mich zu einem Experiment entschlossen: eine Clean-Room-Implementierung von LINSTOR von Grund auf zu bauen, ausschließlich anhand der Referenzen und der öffentlichen API-Typen. Angefangen hat es als Freitagsscherz. Ich wollte so wenig Zeit wie möglich hineinstecken, das Ganze im Hintergrund laufen lassen und schauen, wohin es führt. Die Frage war, wie weit ein modernes Modell allein kommt, ganz ohne Menschen in der Schleife.</p>
<p><img src="https://aenix.io/img/blog/medium/what-dozens-of-ai-agents-taught-me-how-i-wrote-the-blockstor-storage-system-as-an-experiment/cover.jpg" alt="Speichersystem Blockstor, gebaut mit KI-Agenten" width="1200" height="630" loading="lazy" decoding="async"></p>
<p>Spoiler: Aus der vollen Autonomie wurde nichts, und ich habe mich mit dem Projekt ziemlich herumgeschlagen. Aber der Prozess hat mich völlig gepackt, und das Ergebnis hat alle meine Erwartungen übertroffen.</p>
<blockquote>
<p>Aus der Community kam immer wieder die Frage, wie das eigentlich gelaufen ist. Eine berechtigte Frage — bei diesem Projekt habe ich sehr viel darüber gelernt, wie man Modelle wirksam führt, und dabei sind etliche Methoden und Muster herausgekommen, die mich seither auch in der täglichen Arbeit deutlich produktiver machen.</p>
</blockquote>
<h2 id="was-blockstor-ist">Was Blockstor ist</h2>
<p>Ich habe das Projekt Blockstor genannt. Es ist ein Orchestrator für Blockgeräte. Grob gesagt: Sie fordern ein repliziertes Volume in der gewünschten Größe an, und dieses Volume wird auf mehreren Knoten in ZFS oder LVM angelegt und per DRBD für die Replikation eingerichtet — eine intelligente, netzwerkbewusste Variante von RAID 1. Das System beherrscht Snapshots, das Umverteilen von Repliken, Resize, automatisches Failover und einiges mehr.</p>
<p>Blockstor ist kein Speichersystem, das auf einem leeren Blatt entworfen und geschrieben wurde. Ich habe das Experiment auf LINSTOR aufgebaut — einem ausgereiften Manager für verteilten Blockspeicher, den ich selbst seit Jahren im Produktivbetrieb fahre.</p>
<p>LINSTOR kam für mich einem idealen Speichersystem sehr nahe, weil seine API-Typen Kubernetes-ähnlich sind. Die Backend-Logik ist allerdings recht eigenwillig organisiert. Das Hauptproblem ist aus meiner Sicht das anfragegetriebene Modell: Für die meisten API-Aufrufe geht LINSTOR in Echtzeit zu den Knoten und fragt deren aktuellen Zustand ab, um eine Antwort zusammenzubauen. Für ein verteiltes System halte ich dieses Muster für nicht akzeptabel, weil es bei Skalierung nicht trägt. Das Fehlen eines Reconciliation-Loops macht außerdem die automatische Wiederherstellung schwierig. Ich will die Entscheidungen der Entwickler nicht im Nachhinein bewerten — sie hatten sicher ihre Gründe. Aber weil ich Kubernetes-Mustern so verbunden bin, habe ich mich gefragt: Wie würde ich — als erfahrener Architekt und Entwickler — ein solches System in Kubernetes-nativer Logik schreiben?</p>
<p>Umschreibungen von einer Sprache in eine andere sind übrigens keine Seltenheit. So ist zum Beispiel das Projekt rusternetes entstanden: Kubernetes, neu geschrieben von Go nach Rust. Aber wie soll das überhaupt gehen? Kubernetes hat eine gewaltige Codebasis mit einer gewaltigen Zahl an Personenstunden darin. Wie überzeugt man sich davon, dass der dabei entstehende „KI-Schrott“ korrekt funktioniert? Und kann man sich überhaupt darauf verlassen, geschweige denn ihn produktiv betreiben?</p>
<h2 id="tdd">TDD</h2>
<p>Die Antwort liegt darin, wie Kubernetes selbst offen entwickelt wird. Freie, community-getriebene Projekte haben einen festen Bestand an etablierter Praxis, und die Beitragenden halten sich nach Kräften daran.</p>
<p>An solchen Projekten arbeiten die unterschiedlichsten Leute mit, auf jedem Erfahrungsniveau. Genau deshalb sind Tests entscheidend: Tests verhindern, dass eine einmal beigesteuerte Funktionalität später wieder kaputtgeht. Angenommen, Sie bringen ein neues Feature ein, es besteht alle Tests und landet im Projekt. Später bringt jemand anderes ein weiteres Feature ein. Fällt beim Prüfen dieses Beitrags ein Test für Ihr Feature durch, dann hat die neue Funktionalität ein Problem, das Ihres beschädigt — und das System lässt die Änderung automatisch nicht durch. Tests haben in öffentlichen Projekten mit der Zeit einen so hohen Stellenwert bekommen, dass sie heute höher bewertet werden als der Code selbst. Genau solche Tests sind es, die ein „X in Y neu schreiben“ überhaupt möglich machen.</p>
<p>Das Projekt rusternetes gibt an:</p>
<blockquote>
<p><em>Actively conformance-tested against the official Kubernetes e2e test suite — currently passing 94% of conformance tests (415/441) across 160 rounds of testing.</em></p>
</blockquote>
<p>Ob ein Projekt als Kubernetes-Ersatz durchgeht, misst sich also in erster Linie daran, ob es die Tests besteht.</p>
<blockquote>
<p><em>Wenn ich einen Vogel sehe, der wie eine Ente läuft, wie eine Ente schwimmt und wie eine Ente schnattert, dann nenne ich diesen Vogel eine Ente.</em></p>
<p><em>— Der berühmte <a href="https://de.wikipedia.org/wiki/Ententest">Ententest</a></em></p>
</blockquote>
<h2 id="hooks-und-setup">Hooks und Setup</h2>
<p>Aus demselben Grund war mein erster Schritt, das Modell auf testgetriebene Entwicklung (TDD) festzulegen, bei der die Tests vor der Implementierung entstehen. Über Tests lassen sich die Konformitätsanforderungen festzurren, die man braucht. Und sie geben mir die Sicherheit, dass neue Funktionalität, die während der Entwicklung dazukommt, das Bestehende nicht beschädigt.</p>
<p>Auf Rat eines Kollegen habe ich sofort golangci-lint eingebunden und es für das Modell verbindlich gemacht, jeden Code dort durchlaufen zu lassen. <a href="https://github.com/lexfrei">@lexfrei</a> — der besagte Kollege — argumentiert, dass dieser Schritt eine erhebliche Menge Tokens spart.</p>
<h2 id="das-exit-gate-und-ein-deterministisches-ergebnis">Das Exit Gate und ein deterministisches Ergebnis</h2>
<p>Das ist wohl die erste und wichtigste Lektion: Man kann einem Modell sagen „schreib weiter, bis die Tests grün sind“, und das ist eine gute Bedingung an das Artefakt, das dabei herauskommt. Genau nach dieser Methode habe ich dieses Projekt gebaut. Mit einem Haken: Ich hatte keine Tests, denn LINSTOR veröffentlicht keine Test-Suite für die eigene Funktionalität.</p>
<p>Zur Verfügung standen mir nur Jahre im Betrieb von LINSTOR, Dutzende eigener Vorträge und Artikel sowie der Apache-2.0-Code von Projekten aus dem LINSTOR-Ökosystem — golinstor, der Treiber für das Container Storage Interface (CSI), der Piraeus-Operator und deren API-Verträge. LINSTOR selbst steht unter der GPL, womit ausgeschlossen ist, seinen Code als Grundlage für ein Apache-2.0-Projekt zu verwenden. Das war die zentrale Schwierigkeit, und genau deshalb bin ich den Clean-Room-Weg gegangen.</p>
<p>Meine Hauptaufgabe bestand damit darin, diese Exit Gates zu definieren. Sitzen sie richtig, muss ich nicht die gesamte entstehende Codebasis kontrollieren: Erfüllt der Code die Bedingungen, die ich mir selbst gesetzt habe, ist das der Nachweis, dass die Arbeit erledigt ist.</p>
<h2 id="die-api-als-vertrag">Die API als Vertrag</h2>
<p>Mir gefallen die Typdefinitionen, die LINSTOR in seiner API verwendet. Hinzu kommt, dass sowohl der offizielle CSI-Treiber als auch der Piraeus-Operator mit diesen Typen arbeiten, und ich hatte keine Lust, eines von beiden neu zu schreiben.</p>
<p>Aus Erfahrung ist der Entwurf von APIs eine der schmerzhaftesten Aufgaben in diesem Beruf. Backend-Logik können Sie jederzeit ändern. Ein einziger Breaking Change an der API, und auf der Client-Seite fällt alles auseinander. Eine API sollte sich also selten und nur in Ausnahmefällen ändern — und das Risiko, sie gleich zu Beginn falsch zu schneiden, ist hoch. Deshalb habe ich mich entschieden, exakt die Typen des Originalprojekts zu verwenden und sie auf Kubernetes-first-Typen in Form von CustomResourceDefinitions (CRDs) abzubilden.</p>
<p>Beim Aufbau von Cozystack und im Vertrieb von Lösungen darauf ist uns dieselbe Frage von Interessenten schon mehrfach begegnet: Wie steht es um eure API? Was passiert, wenn wir euch produktiv einsetzen, eine Lösung darum herum bauen — und sich dann eure API ändert und wir unsere Hälfte des Projekts neu schreiben müssen?</p>
<p>Zur Erinnerung: Der Code von LINSTOR ist unter GPLv3 veröffentlicht, und ich hatte vor, Blockstor unter Apache 2.0 zu veröffentlichen. Den Originalcode wiederzuverwenden schied damit aus. Die erste Aufgabe war also, im Kubernetes-Werkzeugumfeld kompatible Verträge zu finden: die Bibliothek <a href="https://github.com/LINBIT/golinstor">golinstor</a>, linstor-csi und den Piraeus-Operator, allesamt unter Apache 2.0, sowie die offizielle LINSTOR-Dokumentation unter CC BY-SA.</p>
<p>Damit hatte ich meinen ersten Vertrag: Die API muss mit der LINSTOR-Go-Bibliothek, mit linstor-csi und mit dem Piraeus-Operator kompatibel sein.</p>
<h2 id="die-testumgebung">Die Testumgebung</h2>
<p>Das Modell brauchte einen Ort zum Arbeiten und einen Ort, um das Erzeugte zu testen. Als Testumgebung habe ich einen kräftigen Bare-Metal-Knoten gewählt, dazu eine generierte Test-Suite, die in virtuellen Maschinen (VMs) einen Kubernetes-Cluster auf Talos hochzieht und Blockstor darin ausrollt. Diese Wahl war bewusst: Blockstor braucht das DRBD-Modul, und DRBD neigt bei falscher Konfiguration dazu, sich aufzuhängen — ich brauchte also einen schnellen Weg, eine kaputte Umgebung neu aufzusetzen. Da Blockstor seine Konfiguration architekturbedingt als Kubernetes-CRDs ablegt, war mit Talos zugleich die Frage des Kubernetes-Bootstraps erledigt.</p>
<h2 id="das-erste-ergebnis">Das erste Ergebnis</h2>
<p>Als der erste Proof of Concept (PoC) fertig war, hatte mir das Modell einen funktionierenden Prototyp gebaut — allein anhand der genannten Quellen und seines eigenen Datenbestands. Für das Interaktionsmodell hatte es allerdings genau dasselbe anfragegetriebene Modell implementiert wie das Original-LINSTOR, vermutlich aus dessen Dokumentation übernommen. Und es funktionierte bereits! Ich konnte über das offizielle CLI mit der API sprechen, wenn auch mit Hunderten von Fehlern und Lücken.</p>
<p>Um das zu korrigieren, habe ich das Modell gebeten, die API-Verträge als Tests einzufrieren und die Logik auf controller-runtime umzuschreiben, so wie ich es brauchte. Mit einem klaren, deterministischen Ziel begann die zurückgelieferte Architektur dem zu ähneln, was ich tatsächlich wollte: vollständig asynchron, mit dem API-Übersetzer als separatem, austauschbarem Modul.</p>
<p>Später habe ich das Modell eine Reihe von End-to-End-Tests (e2e) implementieren lassen, die Volumes über das offizielle CSI-Plug-in und das Framework kubernetes-csi/csi-test anfordern. Anders gesagt: Das Modell arbeitete so lange weiter, bis Blockstor Volumes und Snapshots über die üblichen Kubernetes-Abstraktionen bereitstellte. Nach einer Weile hatte ich einen funktionierenden Prototyp. Von Stabilität war das System allerdings weit entfernt, was mich vor die Frage stellte: Wie erreicht man die nötige Stabilität, wenn es zu Beginn gar keine Tests gibt?</p>
<p>An dieser Stelle floss mein gesamtes Material ein — meine Artikel zum Debugging von LINSTOR, meine Vorträge, meine Claude-Code-Debugging-Skills, unsere in Cozystack integrierten Plunger-Skripte und auf GitHub gemeldete Fehler. Ich habe das Modell all das studieren und daraus eine Sammlung von Punkten zusammenstellen lassen, die getestet werden mussten und die unser System erfüllen sollte. Heraus kam eine riesige Markdown-Datei. Ich habe sie durchgesehen und das Modell losgeschickt, jedes darin erfasste Problem auf dem Teststand zu prüfen und zu beheben. Es gab viele solcher Iterationen, und jede kostete gewaltig viel Zeit. Meist zog das Modell die Umgebung hoch, ließ Tests laufen, behob Fehler, setzte die Umgebung neu auf — und all das dauerte.</p>
<p>Irgendwann habe ich angefangen zu fragen, wie sich der Prozess beschleunigen ließe.</p>
<h2 id="die-entwicklung-beschleunigen">Die Entwicklung beschleunigen</h2>
<p>Daraus entstand die Idee, Agenten zu parallelisieren. Manche Probleme ließen sich auf Ebene der Unit-Tests abschließen. Andere waren nur an einer echten Umgebung zu verifizieren. Nachdem ich denselben Satz Fehler immer wieder durchgespielt hatte, kam ich zu dieser Methode:</p>
<ol>
<li>Ich bitte einen Agenten, die Referenzen zusammenzutragen und so etwas wie einen Plan für die Fehler aufzustellen.</li>
<li>Sobald ich das riesige Dokument habe, bitte ich das Modell, einen Schwung Agenten loszuschicken, von denen jeder an einem bestimmten Fehler arbeitet.</li>
<li>Im Code bekommt jeder Agent seine eigene isolierte Umgebung und seinen eigenen Worktree, in dem er seine Korrekturen einreicht.</li>
<li>Aufgabe jedes Agenten ist es, das Problem zu untersuchen, eine Umgebung hochzuziehen, eine Korrektur samt Tests vorzubereiten und alles an den Hauptagenten zurückzugeben.</li>
<li>Der Hauptagent zieht die Arbeit aller Agenten in den Hauptbaum — und das wiederholt sich über mehrere Iterationen.</li>
<li>Am Ende liefen bis zu 60 Agenten gleichzeitig: 30 auf Ebene der Unit-Tests, 30 auf e2e in einer konkreten Umgebung.</li>
</ol>
<p>Nach einer Weile fing das Projekt an, nach etwas auszusehen, das man tatsächlich benutzen kann. Vieles war noch nicht stabil.</p>
<h2 id="der-marathon-geht-weiter">Der Marathon geht weiter</h2>
<p>Während ich diesen ganzen Zoo betreute, habe ich parallel selbst Integrationstests gefahren und die Ergebnisse von Hand geprüft. Ich ließ mir von Claude Zugang zu einer Umgebung geben, bediente das linstor-CLI manuell und versuchte, die Fehler zu reproduzieren — von denen es noch reichlich gab.</p>
<p>An diesem Punkt musste ich aufhören, große Blöcke zu bauen, und stattdessen sehr viel akribischer die User Journey testen. Der Großteil der Probleme verschwand, als ich die Agenten Tests über das offizielle CLI implementieren ließ und die User Journey für den Day-2-Betrieb aus der offiziellen LINSTOR-Dokumentation vorgab. An manchen Stellen drehte sich das Modell allerdings im Kreis: Über die ganze Zeit brachte es nie alle Tests zuverlässig auf Grün, und ich musste persönlich eingreifen. Gestützt auf mein eigenes Wissen ließ ich mir jedes Problem erklären und stellte dem Modell dann eine Reihe gezielter Fragen zur Architektur.</p>
<h2 id="die-feinschliff-phase">Die Feinschliff-Phase</h2>
<p>Viele meiner Fragen liefen auf die asynchrone Natur der Controller hinaus. DRBD ist von Haus aus heikel, was den Zeitpunkt, die Art und die Reihenfolge der Konfigurationsanwendung angeht. Entscheidend war deshalb eine stabile Zustandsmaschine — eine, die den Reconciliation-Loop erst dann zu einer bestimmten Aktion durchlässt, wenn die Bedingungen erfüllt sind.</p>
<p>Das größte Problem war dabei die Snapshot-Logik. Um einen Snapshot anzulegen, friert LINSTOR zunächst die I/O auf DRBD-Ebene ein und schickt den Befehl dann gleichzeitig an die mehreren Knoten, die das darunterliegende Gerät in ZFS halten. Nach erfolgreicher Operation taut LINSTOR DRBD wieder auf. Das alles muss augenblicklich geschehen, und im Fehlerfall muss der Zustand automatisch zurückgerollt werden, damit der Container oder die VM bei der Arbeit mit ihren Daten nie blockiert.</p>
<p>Das zweite Problem war, wie sich der initiale Sync einer neuen Replik überspringen lässt. Das beobachtbare Verhalten kannte ich aus Jahren im Betrieb von LINSTOR: Die erste Replik hält ihren aktuellen Generation Identifier fest, spätere Repliken übernehmen diesen als Startwert und synchronisieren von dort aus.</p>
<p>Zuerst habe ich versucht, die exakte Befehlsfolge allein aus dem beobachteten Verhalten zu rekonstruieren, indem ich Operationen gegen einen laufenden Controller ausführte und die Befehle mitschnitt. Die Mechanik ist aber nicht öffentlich dokumentiert, und Beobachtung allein ergab kein stimmiges Bild. Also bin ich auf das Clean-Room-Verfahren zurückgefallen. Ein Agent — der „schmutzige Raum“ — rekonstruierte aus den Originalquellen eine funktionale Spezifikation: welche Befehle ausgeführt werden und unter welchen Bedingungen. Er hielt ausschließlich diese funktionalen Fakten fest und übernahm weder Code noch dessen Ausdrucksform. Der zweite Agent — der „saubere Raum“ — hatte von vornherein keinen Zugriff auf fremde Quellen und implementierte den Ansatz von Grund auf, streng nach der Spezifikation.</p>
<p>Ein weiteres Problem war die konsistente Vergabe von Node-IDs — jede DRBD-Replik braucht im Cluster eine eindeutige Nummer von 1 bis 8 — sowie die Vergabe der TCP-Ports für die Replikation, die in der aktuellen Implementierung nicht mehr an DRBD gebunden ist, sondern aus einem Pool je Knoten erfolgt. Genau hier hat sich die oben beschriebene Zustandsmaschine ausgezahlt.</p>
<h2 id="der-aufbau-des-ci-systems">Der Aufbau des CI-Systems</h2>
<p>Inzwischen war klar, dass das Experiment in seine Endphase ging, und ich begann, über die Zukunft des Projekts nachzudenken. Um es fertigzustellen und produktionsreif zu machen, brauchten wir ein ernsthaftes System für Continuous Integration (CI), das garantiert, dass kein ungetesteter Code in der Codebasis landet. Angesichts der Testmenge durfte ein Lauf nicht über mehrere Stunden gehen, die Tests mussten also ebenso parallelisiert werden.</p>
<p>Und wir haben eines gebaut: Für jeden Pull Request lief ein großer Stapel Tests parallel über sechs bis sieben Runner und lieferte am Ende „ok“ oder „nicht ok“.</p>
<p>In diesem Modus habe ich noch etliche Runden gearbeitet, bis die CI wirklich grün und stabil war. Danach sind wir von lokalen Worktrees auf Pull Requests bei GitHub umgestiegen.</p>
<h2 id="die-endphase">Die Endphase</h2>
<p>Datenverlust ist nicht akzeptabel. Bevor ich das Projekt für fertig erklären konnte, musste ich also gründlich prüfen, ob Blockstor sich in dieser Hinsicht korrekt und verlässlich verhält. Den gesamten generierten Code zu lesen und zu prüfen, überstieg sowohl meine Energie als auch meine Kapazität. Andererseits ist Blockstor — wie LINSTOR — im Kern ein Orchestrator. Die Daten selbst liegen in ZFS und DRBD, und an deren Zuverlässigkeit hatte ich keine Zweifel. Wichtig war der Nachweis, dass der Controller die Ressourcen tatsächlich korrekt konfiguriert und Ausfälle übersteht.</p>
<p>Aber wie stellt man fest, ob man dem aktuellen Code den Produktivbetrieb anvertrauen kann? Das ist eine unscharfe und schwierige Frage. Und wie kommt man zu einer deterministischen Antwort darauf? Hier habe ich ein weiteres Muster genutzt, das ich mir im Lauf des Projekts erarbeitet habe.</p>
<p>Mein Kollege @lexfrei hatte früher einmal erwähnt, dass Modelle es fürchten, wenn man ihnen sagt, ihr Handeln könne zu schweren finanziellen Verlusten führen. Ich habe beschlossen, genau das als Exit Gate zu nutzen. Ich habe einen Agenten gestartet, der für die Freigabe des Codes in die Produktion zuständig war, und ihn unter Bedingungen arbeiten lassen, in denen sein Leben und sein finanzielles Wohlergehen vom Endergebnis „abhingen“. Er stellte einen Abnahmeplan mit einer langen Liste von Punkten auf, darunter ein 24-stündiger Dauerlauf auf echter Infrastruktur. Ein zweiter Agent versuchte, diese Anforderungen zu erfüllen. Das ging noch mehrere Tage und mehrere Releases so weiter, bis der für die Auslieferung zuständige Agent schließlich seinen Segen gab.</p>
<p>Ein System, das niemand nutzt, kann man allerdings nicht stabil nennen. Der nächste Schritt war deshalb die Integration von Blockstor mit Cozystack. Unsere Test-Suite deckt viele Funktionen gleichzeitig ab: das Anfordern von Volumes mit und ohne DRBD, RWX, Snapshots und weitere Details. Aufgabe des neuen Agenten war es, einen Draft-Pull-Request vorzubereiten, die Tests auf Grün zu bringen und die Endphase abzuschließen.</p>
<p>Stand 15. Juli 2026 ist dieser Pull Request noch nicht gemergt — aber die Chancen stehen gut, dass Sie bald ein neues, Kubernetes-natives Storage-Backend in Cozystack haben. Bleiben Sie dran.</p>
<blockquote>
<p><strong>Anmerkung der Redaktion (September 2026):</strong> Blockstor ist weiterhin ein eigenständiges, experimentelles Projekt — <a href="https://github.com/cozystack/blockstor">github.com/cozystack/blockstor</a>, Apache 2.0 — und nicht Bestandteil von Cozystack. LINSTOR/DRBD über Piraeus bleibt der Speicher, den Cozystack ausliefert, und ist dort das Standard-Backend. Blockstor steht auf der Roadmap als optional zuschaltbares Backend für 2027.</p>
</blockquote>
<h2 id="die-wichtigste-erkenntnis">Die wichtigste Erkenntnis</h2>
<p>Blockstor hat nach wie vor experimentellen Status. Die Erfahrung hat mir aber erlaubt, die Arbeit an anderen Projekten erheblich zu beschleunigen und zu automatisieren, und ich wende sie inzwischen täglich an.</p>
<p>Viele halten KI immer noch für ein Autovervollständigungswerkzeug. Für mich hat das schon lange aufgehört zu stimmen. AI-first-Entwicklung heißt nicht, ein Modell gelegentlich eine Funktion schreiben zu lassen. Sie heißt, den gesamten Engineering-Prozess um Agenten, Kontext, Tests, Skills, Pläne, Review und Automatisierung herum neu zu bauen.</p>
<p>Auf diese Weise kann man Aufgaben angehen, die für ein kleines Team früher zu groß aussahen — zum Beispiel mit einer Kubernetes-nativen Implementierung eines Speichersystems der LINSTOR-Klasse zu experimentieren. Das funktioniert allerdings nur unter einer Bedingung: Man braucht Disziplin. Ohne Plan erzeugt KI Chaos sehr viel schneller, als ein Mensch es könnte. Mit Plan, Tests, Agenten und ordentlichem Review wird KI zum Kraftverstärker für das Engineering.</p>
<p>Und so, glaube ich, sieht der Bau komplexer Infrastruktur von hier an aus: nicht ein Ingenieur gegen eine gewaltige Codebasis, sondern ein Ingenieur als Architekt eines Prozesses, um den herum ein Schwarm spezialisierter Agenten arbeitet. Die Aufgabe des Ingenieurs ist es nicht, jeden Agenten zu beaufsichtigen. Sie ist es, ein System zu bauen, in dem die Agenten sich selbst beaufsichtigen und nur mit dem zum Menschen kommen, was wirklich einen Menschen braucht.</p>
<h2 id="community">Community</h2>
<ul>
<li><a href="https://github.com/cozystack/blockstor">Blockstor auf GitHub</a></li>
<li><a href="https://github.com/cozystack/cozystack">Cozystack auf GitHub</a></li>
<li>Telegram-<a href="https://t.me/cozystack">Gruppe</a></li>
<li>Slack-<a href="https://kubernetes.slack.com/archives/C06L3CPRVN1">Gruppe</a> (Einladung unter <a href="https://slack.kubernetes.io/">https://slack.kubernetes.io</a>)</li>
<li><a href="https://calendar.google.com/calendar?cid=ZTQzZDIxZTVjOWI0NWE5NWYyOGM1ZDY0OWMyY2IxZTFmNDMzZTJlNjUzYjU2ZGJiZGE3NGNhMzA2ZjBkMGY2OEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t">Kalender der Community-Meetings</a></li>
</ul>
<hr>
<p>Dieser Beitrag ist eine deutsche Fassung des Artikels <a href="https://blog.aenix.io/what-dozens-of-ai-agents-taught-me-how-i-wrote-the-blockstor-storage-system-as-an-experiment-921f7d3a1137">What dozens of AI agents taught me: how I wrote the Blockstor storage system as an experiment</a>, zuerst erschienen bei <a href="https://blog.aenix.io">Ænix</a> auf Medium.</p>
]]></content:encoded></item><item><title>Fokus auf heute: Wie wir aeman gebaut haben, ein Tagesboard für Entwickler auf Basis von GitHub Projects</title><link>https://aenix.io/de/blog/2026/07/fokus-auf-heute-aeman-tagesplanung-fuer-entwickler-auf-github-projects/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/07/fokus-auf-heute-aeman-tagesplanung-fuer-entwickler-auf-github-projects/</guid><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Andrei Kvapil</dc:creator><category>Platform Engineering</category><category>Developer Tools</category><category>Open Source</category><category>Kubernetes</category><category>Cozystack</category><description>Wie Ænix aeman gebaut hat: ein Open-Source-Tagesboard für Entwickler, das GitHub Projects v2 als einzigen Speicher und eine Kubernetes-artige Watch-API nutzt.</description><content:encoded><![CDATA[<p>Mein Name ist Andrei Kvapil, und ich bin Gründer von Ænix — wir bauen Cozystack, eine Open-Source-Cloud-Plattform, und wir helfen Unternehmen beim Aufbau ihrer Infrastruktur. Wir sind ein vollständig remote arbeitendes Unternehmen: zum Zeitpunkt des Schreibens (Juli 2026) 15 Personen, mehrere Teams (zwei Reliability-Teams, ein Entwicklungsteam, Marketing, Backoffice und weitere), verteilt über mehrere Zeitzonen. Angefangen haben wir in GitHub Projects, aber in dem Moment, in dem wir zu wachsen begannen, sind wir direkt an die Grenzen unseres eigenen Prozesses gestoßen: Aufgaben über Boards und Chats verstreut, das halbe Morgen-Sync damit verbracht herauszufinden, was überhaupt läuft, und ungeplante Arbeit, die ganze Tage auffraß, ohne irgendwo eine Spur zu hinterlassen.</p>
<p>Dieser Artikel erzählt, wie wir das mit aeman gelöst haben — einem Werkzeug, das wir selbst gebaut und kürzlich <a href="https://github.com/aenix-io/aeman">als Open Source veröffentlicht</a> haben. Ich muss aber weiter vorne anfangen.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/cover.png" alt="aeman-Board" width="1397" height="650" loading="lazy" decoding="async"></p>
<h2 id="woher-die-idee-kommt">Woher die Idee kommt</h2>
<p>Vor Jahren habe ich in einem anderen Unternehmen gearbeitet, und dort gab es zwei interne Systeme mit den schönen Namen Ford und Nixon. Kollegen haben ausführlich darüber geschrieben, deshalb hier die Kurzfassung. Es sind Boards für die Verfolgung von Tagesaufgaben, auf denen ein Entwickler genau sieht, woran er heute arbeitet. Kein Backlog über drei Monate, keine hundert Kanban-Spalten — Ihr Tag, und sonst nichts. Über Jahre hat dieses System viele Remote-Teams effektiv arbeiten lassen und die Infrastruktur vieler Kunden am Laufen gehalten.</p>
<p>Ich will ehrlich sein: Der Prozess hinter aeman ist nicht vollständig meine Idee. Ich habe ein funktionierendes System zur Prozesssteuerung übernommen, das ich bei meinem früheren Arbeitgeber gesehen hatte, und es auf unsere eigenen Prozesse und Aufgaben übertragen. Unser Board zwingt uns heute dazu, uns auf das Wichtigste zu konzentrieren — auf die geschäftlichen Aufgaben.</p>
<p>Anders als Trello geht dieses Modell davon aus, dass eine Person an einem einzigen Tag an Aufgaben in mehreren Teams arbeiten kann. Und der Tagesplan darf nicht zur Aufgabenwand werden. Wenn ein Entwickler 6 bis 10 Aufgaben eingeplant hat, realistisch aber nur 3 oder 4 abschließen kann, bleibt bei ihm ein dauerhaftes Gefühl von Schuld zurück, während das Management ein falsches Bild von hoher Auslastung bekommt. Außerdem fangen Menschen an, ständig zwischen Aufgaben zu wechseln, und das Gehirn greift naturgemäß nach denen, die sich leichter abschließen lassen. Schwere Aufgaben bleiben dann lange unangetastet liegen. Der Tagesplan muss also kurz und ehrlich sein.</p>
<h2 id="warum-kein-fertiges-werkzeug">Warum kein fertiges Werkzeug?</h2>
<p>Ich habe versucht, einen solchen Prozess auf vorhandenen Werkzeugen aufzubauen: Trello, Asana, Notion, GitHub Projects — mit unterschiedlichem Erfolg. Notion kam dem am nächsten, aber ich war nicht bereit, das ganze Team allein wegen der Boards in noch ein weiteres System zu ziehen und dafür zu bezahlen. Und mit der Zeit wuchs das Board unweigerlich, bis es nicht mehr auf einen Bildschirm passte.</p>
<p>GitHub Projects erwies sich als die tragfähigste Option. Es ist kostenlos, bietet eine bequeme API und bringt bereits alles mit, was man braucht: Sprints, Prioritäten, Status und weitere Entitäten. Es lässt sich außerdem gut erweitern. Deshalb haben wir lange damit gearbeitet.</p>
<p>Ziemlich schnell wurde aber klar, dass das Problem nicht in den Fähigkeiten des Werkzeugs lag, sondern in der UX. Es kostet viel zu viele zusätzliche Schritte, eine Aufgabe anzulegen, sie jemandem zuzuweisen und die nötigen Felder auszufüllen. Und einen angenehmen Tagesprozess haben wir um GitHub Projects herum nie hinbekommen. Sprints gibt es zwar, aber sie erwiesen sich als zu umständlich: Man kann den laufenden Sprint nicht in einem Schritt schließen und den nächsten mit den übernommenen offenen Aufgaben starten, und man kann eine Aufgabe nicht schnell auf „später“ schieben, damit sie aus dem Blick verschwindet und nicht länger um die Aufmerksamkeit des Entwicklers konkurriert.</p>
<p>Mit der Zeit zeigte sich ein weiteres Problem. Bei jedem Sync schauten wir faktisch auf eine einzige Spalte — <strong>In Progress</strong>. Dort passierte die ganze Arbeit, während die Karten in den anderen Spalten langsam zu einem Aufgabenfriedhof wurden: noch auf dem Board, aber nicht mehr Teil des Tagesprozesses und ohne Bewegung. GitHub Projects erwies sich als ausgezeichneter Ort, um Aufgaben abzulegen, und als schwacher, um den Tagesfokus eines Teams zu steuern.</p>
<p><strong>Genau deshalb habe ich, als ich mit dem Bau von aeman anfing, GitHub Projects als Backend des neuen Systems gewählt und die Oberfläche und den Workflow darauf aufgesetzt.</strong></p>
<h2 id="die-grundidee-genau-die-karten-die-sie-heute-brauchen">Die Grundidee: genau die Karten, die Sie heute brauchen</h2>
<p>Das Ziel von aeman ist, die heute relevanten Aufgaben sichtbar zu machen und den Entwickler darauf zu fokussieren. Idealerweise verlässt ein Entwickler das Morgen-Sync mit einer Liste von Aufgaben, an denen er an diesem Tag <strong>definitiv</strong> arbeiten wird. Alles andere wandert auf morgen oder auf nächste Woche — und verschwindet physisch vom Board, damit es nicht länger ins Auge fällt.</p>
<p>Die zweite Idee: Ungeplante Arbeit muss sichtbar sein. Jeder kennt Tage, die von einem plötzlichen Incident oder einer dringenden Anfrage aus einem Nachbarteam aufgefressen werden. Üblicherweise wird diese Arbeit nirgends festgehalten, und am Ende des Sprints kann niemand erklären, wo die Zeit geblieben ist. In aeman hat sie eine eigene Zone: Sie tragen sie im Nachhinein als eine Karte ein, und der Tag verschwindet nicht mehr spurlos (Screenshots weiter unten). Beim täglichen Sync lässt sie sich dann besprechen und in den geplanten Block verschieben.</p>
<p>Die dritte Idee: Arbeit in mehreren Teams ist eine Eigenschaft des Modells, kein Filter. In einem kleinen Unternehmen kann ein Entwickler an Aufgaben in mehreren Teams arbeiten — das gilt besonders für Gründer, die ohnehin alles gleichzeitig jonglieren. In aeman sind Teams eine Dimension des Boards: Ein Sprint wird je Team geführt, jedes Team hat seinen eigenen Wochenplan, und das Me-Board sammelt die Karten eines Tages aus allen Teams des Entwicklers auf einmal. Sie müssen nicht zwischen Boards springen, um Ihren Tag zu sehen. Eine Aufgabe wandert außerdem frei zwischen Personen und Teams — sie kann von einem Tag auf den anderen die Zuständigkeit wechseln, und das ist ein normaler Arbeitsmodus, dem das Werkzeug nicht im Weg stehen sollte.</p>
<p>Und die vierte Idee: Ein Team-Lead braucht ein Werkzeug, das den Status jeder Aufgabe innerhalb einer Minute zeigt, ohne Leute mit Rückfragen aus der Arbeit zu reißen.</p>
<p>Philosophisch steht aeman Todoist näher als einem klassischen Kanban-Board. Karten sind bewusst kurz: Im Normalmodus sehen Sie nur den Titel, die Beschreibung öffnet sich per Doppelklick. Die Beschreibung nimmt Links in freier Form auf — Pull Requests, GitHub-Issues, Telegram-Chats, was auch immer — und aeman erkennt sie automatisch und zeigt eine Schaltfläche, um direkt dorthin zu springen. Das hält den Hauptbildschirm sauber, und eine weitere abgeschlossene Aufgabe erzeugt jenes befriedigende Gefühl, das jeder kennt, der einen guten Task-Manager benutzt.</p>
<h2 id="wie-es-aussieht">Wie es aussieht</h2>
<h2 id="das-me-board-ihr-tag">Das Me-Board: Ihr Tag</h2>
<p>Ein Entwickler öffnet aeman morgens und sieht seinen Tag: Karten, gruppiert in vier farbige Zonen. Das ist nicht die Eisenhower-Matrix, die Aufteilung ist eine andere:</p>
<ul>
<li><strong>Rot</strong> — <em>urgent</em>, muss heute erledigt werden</li>
<li><strong>Grau</strong> — <em>planned</em>, gewöhnliche geplante Arbeit, die auch länger als einen Tag dauern kann</li>
<li><strong>Gelb</strong> — <em>unplanned</em>, was im Lauf des Tages hereinkam</li>
<li><strong>Grün</strong> — <em>nice to have</em>, erst dann, wenn alles andere fertig ist</li>
</ul>
<p>Das Board zieht Karten aus allen Teams des Entwicklers, also aus dem jeweils aktuellen Sprint jedes Teams. Die Teamauswahl am oberen Rand engt die Liste auf ein einzelnes Team ein oder blendet alle Karten aus, die erledigt, blockiert oder im Review sind — es bleibt nur, woran Sie hier und jetzt arbeiten können, wenn Deep Work ansteht. Jede Karte hat einen Fortschrittsregler von 0 bis 100 % in Schritten von 10 % (den Fortschrittsbalken auf „fertig“ zu ziehen, macht erstaunlich viel Freude), eine Stufe (Review / Locked / Recurrent / Done), die den Balken umfärbt, einen Zähler für die Tage in Bearbeitung sowie Links zu einem Issue oder einem PR. Rechts liegt ein Notizbereich: ein persönliches Tagesprotokoll, in dem Sie während der Arbeit festhalten können, was anfällt. So müssen Sie beim nächsten Standup nicht im Gedächtnis kramen — Sie überfliegen die Notizen und berichten, was Sie getan haben. Notizen leben im Kontext des Tages; morgen ist das Board leer, aber Sie können jederzeit einen Tag zurückgehen und sie noch einmal lesen.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/02.png" alt="Das Me-Board in aeman" width="1444" height="966" loading="lazy" decoding="async"></p>
<h2 id="das-team-board-das-ganze-team-auf-einen-blick">Das Team-Board: das ganze Team auf einen Blick</h2>
<p>Die Sicht des Team-Leads: ein Raster aus Personen und Zonen für einen ausgewählten Tag. Spalten sind die Entwickler mit ihren Avataren, Zeilen dieselben farbigen Zonen. Sie sehen sofort, wer woran arbeitet, wo es brennt und wer überlastet ist. Der Team-Lead legt Karten auch von hier aus an: ein paar Klicks, und eine Aufgabe ist erstellt, zugewiesen und priorisiert.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/03.png" alt="Das Team-Board in aeman" width="1444" height="966" loading="lazy" decoding="async"></p>
<p>Im Me-Modus kann der Team-Lead außerdem in die Rolle eines Entwicklers schlüpfen (Schaltfläche <strong>View as</strong>) — das Board mit dessen Augen ansehen und bei Bedarf aufräumen.</p>
<h2 id="tagessprints-und-carry-over">Tagessprints und Carry-over</h2>
<p>Unsere Sprints sind kurz — ein Tag — und sie zählen <strong>vorwärts</strong>, nicht rückwärts. Im Morgen-Sync bespricht das Team zuerst, was gestern fertig geworden ist, und dann drückt der Team-Lead auf <strong>Carry over</strong>: Jede unerledigte Karte wandert in den neuen Sprint (heute), erledigte bleiben in der Historie von gestern. Wiederkehrende Aufgaben werden automatisch neu angelegt. Das ist hier die Tagesplanung, und sie dauert Minuten.</p>
<p>Ergibt die Planung, dass eine Aufgabe heute definitiv nicht stattfindet, gibt es die Schaltflächen <strong>+1 day</strong> und <strong>+1 week</strong>: Die Karte verschwindet bis zu ihrem Tag vom Board, und es geht nichts an Historie verloren. Ist der Tag gekommen, taucht sie wieder auf.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/04.png" alt="Carry-over in aeman" width="529" height="287" loading="lazy" decoding="async"></p>
<h2 id="der-wochenplan">Der Wochenplan</h2>
<p>Hier sind wir von der ursprünglichen Idee abgewichen und haben angefangen, unseren eigenen Workflow auf das entstandene Werkzeug zu übertragen.</p>
<p>Die Gründer und ich haben die Woche des Teams früher geplant, indem wir eine neue Liste von Wochenaufgaben in Google Sheets geschrieben und jedem Team eine Nachricht mit dem „Fokus der Woche“ über Slack geschickt haben. Auch dieser Prozess ist inzwischen in aeman umgezogen.</p>
<p>Unter dem Team-Raster liegt der Wochenplan: die geschäftlichen Aufgaben des Teams für die Woche, aufgeteilt in zwei Bahnen, „bis Mittwoch“ und „bis Freitag“. Einmal pro Woche legen die Gründer dort Aufgaben ab, und die Aufgaben warten auf ihren Einsatz. Der Team-Lead zieht eine Plankarte auf einen Entwickler; sie erscheint auf dessen Tagesboard und bleibt zugleich mit einer farbigen Markierung im Plan. Ein gemeinsamer Fortschrittsbalken zeigt, wie das Team in der Woche steht, und das wöchentliche <strong>Carry over</strong> verschiebt alles noch Offene in die nächste Woche.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/05.png" alt="Der Wochenplan in aeman" width="1444" height="966" loading="lazy" decoding="async"></p>
<h2 id="reviews-teilaufgaben-und-das-aktivitätsprotokoll">Reviews, Teilaufgaben und das Aktivitätsprotokoll</h2>
<p>Eine Aufgabe ins Review zu schicken erzeugt eine verknüpfte Karte für den Reviewer, mit einer Rückkopplung: Solange das Review offen ist, steht das Original auf der Stufe Review, und sobald der Reviewer seine eigene Karte auf 100 % bringt, wird das Original automatisch freigegeben. Große Aufgaben zerfallen in Teilaufgaben, deren Fortschritt in die übergeordnete Karte einfließt. Jede Aktion auf dem Board wird in das Aktivitätsprotokoll der Karte geschrieben, sodass sich ihre gesamte Historie im Nachhinein rekonstruieren lässt: wer sie verschoben hat, wann sich der Fortschritt geändert hat und warum sie in einem anderen Sprint gelandet ist.</p>
<h2 id="ein-tag-mit-aeman">Ein Tag mit aeman</h2>
<p>So sieht der ganze Ablauf aus:</p>
<ol>
<li><strong>Morgen-Sync.</strong> Wir öffnen das Team-Board von gestern, der Team-Lead teilt seinen Bildschirm, und wir gehen die Karten durch: was fertig ist, was hängt, Person für Person, wobei der Lead die Status unterwegs korrigiert. Dann drückt er <strong>Carry over</strong>, und alles Unerledigte wandert in den heutigen Tag. Anschließend besprechen wir das Neue: Der Lead legt Karten im Gespräch an und verteilt sie auf Personen und Zonen.</li>
<li><strong>Der Tag.</strong> Alle arbeiten von ihrem eigenen Me-Board aus. Kommt etwas Dringendes herein — eine Karte in die gelbe Zone. Ist etwas blockiert — Stufe Locked, und der Lead sieht es. Der Fortschritt wandert nebenher mit; Gedanken und Erkenntnisse landen in den Notizen des Tages.</li>
<li><strong>Fertig</strong> — die Karte steht auf 100 %, Stufe Done. Braucht sie ein Review, dann <strong>Send to review</strong>, und sie erscheint beim Reviewer.</li>
<li><strong>Morgen</strong> wiederholt sich das Ganze.</li>
</ol>
<p>Jedes Board ist <strong>live</strong>: Änderungen von Kolleginnen, Kollegen und KI-Agenten erscheinen auf allen Bildschirmen in etwa einer Sekunde, ganz ohne Neuladen. Wie das funktioniert, steht weiter unten.</p>
<h2 id="unter-der-haube">Unter der Haube</h2>
<p>Jetzt der Teil, für den das Engineering-Publikum gekommen ist.</p>
<h2 id="github-projects-v2-als-einziger-speicher">GitHub Projects v2 als einziger Speicher</h2>
<p>aeman hat überhaupt keine eigene Datenbank. Jede Karte ist ein Item auf einem GitHub-Projects-Board, und jedes Feld — Zone, Fortschritt, Sprint, Wochenplan — ist ein gewöhnliches Projektfeld. aeman legt die benötigten Felder sogar bedarfsgesteuert an: Richten Sie es auf ein beliebiges leeres Projekt, und die erste Änderung erzeugt, was fehlt. Man könnte sagen, aeman ist eine spezialisierte Sicht auf ein GitHub-Board: Dasselbe Board öffnet sich in der nativen Oberfläche von GitHub, die Daten gehören immer Ihnen, und Sie können sich jederzeit von aeman verabschieden, ohne irgendetwas migrieren zu müssen.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/06.png" alt="Dasselbe Board in der Oberfläche von GitHub Projects" width="1444" height="966" loading="lazy" decoding="async"></p>
<h2 id="eine-api-im-kubernetes-stil">Eine API im Kubernetes-Stil</h2>
<p>Die API von aeman ist bewusst nach denselben Prinzipien gebaut wie die Kubernetes-API — einem Muster, das sich für die Synchronisation verteilten Zustands bewährt hat. Jede Entität — Card, Sprint, Ordering, Presence — ist eine eigene Ressource mit den vertrauten Feldern kind, metadata und spec.</p>
<p>Der Client folgt dem bekannten Schema <strong>list + watch</strong>. Er holt zunächst einen vollständigen Snapshot des Boards, öffnet dann einen WebSocket und empfängt einen Strom von ADDED-, MODIFIED- und DELETED-Ereignissen. Nach einer vollständigen Resynchronisation sendet der Server einen speziellen Sync-Frame, der signalisiert, dass der lokale Zustand vollständig aktuell ist.</p>
<p>Im Ergebnis arbeitet jeder geöffnete Browser-Tab wie ein Kubernetes-Informer mit eigenem lokalem Cache. Jede Änderung durch andere Nutzer oder durch einen KI-Agenten erscheint auf allen offenen Bildschirmen in etwa einer Sekunde, und die eigenen Änderungen werden Ihnen nicht zurückgespiegelt. GET /api/v1 liefert einen maschinenlesbaren Katalog aller verfügbaren Ressourcen und Endpunkte, sodass Clients und KI-Agenten die Form der API nicht vorab kennen müssen.</p>
<h2 id="die-github-api-ist-langsam-was-tun">Die GitHub-API ist langsam. Was tun?</h2>
<p>Das wichtigste technische Problem des Projekts: GraphQL-Mutationen bei GitHub brauchen Hunderte von Millisekunden, mitunter ganze Sekunden; Lastspitzen laufen in sekundäre Rate Limits; und — Überraschung — die Read-Replicas von GitHub hinken den Schreibvorgängen um mehrere Sekunden hinterher. Schreibt man direkt durch, wird die Oberfläche zur Diaschau: Regler bewegen, warten; Karte ziehen, warten.</p>
<p>Schreibvorgänge in aeman folgen deshalb einem <strong>Write-behind</strong>-Schema, und der Nutzer wartet nie auf GitHub. Jede Änderung wird sofort auf den Server-Cache angewendet, ist auf allen offenen Boards unmittelbar sichtbar und geht erst danach asynchron zu GitHub. Schreibvorgänge laufen über eine Hintergrundwarteschlange mit Rate Limiting und automatischen Wiederholungen bei transienten Fehlern, um den Rate Limits der GitHub-API aus dem Weg zu gehen.</p>
<p>Die Warteschlange kann aufeinanderfolgende Änderungen zusammenfassen, ganz ähnlich wie die DeltaFIFO in Kubernetes. Ändert ein Nutzer dasselbe Kartenfeld mehrfach hintereinander, geht nur der letzte Wert an GitHub. Für Karteninhalte gilt eine andere Regel: Text geht niemals verloren. Bearbeitet ein Nutzer eine Beschreibung oder ergänzt Notizen in schneller Folge, führt die Warteschlange sie zu einer finalen Fassung zusammen und schickt sie in einer einzigen Anfrage. Bis der Schreibvorgang bestätigt ist, existieren neue Notizen unter temporären Bezeichnern, die anschließend automatisch gegen die echten getauscht werden.</p>
<p>Scheitert ein Schreibvorgang auch nach allen Wiederholungen, benachrichtigt der Server alle verbundenen Clients und liest den Board-Zustand erneut aus GitHub. GitHub bleibt die einzige Quelle der Wahrheit. Beim Herunterfahren wartet aeman zunächst, bis die Warteschlange leergelaufen ist, damit bereits gegenüber dem Nutzer bestätigte Änderungen nicht verloren gehen.</p>
<p>GitHub garantiert nicht, dass eine Änderung in dem Moment lesbar ist, in dem sie geschrieben wurde. Manchmal liefert die API unmittelbar nach einem erfolgreichen Schreibvorgang noch eine Weile den alten Zustand zurück. Dadurch könnte ein Nutzer sehen, wie eine gerade verschobene Karte zurückspringt, eine gelöschte Karte wieder auftaucht oder eine neue an der falschen Stelle landet. Um das zu vermeiden, behandelt aeman die eigenen jüngsten Schreibvorgänge für ein kurzes Zeitfenster als vertrauenswürdiger als frische Daten von GitHub. Sobald GitHub den aktuellen Zustand zurückliefert, schaltet das System automatisch wieder darauf um. Im Ergebnis sieht der Nutzer nie, wie die Oberfläche zurückspringt.</p>
<h2 id="kommentare-und-aktivitätsprotokoll">Kommentare und Aktivitätsprotokoll</h2>
<p>Auch Notizen und Änderungshistorie liegen in GitHub, ohne separate Datenbank. Bei Entwurfskarten steht das Protokoll direkt im Body des Issues, hinter einer speziellen Markierung <code>&lt;!-- aeman:log --&gt;</code>. Ist eine Karte mit einem bestehenden Issue oder Pull Request verknüpft, werden Notizen zu gewöhnlichen GitHub-Kommentaren und sind für alle in der Diskussion sichtbar.</p>
<p>Jede Aktion auf dem Board — eine Karte anlegen, den Fortschritt ändern, zwischen Sprints verschieben, ins Review schicken und so weiter — hält der Server als maschinenlesbare Ereigniszeile fest. Damit Abonnenten nicht unter Dutzenden Benachrichtigungen begraben werden, sammeln sich all diese Ereignisse in einem einzigen Protokollkommentar, der nach und nach ergänzt wird. Das Protokoll ist auf die letzten 200 Ereignisse begrenzt, Notizen von Nutzern werden nie gelöscht.</p>
<p>Das Ergebnis ist eine vollständige Änderungshistorie für jede Karte: wer sie wann verschoben hat, wie sich der Fortschritt entwickelt hat und warum sie in dem einen oder anderen Sprint gelandet ist. Dieses Protokoll ist nicht nur für die Nachvollziehbarkeit nützlich, sondern auch als Datenquelle für Statistiken und Kennzahlen.</p>
<h2 id="ein-austauschbares-backend">Ein austauschbares Backend</h2>
<p>aeman war von Anfang an für ein austauschbares Backend ausgelegt. Heute liegen die Karten in GitHub Projects, das System selbst ist aber nicht an GitHub gebunden. Die gesamte Interaktion mit dem Speicher liegt hinter einem Backend-Interface, sodass die Unterstützung eines neuen Backends darauf hinausläuft, genau dieses eine Interface zu implementieren.</p>
<p>In künftigen Iterationen möchte ich ein Git-Backend ergänzen, das Karten als einfache Dateien im Repository ablegt. Weder die Oberfläche noch die Geschäftslogik der Anwendung müssen sich dafür ändern.</p>
<p>Die Pakete unter pkg/ lassen sich außerdem als gewöhnliche Go-Bibliothek verwenden, womit Sie die Board-Engine in Ihr eigenes Werkzeug einbetten können. Mehr dazu steht in docs/embedding.md.</p>
<h2 id="mcp-für-ki-agenten">MCP für KI-Agenten</h2>
<p>Dieselbe Binärdatei kann auch als MCP-Server laufen. Damit werden Claude und andere KI-Agenten zu vollwertigen Teilnehmern des Prozesses: Sie legen Karten an und verschieben sie, hinterlassen Notizen, führen den Carry-over zwischen Sprints aus und erledigen weitere Operationen.</p>
<p>Es gibt keine separate API für KI und keine Sonderrechte. Jede Aktion läuft durch dieselbe Domänenschicht wie eine menschliche Aktion, mit demselben Vertrag und denselben Prüfungen, und die Änderungen sind für alle sofort sichtbar.</p>
<p>Neben dem lokalen Modus bietet aeman einen öffentlich erreichbaren MCP-Server. Entwickler können KI-Clients anbinden, ohne lokal etwas zu installieren, und direkt aus Claude Code und anderen KI-Agenten heraus mit ihren Aufgaben arbeiten.</p>
<p><img src="https://aenix.io/img/blog/medium/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects/07.png" alt="aeman, gesteuert von einem KI-Agenten über MCP" width="1444" height="966" loading="lazy" decoding="async"></p>
<h2 id="so-probieren-sie-es-aus">So probieren Sie es aus</h2>
<p>Am einfachsten probieren Sie aeman lokal mit Ihrem eigenen GitHub-Token aus.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gh auth login <span class="c1"># die Scopes project und repo werden benötigt</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/aenix-io/aeman
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> aeman
</span></span><span class="line"><span class="cl">make build
</span></span><span class="line"><span class="cl">./aeman serve
</span></span></code></pre></div><p>Der Browser öffnet sich automatisch unter http://127.0.0.1:8765. Als Board können Sie jedes beliebige GitHub-Projekt verwenden — am besten ein neues, leeres. aeman legt bei der ersten Änderung alle benötigten Felder selbst an.</p>
<p>Für die Teamarbeit gibt es einen Mehrbenutzermodus. Das Repository bringt eine fertige docker-compose.yml mit, die Anmeldung über eine GitHub-OAuth-App wird unterstützt, und jeder Nutzer arbeitet mit seinem eigenen GitHub-Token. Eine ausführliche Anleitung steht in docs/deploy.md.</p>
<h2 id="wo-wir-gelandet-sind">Wo wir gelandet sind</h2>
<p>Das gesamte Unternehmen lebt inzwischen seit einigen Wochen auf aeman. Produktmanager und Team-Leads haben den neuen Planungsansatz schnell angenommen, wobei es — wie bei jedem neuen Werkzeug — auch Skepsis gab. Der wichtigste Effekt war aber ein anderer: Morgens weiß jeder Entwickler, woran er heute arbeiten wird, ungeplante Arbeit ist nicht länger unsichtbar, und die täglichen Syncs sind sehr viel konstruktiver und fokussierter geworden.</p>
<p>Das Projekt ist Open Source unter der Apache-2.0-Lizenz und auf GitHub verfügbar: <a href="https://github.com/aenix-io/aeman">github.com/aenix-io/aeman</a>.</p>
<p>Wenn Sie aeman ausprobieren, freue ich mich über jede Rückmeldung, über Berichte zu Problemen, auf die Sie stoßen, und über Ihre Geschichten dazu, wie Planung bei Ihnen funktioniert.</p>
<hr>
<p>Dieser Beitrag ist eine deutsche Fassung des Artikels <a href="https://blog.aenix.io/focus-on-today-how-we-built-aeman-a-daily-planning-board-for-engineers-on-top-of-github-projects-c59da4451b8b">Focus on today: how we built aeman, a daily planning board for engineers on top of GitHub Projects</a>, zuerst erschienen bei <a href="https://blog.aenix.io">Ænix</a> auf Medium.</p>
]]></content:encoded></item><item><title>Cozystack 1.6: Talos-Worker, Tenant-SSO, SecurityGroups und hierarchische Quotas</title><link>https://aenix.io/de/blog/2026/07/cozystack-1-6-talos-worker-tenant-sso-hierarchische-quotas/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/07/cozystack-1-6-talos-worker-tenant-sso-hierarchische-quotas/</guid><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><dc:creator>Timur Tukaev</dc:creator><category>Cozystack</category><category>Kubernetes</category><category>Talos</category><category>Multi-tenancy</category><category>KubeVirt</category><category>Platform Engineering</category><description>Cozystack v1.6.0 stellt Tenant-Worker auf Talos um und bringt Tenant-OIDC, eine SecurityGroup-Firewall-API, hierarchische Quotas und etcd v1alpha2.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cozystack-1-6-talos-worker-tenant-sso-hierarchische-quotas.jpg" alt="Cozystack 1.6: Talos-Worker, Tenant-SSO, SecurityGroups und hierarchische Quotas" width="1200" height="630" loading="lazy" decoding="async"></p>
<p>Cozystack v1.6.0 ist am 22. Juli 2026 erschienen. Das Release ersetzt den Ubuntu-und-kubeadm-Bootstrap der Tenant-Kubernetes-Worker durch Talos Linux über Cluster API, schließt die Migration auf <code>etcd-operator v1alpha2</code> mit In-place-Adoption laufender Cluster ab, bringt OIDC-Single-Sign-on für Tenant-kube-apiserver und einzelne Grafana-Instanzen, führt die tenantseitige Firewall-API <code>SecurityGroup</code> ein und macht Ressourcenquotas hierarchisch. Alle Fixes aus v1.5.1 und v1.5.2 sind enthalten.</p>
<p>Es bringt außerdem die größte Upgrade-Oberfläche seit v1.0 mit. Die Migrations-<code>targetVersion</code> springt von 45 auf 54, es laufen also die Migrationen 45 bis 53 als Pre-Upgrade-Hooks — und drei davon können das Upgrade blockieren oder den Cluster festfahren, wenn ihre Voraussetzungen nicht erfüllt sind. Planen Sie ein Wartungsfenster und arbeiten Sie die Prüfungen unten ab.</p>
<h2 id="vor-dem-upgrade-lesen">Vor dem Upgrade lesen</h2>
<p><strong>Steigen Sie auf v1.6.4 (oder das neueste 1.6.x) um, nicht auf v1.6.0.</strong> Drei der Fixes nach v1.6.0 gehören zur Sorte, die still versagt:</p>
<ul>
<li>v1.6.0 lieferte eine <strong>fail-open</strong>-Fassung von <code>hack/seaweedfs-naming-audit.sh</code> aus — ausgerechnet des Skripts, dessen Ausgabe einen Runbook-Schritt freigibt, der PVCs löscht. Jeder <code>kubectl</code>-Aufruf darin war mit <code>2&gt;/dev/null</code> stummgeschaltet, ein Timeout oder eine RBAC-Ablehnung erzeugte also eine leere „alles sauber“-Tabelle, die byte-identisch zu der einer tatsächlich sauberen Flotte war. Behoben in v1.6.1. Führen Sie das Audit aus einem Checkout ab v1.6.1 aus und lesen Sie den <strong>Exit-Code</strong>, nicht die Tabelle. Ein sauberes Ergebnis aus der v1.6.0-Fassung beweist nichts.</li>
<li>v1.6.2 behebt, dass Velero-CRDs auf der zuerst installierten Version einfrieren, weil Helm das Verzeichnis <code>crds/</code> eines Charts beim Upgrade nie anfasst. Sobald das Velero-Image auf eine Version mit neuen Backup-Phasen wechselte, wies der Apiserver die Phasenübergänge gegen die veralteten CRDs ab — <strong>die Backups liefen nicht mehr, während die HelmRelease grün blieb</strong>.</li>
<li>Ebenfalls in v1.6.2: Die Standard-<code>Strategy</code>-CRs und die Velero-<code>BackupStorageLocation</code> hingen an einem Helm-<code>lookup</code>, der ausgeführt wurde, während das referenzierte Objekt noch entstand. Lieferte der Lookup nichts, wurden die Objekte dauerhaft übersprungen — der helm-controller rendert eine Release mit unveränderten Charts und Values nicht erneut.</li>
</ul>
<p>Wer von der 1.5-Linie kommt, geht <strong>zuerst über v1.5.4</strong>. v1.5.4 ist das erste 1.5.x-Release mit <code>targetVersion: 46</code>, und dessen Slot 45 setzt <code>helm.sh/resource-policy: keep</code> auf die CAPI-Objekte <code>KubeadmConfigTemplate</code>. 1.6 entfernt <code>KubeadmConfigTemplate</code> vollständig aus dem Tenant-Chart <code>kubernetes</code> — die Worker wechseln auf <code>TalosConfigTemplate</code> —, sodass Helm das Template ohne diesen Pin löscht, während das kubeadm-basierte MachineSet noch mitten im Rollover ist und seine <code>bootstrap.configRef</code> darauf zeigt. Vorher prüfen:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io -A <span class="se">\
</span></span></span><span class="line"><span class="cl">  -o custom-columns<span class="o">=</span><span class="s1">&#39;NS:.metadata.namespace,NAME:.metadata.name,KEEP:.metadata.annotations.helm\.sh/resource-policy&#39;</span>
</span></span></code></pre></div><p>Eine Zeile mit <code>&lt;none&gt;</code> bedeutet, dass der Pin nicht gesetzt wurde. Das gehört vor dem 1.6-Upgrade korrigiert.</p>
<h3 id="prüfungen-vor-dem-upgrade">Prüfungen vor dem Upgrade</h3>
<p>Diese Kommandos gegen den Management-Cluster ausführen, bevor das v1.6-Plattformpaket angewendet wird.</p>
<p><strong>1. Die etcd-Adoption braucht ein erreichbares Backup-Ziel.</strong> Migration 50 adoptiert jeden Legacy-Cluster <code>etcd.aenix.io/v1alpha1</code> auf den neuen Operator und legt vorher zwingend einen Snapshot an. Lässt sich das Snapshot-Ziel nicht auflösen, beendet sich die Migration mit Exit 1 und stoppt das Upgrade.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get etcdclusters.etcd.aenix.io -A
</span></span><span class="line"><span class="cl">kubectl get etcds.strategy.backups.cozystack.io cozy-default-etcd
</span></span><span class="line"><span class="cl">kubectl get secret cozy-backups-creds -n cozy-velero
</span></span><span class="line"><span class="cl">kubectl get buckets.apps.cozystack.io cozy-backups -n tenant-root
</span></span></code></pre></div><p>Gibt das erste Kommando nichts aus, ist Migration 50 wirkungslos.</p>
<p><strong>2. SeaweedFS-Namens-Audit.</strong> v1.6.0 pinnt <code>fullnameOverride: seaweedfs</code> und adoptiert den laufenden Workload-Satz in place. Zwei Zustände lassen sich nicht automatisch adoptieren, und das Chart bricht das Rendering ab, statt zu raten: Klasse <code>S</code> (frisch auf 1.5.x installiert, Daten auf PVCs <code>data1-seaweedfs-system-volume-*</code>) und Klasse <code>MIXED</code> (beide Namensgenerationen vorhanden). Beide müssen vor dem Upgrade nach dem Runbook <code>seaweedfs-431-rename-recovery</code> bereinigt werden. Klasse <code>L</code> erfordert nichts. Ein Cluster, der von 1.4.x direkt auf 1.6 geht, hat nie umbenannt und ist nicht betroffen.</p>
<p><strong>3. Tenant-Cluster noch auf Kubernetes v1.30.</strong> v1.30 fällt aus der Talos-zu-Kubernetes-Supportmatrix, und das Chart verweigert das Rendering. Migration 46 patcht lebende CRs auf v1.31, aber eine über GitOps verwaltete CR wird beim nächsten Source-Reconcile wieder überschrieben — <code>spec.version</code> also in Git anheben.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get kuberneteses.apps.cozystack.io -A <span class="se">\
</span></span></span><span class="line"><span class="cl">  -o custom-columns<span class="o">=</span><span class="s1">&#39;NS:.metadata.namespace,NAME:.metadata.name,VERSION:.spec.version&#39;</span>
</span></span></code></pre></div><p><strong>4. Handgebaute StorageClasses im Tenant, die kollidieren.</strong> Remote zugreifbare LINSTOR-StorageClasses werden jetzt unter demselben Namen innerhalb jedes Tenant-Clusters angelegt. Eine manuell erstellte Tenant-StorageClass mit kollidierendem Namen — typischerweise <code>replicated</code> — blockiert die propagierte Klasse und legt die Tenant-CSI-Release lahm. Jede solche, nicht von Helm verwaltete Klasse vorher löschen. Infrastrukturklassen, die node-lokal bleiben müssen, brauchen explizit <code>linstor.csi.linbit.com/allowRemoteVolumeAccess: &quot;false&quot;</code>; eine fehlende Annotation gilt als remote zugreifbar.</p>
<p><strong>5. Veraltete Backup-Values im etcd-Modul.</strong> Der Block <code>backup.*</code> am Tenant-Modul <code>etcd</code> entfällt in diesem Release. Vorher auf eine <code>BackupClass</code> mit der <code>Etcd</code>-Strategie umstellen.</p>
<p><strong>6. Aufstieg von v1.4.x?</strong> Die Anforderung aus v1.5.0 gilt weiterhin: Kubernetes 1.33 oder neuer auf dem Management-Cluster und auf jedem Tenant-Cluster mit Flux-Addon.</p>
<h2 id="talos-linux-für-tenant-kubernetes-worker">Talos Linux für Tenant-Kubernetes-Worker</h2>
<p>Tenant-Worker booten nicht länger Ubuntu und bootstrappen nicht mehr über kubeadm. Phase 1 des Kubernetes-App-Splits ersetzt diesen Pfad durch Talos Linux, gesteuert vom <code>cluster-api-bootstrap-provider-talos</code> (CABPT v0.6.12), der als zweiter Bootstrap-Provider neben kubeadm registriert ist, plus einem Sidecar <code>clastix/talos-csr-signer</code> im Kamaji-Control-Plane-Pod.</p>
<p>Die Talos-PKI — eine Ed25519-CA plus trustd-TLS — wird über cert-manager mit stabilen, wiederverwendeten Talos-Secrets erzeugt. Der Kamaji-Control-Plane-Provider trägt einen Upstream-gebundenen Patch, der <code>KamajiControlPlane.spec.network.additionalServicePorts</code> freilegt, damit trustd (50001/TCP) am Apiserver-Service veröffentlicht werden kann. Die Worker booten das Talos-OpenStack-Raw-Image über ein CDI-<code>DataVolume</code> aus der Image Factory, wobei die Systemplatte als virtio-blk mit <code>blockSize.custom: logical=512, physical=4096</code> bereitgestellt wird — damit 4Ki-native Backends wie LINSTOR/DRBD unter den <code>O_DIRECT</code>-Schreibvorgängen von QEMU korrekt arbeiten und SeaBIOS trotzdem bootet.</p>
<p>Das separate PVC <code>disk-kubelet</code> entfällt. Talos legt <code>EPHEMERAL</code> selbst auf der einen Systemplatte an, die <code>nodeGroups[*].diskSize</code> jetzt dimensioniert.</p>
<p>Betrieblich bedeutet das:</p>
<ul>
<li><strong>Bestehende Tenants rollen automatisch um.</strong> Alte Maschinen werden ohne manuellen Eingriff durch Talos-Worker ersetzt, und Migration 45 pinnt die auslaufenden <code>KubeadmConfigTemplate</code>-Objekte mit <code>helm.sh/resource-policy: keep</code>, damit Helm sie nicht mitten im Rollover entfernt. Planen Sie trotzdem einen vollständigen Worker-Pool-Austausch pro Tenant-Cluster ein: Worker-Platten werden neu bereitgestellt, Container-Images neu gezogen.</li>
<li><strong>Die MachineHealthCheck-Remediation der Worker ist jetzt standardmäßig aktiv.</strong> <code>maxUnhealthy</code> wechselt von fest verdrahteten <code>0</code> auf <code>nodeHealthCheck.maxUnhealthy</code> mit Vorgabe <code>&quot;50%&quot;</code>. CAPI löscht und ersetzt jetzt also ungesunde Worker-Machines. Mit <code>nodeHealthCheck.maxUnhealthy: &quot;0%&quot;</code> behalten Sie das alte Verhalten, bis die Flotte auf Talos stabil ist. Zusätzlich gibt es Overrides pro Node-Gruppe für <code>maxUnhealthy</code> und <code>nodeStartupTimeout</code>, sodass eine Stateful-Gruppe auf <code>0%</code> bleiben kann, während eine zustandslose <code>50%</code> toleriert.</li>
<li><strong>Die Standard-Node-Gruppe <code>md0</code> wird nicht mehr in jeden Cluster gemischt.</strong> <code>nodeGroups</code> ist jetzt <code>{}</code> als Vorgabe, und <code>md0</code> greift nur noch, wenn gar keine Node-Gruppen konfiguriert sind. Migration 47 pinnt <code>md0</code> explizit auf bestehende CRs, um die laufende Topologie zu erhalten; sie ist fail-closed und bricht das Upgrade ab, statt Helm ein lebendes <code>md0</code>-MachineDeployment prunen zu lassen.</li>
<li><strong>Neue Cluster mit <code>nodeGroups: {}</code> starten ohne Worker.</strong> Das Chart verwaltet <code>MachineDeployment.spec.replicas</code> nicht mehr — der Cluster-Autoscaler besitzt das Feld allein, initialisiert aus <code>minReplicas: 0</code>. Entweder eine Node-Gruppe mit <code>roles: [ingress-nginx]</code> und <code>minReplicas &gt;= 1</code> mitgeben, oder den Autoscaler <code>md0</code> hochfahren lassen, sobald ingress-nginx-Pods <code>Pending</code> werden. Der Vorteil für bestehende Cluster: <code>helm upgrade</code> drainiert Worker nicht mehr bei jedem Plattform-Bump auf fest verdrahtete <code>replicas: 2</code>.</li>
<li><strong>Air-Gapped-Installationen verlieren den <code>registries.mirrors</code>-Durchgriff</strong> auf Tenant-Worker — das per Helm gerenderte Secret <code>*-patch-containerd</code> hat in der Talos-Machineconfig keinen Konsumenten mehr und wurde entfernt. Talos-OS-Image und Installer bleiben über <code>talos.imageFactoryURL</code> und <code>talos.installerRepository</code> überschreibbar, Registry-Spiegelung im Gast ist aber ein Follow-up für Phase 2.</li>
<li><strong>Worker-Platten nutzen jetzt standardmäßig die anwendungsseitige StorageClass <code>replicated</code>.</strong> Eine Node-Gruppe ohne gesetztes <code>storageClass</code> griff früher auf die Default-StorageClass des Management-Clusters zurück; jetzt fällt sie auf die Anwendungs-<code>storageClass</code> zurück, weil linstor-csi v1.11.2 ReadWriteMany-Volumes auf einer Nicht-DRBD-Klasse ablehnt und Worker-VMs RWX für die Live-Migration brauchen. Das gerenderte Worker-Template ändert sich dadurch, jedes Worker-MachineDeployment rollt also einmal.</li>
</ul>
<p>Die Tenant-HelmRelease <code>kubernetes</code> meldet jetzt Ready, sobald Helm fertig ist (<code>DisableWait</code>), und wartet nicht mehr auf Worker- oder Addon-Bereitschaft; die Gesundheit des Worker-Rollouts verfolgt stattdessen der <code>WorkloadMonitor</code>.</p>
<h2 id="etcd-operator-v1alpha2-mit-in-place-adoption">etcd-operator v1alpha2 mit In-place-Adoption</h2>
<p>Der etcd-Stack wechselt auf die gespendete API <code>etcd-operator.cozystack.io/v1alpha2</code> — ein Membership-API-Lebenszyklus anstelle des StatefulSet-Modells —, ausgeliefert über ein von Cozystack gepflegtes Chart mit appVersion v0.5.2. Die CRDs liegen jetzt im eigenen Paket <code>etcd-operator-crds</code> und lassen sich damit vor dem Controller installieren.</p>
<p>Interessant ist das Upgrade. Migration 50 läuft als Pre-Upgrade-Hook, solange noch der alte Operator aktiv ist, und schreibt mit dem Werkzeug <code>etcd-migrate</code> aus dem Migrations-Image Ownership, Labels und CRs so um, dass der neue Operator beim ersten Reconcile die laufende Datenebene übernimmt — ohne Datenumzug, ohne Pod-Neustart. Vorher legt sie zwingend einen Snapshot jedes adoptierten Clusters im Bucket <code>cozy-backups</code> an, unter einem System-Key-Präfix mit für Tenants unsichtbaren Credentials, und bricht laut ab, statt ohne Snapshot zu adoptieren. Außerdem stellt sie Server- und Peer-Zertifikate mit dem nativen Member-Wildcard-SAN des neuen Operators neu aus: Im TLS-Modus <code>secretRef</code> erzeugt der Operator selbst keine Zertifikate, ein adoptierter Cluster ohne die native Domain im Zertifikat würde also beim ersten Memberwechsel still an TLS scheitern — und dabei weiterhin <code>Available=True</code> melden.</p>
<p>Bleibt Migration 50 auf einem Cluster stehen, der bewusst keinen Backup-Speicher hat, gibt es einen dokumentierten Notausgang:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl edit package.cozystack.io cozystack.cozystack-platform
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">components</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">platform</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">values</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">migrations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">etcdAdoptSkipBackup</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div><p>Flux rendert das Plattform-Chart neu, der Hook läuft erneut und adoptiert jedes Legacy-etcd ohne Snapshot. <strong>Eine misslungene Adoption eines etcd unter einer Tenant-Control-Plane ist ohne Snapshot nicht wiederherstellbar.</strong> Setzen Sie das Flag danach zurück auf <code>false</code>, sonst überspringt auch die nächste etcd-Migration ihren Snapshot.</p>
<h2 id="securitygroup-netzwerkrichtlinien-in-tenant-hand">SecurityGroup: Netzwerkrichtlinien in Tenant-Hand</h2>
<p>Die neue, tenantseitige und namespace-gebundene Firewall-Ressource <code>sdn.cozystack.io/v1alpha1 SecurityGroup</code> erlaubt es Tenants, die Netzwerkrichtlinien ihrer Anwendungen zu verwalten, ohne jeden Zugriff auf die API-Gruppe <code>cilium.io</code>.</p>
<p>Eine <code>SecurityGroup</code> ist eine Mitgliedschaftsgruppe. Sie besitzt ein Mitgliedschafts-Label (<code>securitygroup.sdn.cozystack.io/&lt;name&gt;</code>), das ein neuer <code>securitygroup-controller</code> auf die Pods jeder in <code>spec.attachments</code> gelisteten Managed Application setzt und beim Entfernen eines Attachments wieder abzieht. Die Gruppe bildet 1:1 auf eine <code>CiliumNetworkPolicy</code> im selben Namespace ab, deren <code>endpointSelector</code> genau dieses Label ist — eine <code>SecurityGroup</code> kann damit mehrere Anwendungen gleichzeitig abdecken, und <code>fromSG</code>/<code>toSG</code>-Peers lösen Gruppe-zu-Gruppe-Referenzen live in der Cilium-Datenebene auf. Ein Finalizer schützt die zugrunde liegende Policy, damit Member-Labels immer vor ihrem Entfernen abgezogen werden; die REST-Storage der aggregierten API setzt sie bei jedem Schreibvorgang neu, sodass ein vollständig ersetzendes <code>PUT</code> sie nicht verwaisen lassen kann.</p>
<p>Die wichtige Einschränkung: Ingress- und Egress-Regeln <strong>erlauben</strong> ausschließlich zusätzlichen Verkehr. Eine leere Regelliste isoliert die Member-Pods nicht, denn die effektive Konnektivität bleibt die Vereinigung aller Policies, die einen Pod selektieren — einschließlich der pauschal erlaubenden Baseline der Plattform. Default-Deny ist separat als künftige Arbeit vorgemerkt. Behandeln Sie eine <code>SecurityGroup</code> in diesem Release also nicht als Segmentierungsgrenze.</p>
<h2 id="hierarchische-ressourcenquotas">Hierarchische Ressourcenquotas</h2>
<p><code>tenant.spec.resourceQuotas</code> wurde bisher zu einer schlichten <code>ResourceQuota</code> pro Namespace, die den Tenant-Baum vollständig ignorierte: Ein Super-Admin innerhalb eines quotierten Tenants konnte einen Sub-Tenant mit größerer oder ganz ohne Quota anlegen und mehr verbrauchen als zugeteilt. Die deklarierte Quota eines Tenants ist jetzt das Budget für seinen gesamten Teilbaum.</p>
<p>Durchgesetzt wird das in zwei zusammenwirkenden Schichten, analog zur ClusterResourceQuota-Aufteilung in OpenShift. Ein Gate zum Deklarationszeitpunkt im aggregierten Apiserver lehnt deterministisch jeden Sub-Tenant ab, dessen deklarierte Quota das verbleibende Budget des Elterntenants übersteigt. Ein Laufzeit-Enforcer im <code>cozystack-controller</code> pflegt pro Namespace eine <code>ResourceQuota</code> namens <code>tenant-quota-allocated</code>, die jedes Poolmitglied auf seinen Anteil begrenzt und die Nutzung über den Teilbaum aggregiert. Kubernetes setzt in einem Namespace stets die restriktivste ResourceQuota durch — das greift also, ohne mit Flux um die vom Chart gerenderte <code>tenant-quota</code> zu ringen.</p>
<p>Prüfen Sie die Sub-Tenant-Quotas vor dem Upgrade. Ein Elternbudget unterhalb der Summe seiner Kinder erzeugt ein Event <code>QuotaOvercommitted</code>, und <code>--tenant-quota-buffer-percent</code> am <code>cozystack-controller</code> bläst Poolbudgets während des Rollouts temporär auf, damit Workloads oberhalb einer frisch greifenden Quota weiterlaufen. Es gibt weder neue API-Typen noch Änderungen am Tenant-Chart — das Feature arbeitet mit dem bestehenden Feld.</p>
<h2 id="oidc-single-sign-on-für-tenant-kubernetes-und-grafana">OIDC-Single-Sign-on für Tenant-Kubernetes und Grafana</h2>
<p>Zwei symmetrische Phase-1-Funktionen erlauben es einem Tenant, einen einzelnen Workload über einen flachen Selektor an den Keycloak-Realm <code>cozy</code> der Plattform anzubinden — ohne Konfiguration auf Plattformebene.</p>
<p><strong>Tenant-kube-apiserver.</strong> Jede <code>Kubernetes</code>-CR erhält <code>spec.oidc.mode: System | CustomConfig | None</code>, Vorgabe <code>None</code>. <code>System</code> vertraut dem Realm <code>cozy</code> über einen Public Client pro Cluster mit Audience-Bindung; <code>CustomConfig</code> akzeptiert eine vom Tenant gelieferte strukturierte <code>AuthenticationConfiguration</code>. <code>spec.oidc.users[]</code> erzeugt pro Nutzer ein ClusterRoleBinding im Tenant-Cluster (<code>admin</code> auf <code>cluster-admin</code>, <code>view</code> auf <code>view</code>). Im Modus <code>System</code> wird ein Secret <code>&lt;release&gt;-oidc-kubeconfig</code> mit fertigem <code>kubectl oidc-login</code>-Exec-Block über das Cozystack Dashboard bereitgestellt — ein Tenant-Nutzer kommt damit ohne Zutun des Betreibers von „Cluster existiert“ zu „kubectl läuft mit meiner SSO-Identität“. Der zugrunde liegende Durchgriff auf <code>controlPlane.apiServer.extraArgs</code>, <code>extraVolumes</code> und <code>extraVolumeMounts</code> der <code>KamajiControlPlane</code> ist zusätzlich direkt zugänglich.</p>
<p><strong>Grafana.</strong> Jede <code>Monitoring</code>-CR bekommt denselben Selektor. <code>System</code> verdrahtet pro Instanz einen vertraulichen Keycloak-Client mit Audience-Bindung; die Autorisierung erfolgt anwendungsseitig: <code>spec.oidc.users: [{email, role: Admin|Editor|Viewer}]</code> wird von einem chart-eigenen Post-Install- und Post-Upgrade-Job in Grafanas Main Org abgeglichen — Nutzer werden angelegt, der Organisation hinzugefügt, ihre Rolle gepatcht und verwaiste Mitglieder entfernt. <code>CustomConfig</code> akzeptiert eine vom Tenant gelieferte <code>[auth.generic_oauth]</code>-Konfiguration, entweder inline als Map oder als Secret mit Schlüssel <code>auth.ini</code>; im Secret-Fall ist <code>spec.oidc.users</code> nicht unterstützt, und das Chart bricht das Rendering bei dieser Kombination ab, statt sie still zu ignorieren. Das Secret mit <code>admin_user</code>/<code>admin_password</code> bleibt in allen Modi der dokumentierte Break-Glass-Zugang.</p>
<p>Referenz: <a href="https://cozystack.io/docs/v1.6/operations/oidc/enable_oidc/">OIDC aktivieren</a>.</p>
<h2 id="löschen-einer-anwendung-gibt-jetzt-ihren-speicher-frei">Löschen einer Anwendung gibt jetzt ihren Speicher frei</h2>
<p>Das Löschen einer Managed Application ließ bisher Volumes und vom Operator erzeugte Secrets zurück. Ein Zug über zehn Pull Requests im gesamten Katalog schließt das mit Post-Delete-Hooks und PVC-Retention-Policies: ClickHouse-Keeper-, Daten- und Log-PVCs; das Daten-PVC von Qdrant; das Daten-PVC von OpenBAO; Speicher und TLS-Secrets von VictoriaMetrics und VictoriaLogs im Tenant-Monitoring-Modul; Volume-PVCs des Tenant-Moduls seaweedfs; die PVCs <code>data-etcd-*</code> des Tenant-etcd-Moduls; Harbors jobservice- und trivy-PVCs; die vom MariaDB-Operator erzeugten Passwort-Secrets; ACME-Ressourcen von Bucket und Gateway.</p>
<p><strong>Damit ist Löschen unwiderruflich.</strong> Das ist der Sinn der Änderung, aber es ist ein echter Verhaltenswechsel gegenüber „Löschen leakt das Volume, und man konnte es zurückholen“. Harbors PVCs werden erzwungen gelöscht und überstimmen <code>persistence.resourcePolicy=keep</code>; Harbors CNPG-Datenbank-PVCs bleiben unangetastet. Die Migrationen 48 und 51 tragen das Release-Label auf bereits existierenden ClickHouse-Keeper- und Monitoring-PVCs nach; beide sind bewusst Best-Effort, im schlechtesten Fall bleibt es beim bisherigen Leak.</p>
<p>Vor dem Löschen sichern. Und den Tenants sagen, dass das jetzt gilt.</p>
<h2 id="ebenfalls-in-v160">Ebenfalls in v1.6.0</h2>
<ul>
<li><strong>Wildcard-Zertifikate durchgängig.</strong> <code>publishing.certificates.wildcardSecretName</code> aus v1.5 galt nur für den Root-Tenant. Der Plattform-Controller repliziert das Zertifikat jetzt in jeden Tenant-Namespace, in dem TLS terminiert wird — Ingress-Controller und Gateways pro Tenant liefern es automatisch aus, ohne namespace-übergreifenden Secret-Zugriff. Neu und optional ist außerdem <code>publishing.certificates.wildcard</code> (Vorgabe <code>false</code>): Die Plattform stellt darüber ein einziges Zertifikat <code>*.&lt;root-host&gt;</code> per DNS-01 auf dem Standard-ingress-nginx-Pfad aus — der praktische Ausweg aus den Rate Limits von Let&rsquo;s Encrypt bei größeren Installationen.</li>
<li><strong>Keycloak</strong> erhält vier unabhängige Opt-ins: einen KMS-verschlüsselnden Datenbank-Proxy für spaltenweise PII-Verschlüsselung im Ruhezustand, wahlweise mit statischem KEK oder Vault Transit (inklusive Vault-Auth über Kubernetes und AppRole); ein <code>ingress.adminHost</code>, das Admin-Konsole und Administration-REST-API über einen eigenen Hostnamen und eine eigene Route ausliefert, per <code>publishing.ingressNameAdmin</code> an ein privates Gateway oder eine eigene ingressClass anbindbar; Barman-basierte S3-Backups der CNPG-Datenbank; und ein wählbares Login-Theme über die <code>branding</code>-Values der Plattform. Alles standardmäßig aus.</li>
<li><strong>Unveränderliche Tags und RC-zu-Stable-Promotion.</strong> Ein stabiles Release ist jetzt die byte-identische Beförderung des getesteten Release Candidate: Kein Tag wird je zwangsverschoben, Stable wird nie neu gebaut, Images werden per Digest umgetaggt. Der cron-getriebene Workflow <code>auto-release.yaml</code> für Patch-Tags ist ersatzlos entfallen.</li>
<li><strong>Kamaji läuft standardmäßig mit zwei Repliken</strong> und weicher Pod-Anti-Affinität; Telemetrie-Handler und -Webhook sind entfernt, was die Admission-p99 des Apiservers für <code>TenantControlPlane</code>-Webhooks auf Multi-Tenant-Clustern um rund 70 % senkt.</li>
<li><strong>Remote zugreifbare LINSTOR-StorageClasses werden in Tenant-Cluster propagiert</strong>, unter demselben Namen; die über <code>storageClass</code> benannte Klasse (Vorgabe <code>replicated</code>) wird zur Tenant-Default-Klasse, die alte Klasse <code>kubevirt</code> bleibt als Alias erhalten.</li>
<li>Das <strong>Cozystack Dashboard</strong> zeigt die externe LoadBalancer-IP jetzt direkt im Services-Tab der Anwendung und rendert explizite Fehler- und Unbekannt-Zustände statt eines endlosen Spinners. Die Konsolen-SPA wird jetzt aus dem Monorepo gebaut; Image und Digest bleiben unverändert.</li>
<li>Nach dem Upgrade <strong>Scrape-Targets auf Port 10250 prüfen</strong> — der cert-manager-Webhook, der external-secrets-Webhook und der metrics-server-Listener sind alle von diesem Port weggezogen.</li>
</ul>
<h2 id="plattformkomponenten">Plattformkomponenten</h2>
<table>
  <thead>
      <tr>
          <th>Komponente</th>
          <th>Änderung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Talos Linux</td>
          <td>v1.13.0 → v1.13.6, Kernel 6.18.29 → 6.18.38; schließt die KVM-Ausbrüche CVE-2026-53359 und CVE-2026-46113</td>
      </tr>
      <tr>
          <td>etcd-operator</td>
          <td>v0.4.5 → v0.5.2, neue API <code>v1alpha2</code></td>
      </tr>
      <tr>
          <td>Cilium</td>
          <td>1.19.3 → 1.19.5</td>
      </tr>
      <tr>
          <td>KubeVirt</td>
          <td>v1.8.4 (behebt auf Kubernetes 1.36 in <code>Scheduled</code> hängende VMIs; schließt CVE-2026-35469)</td>
      </tr>
      <tr>
          <td>Velero</td>
          <td>1.17.0 → 1.18.1, parallele Backup-Verarbeitung, Cache-Volumes für Data Mover</td>
      </tr>
      <tr>
          <td>Vertical Pod Autoscaler</td>
          <td>1.3.0 → 1.5.0, In-place-Resizing von Pods jetzt Beta</td>
      </tr>
      <tr>
          <td>Harbor</td>
          <td>2.14.2 → 2.15.1</td>
      </tr>
      <tr>
          <td>Keycloak</td>
          <td>26.5.2 → 26.6.3</td>
      </tr>
      <tr>
          <td>LINSTOR</td>
          <td>1.33.2 → 1.33.3, linstor-csi v1.11.2</td>
      </tr>
      <tr>
          <td>FoundationDB-Operator</td>
          <td>v2.13.0 → v2.30.0</td>
      </tr>
      <tr>
          <td>HAMi</td>
          <td>2.8.1 → 2.9.0</td>
      </tr>
      <tr>
          <td>Percona-MongoDB-Operator</td>
          <td>1.21.1 → 1.22.0</td>
      </tr>
      <tr>
          <td>OpenBAO</td>
          <td>v2.5.0 → v2.5.1</td>
      </tr>
      <tr>
          <td>csi-driver-nfs</td>
          <td>4.11.0 → 4.13.3</td>
      </tr>
      <tr>
          <td>CoreDNS-Chart</td>
          <td>1.43.2 → 1.46.0</td>
      </tr>
      <tr>
          <td>OpenCost</td>
          <td>1.111.0 → 1.120.3</td>
      </tr>
  </tbody>
</table>
<p>Die Talos-Systemerweiterungen sind auf den Stand 20260622 aktualisiert, darunter DRBD 9.3.2 und ZFS 2.4.3. Schon das allein rollt jeden Tenant-Worker-Pool einmal durch, weil das Worker-Template für das neue Image umbenannt wird. Die Patch-Versionen für Managed Kubernetes gehen auf v1.32.13, v1.33.13, v1.34.9 und v1.35.6; v1.30 fällt aus der Supportmatrix für Tenants.</p>
<p>Zwei API-Gruppen sind vor allem als Nicht-Ereignis erwähnenswert. Bei <code>SecurityGroup</code> wurde <code>spec.targetRef</code> noch vor dem Release durch das Mitgliedschaftsmodell <code>spec.attachments[]</code> ersetzt — Objekte umschreiben muss also nur, wer zwischen dem 30. Juni und dem 16. Juli 2026 <code>main</code> verfolgt hat. Die Gruppe <code>network.cozystack.io</code> (<code>ExposureClass</code> / <code>ServiceExposure</code>) wurde innerhalb desselben Zyklus eingeführt und wieder entfernt und ist <strong>nicht</strong> Teil von v1.6.0 — nativer <code>Service</code> mit <code>type: LoadBalancer</code> und <code>loadBalancerClass</code> deckt dasselbe ab, freigelegt als <code>publishing.loadBalancerClass</code>.</p>
<h2 id="die-patch-linie-16">Die Patch-Linie 1.6</h2>
<ul>
<li><strong>v1.6.1</strong> (5. August 2026): CNPG-Operator und CRDs gemeinsam auf 1.28.2 gehoben, was einen PVC-Resize-Deadlock behebt, der einen PostgreSQL-Cluster mit einer einzigen Instanz ohne jede Instanz zurücklassen konnte; der Job <code>talos-reconcile</code> wird jetzt auch für die implizite Gruppe <code>md0</code> gerendert, sodass die erste vom Autoscaler getriebene Skalierung nicht mehr Machines ohne passendes <code>TalosConfigTemplate</code> dauerhaft blockiert; der Pre-Delete-Job <code>keycloak-configure</code> patcht die HelmRelease im richtigen Namespace und macht Deinstallation und Neuinstallation von Keycloak wieder möglich; das SeaweedFS-Namens-Audit bricht bei Fehlern hart ab; etcd-operator auf v0.5.4.</li>
<li><strong>v1.6.2</strong> (19. August 2026): das Lookup-Gate der Backup-Strategien, das Velero-CRD-Upgrade und das Nachladen des kube-ovn-Webhook-Zertifikats. Letzteres wiegt schwer: <code>kube-ovn-webhook</code> lud sein Serverzertifikat nur beim Start und las es nie neu ein, sodass nach einer cert-manager-Erneuerung unter <code>failurePolicy: Fail</code> jede Pod-Erstellung in Tenant-Namespaces abgelehnt wurde — inklusive <code>virt-launcher</code>-Pods, was den VMI-Start blockierte. Außerdem: barman-cloud fordert S3-Prüfsummen nur noch, wenn nötig, sodass Backups nach Ceph RGW und manchen MinIO- und R2-Builds nicht mehr komplett scheitern; geshardete helm-controller crashloopen hinter einem HTTP-Proxy nicht mehr; <code>kubectl apply --validate</code> funktioniert wieder gegen die API-Gruppen <code>core</code> und <code>sdn</code>.</li>
<li>Danach folgten die Patch-Releases v1.6.3 und v1.6.4. Verwenden Sie das neueste 1.6.x; siehe die <a href="https://github.com/cozystack/cozystack/releases">Cozystack-Releases</a>.</li>
</ul>
<h2 id="upgrade">Upgrade</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl annotate namespace cozy-system helm.sh/resource-policy<span class="o">=</span>keep --overwrite
</span></span><span class="line"><span class="cl">kubectl annotate configmap -n cozy-system cozystack-version helm.sh/resource-policy<span class="o">=</span>keep --overwrite
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">helm upgrade cozystack oci://ghcr.io/cozystack/cozystack/cozy-installer <span class="se">\
</span></span></span><span class="line"><span class="cl">  --version 1.6.4 <span class="se">\
</span></span></span><span class="line"><span class="cl">  --namespace cozy-system
</span></span></code></pre></div><p>Die Annotationen sind Pflicht — ohne sie kann das Entfernen oder Aktualisieren des Installer-Releases den Namespace <code>cozy-system</code> samt Inhalt löschen. Bestehende Values wiederverwenden, die Migrations-Hooks beobachten und mit den oben genannten Rollouts rechnen: Tenant-Worker-Pools, die Gatekeeper von Dashboard und linstor-gui, der VPA-Admission-Controller und das Admission-Deployment des linstor-schedulers. Vollständiger Ablauf: <a href="https://cozystack.io/docs/v1.6/operations/cluster/upgrade/">Upgrade-Leitfaden</a>.</p>
<h2 id="wo-ænix-ins-spiel-kommt">Wo Ænix ins Spiel kommt</h2>
<p>Cozystack ist ein CNCF-Sandbox-Projekt unter Apache 2.0. v1.6 ist ein gutes Release und ein anspruchsvolles Upgrade — der Talos-Worker-Rollover, die etcd-Adoption und die geänderte Löschsemantik verdienen jeweils eine Generalprobe auf einem Nicht-Produktivcluster. Ænix hat Cozystack geschaffen und gehört zu seinen Maintainern; es bietet <a href="https://aenix.io/de/produkte/cozystack-enterprise-support/">Enterprise-Support für Cozystack</a>, einschließlich Upgrade-Planung und begleiteter Migration für Teams im Produktivbetrieb.</p>
<h2 id="release-links">Release-Links</h2>
<ul>
<li><a href="https://github.com/cozystack/cozystack/releases/tag/v1.6.0">Cozystack v1.6.0 auf GitHub</a></li>
<li><a href="https://github.com/cozystack/cozystack/releases/tag/v1.6.2">Cozystack v1.6.2 auf GitHub</a></li>
<li><a href="https://github.com/cozystack/cozystack/releases">Alle Cozystack-Releases auf GitHub</a></li>
<li><a href="https://cozystack.io/docs/v1.6/">Cozystack-v1.6-Dokumentation</a></li>
<li><a href="https://t.me/cozystack">Telegram</a> und <a href="https://kubernetes.slack.com/archives/C06L3CPRVN1">Slack</a> (Einladung über <a href="https://slack.kubernetes.io/">slack.kubernetes.io</a>)</li>
</ul>
]]></content:encoded></item><item><title>Cozystack 1.5: Gateway API, Standard-Backups, Flux-Sharding und TLS für Managed Services</title><link>https://aenix.io/de/blog/2026/06/cozystack-1-5-gateway-api-standard-backups-tls-fuer-managed-services/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/06/cozystack-1-5-gateway-api-standard-backups-tls-fuer-managed-services/</guid><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><dc:creator>Timur Tukaev</dc:creator><category>Cozystack</category><category>Kubernetes</category><category>Cilium</category><category>KubeVirt</category><category>GPU</category><category>Platform Engineering</category><description>Cozystack v1.5.0 bringt optionale Gateway API über Cilium, eine Standard-BackupClass, Flux v2.8 mit Sharding, TLS für Managed-Datenbanken und GPU-Passthrough.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cozystack-1-5-gateway-api-standard-backups-tls-fuer-managed-services.jpg" alt="Cozystack 1.5: Gateway API, Standard-Backups, Flux-Sharding und TLS für Managed Services" width="1200" height="630" loading="lazy" decoding="async"></p>
<p>Cozystack v1.5.0 ist am 22. Juni 2026 erschienen. Das Release enthält sämtliche Fixes der Patch-Linie v1.4.1 bis v1.4.4 und entwickelt die Plattform in fünf Richtungen weiter: ein zweiter Ingress-Pfad über die Gateway API, Backups ohne S3-Konfiguration pro Anwendung, strengere und shardbare Flux-Reconciliation, TLS für extern veröffentlichte Managed Services und GPU-Passthrough ohne manuelles <code>kubectl patch</code>.</p>
<p>Das Release hat allerdings eine reale Upgrade-Oberfläche. Lesen Sie den nächsten Abschnitt, bevor Sie das Wartungsfenster planen.</p>
<h2 id="vor-dem-upgrade-lesen">Vor dem Upgrade lesen</h2>
<p><strong>Installieren Sie heute weder v1.5.0 noch v1.5.1 oder v1.5.2. Gehen Sie direkt auf v1.5.4.</strong> Der SeaweedFS-Chart-Sprung in v1.5.0 (4.05 auf 4.31) hat die SeaweedFS-Workloads von chart-basierten auf release-basierte Namen umbenannt. StatefulSet-Namen sind unveränderlich, Helm konnte also nicht in place umbenennen — stattdessen wurde ein zweiter, doppelter Satz neben dem laufenden gestartet. Auf einem Cluster mit mehr Nodes als Master-Repliken lässt sich das leere Duplikat erfolgreich schedulen, beide Generationen tragen identische Pod-Labels, und der Service <code>seaweedfs-s3</code> verteilt Last auf zwei Filer, die in denselben Metadaten-Store schreiben. Das ist kein kosmetisches Duplikat, sondern ein Datenintegritätsvorfall. Ein verwandter Defekt in Migration 43 konnte zusätzlich den CNPG-Cluster <code>seaweedfs-db</code> — den Index für jedes Objekt im S3 eines Tenants — für jede Instanz löschen, die nicht wörtlich <code>seaweedfs</code> heißt.</p>
<p>Beides ist in v1.5.4 (19. August 2026) behoben: Das Release pinnt <code>fullnameOverride: seaweedfs</code>, adoptiert die laufenden Workloads in place und liefert ein Audit-Skript, das bei Fehlern hart abbricht statt „sauber“ zu melden. v1.5.4 ist das letzte Release der 1.5-Linie und das einzige, das produktiv sinnvoll ist.</p>
<p>Fünf weitere Punkte betreffen jedes 1.5-Upgrade:</p>
<ul>
<li><strong>Kubernetes 1.33 oder neuer ist auf dem Management-Cluster Pflicht</strong> — und auf jedem Tenant-Cluster, der das Flux-Addon aktiviert. Der helm-controller v1.5 aus Flux v2.8 verlangt es. Kubernetes also zuerst anheben.</li>
<li><strong><code>upgrade.force: true</code> ist entfallen.</strong> Änderungen an unveränderlichen Feldern heilen sich nicht mehr selbst. Ändert ein Chart-Upgrade etwa <code>volumeClaimTemplates</code> oder <code>serviceName</code> eines StatefulSets, schlägt das Apply fehl; das Objekt muss von Hand neu erzeugt werden (<code>kubectl delete sts &lt;name&gt; --cascade=orphan</code>), danach übernimmt Flux wieder.</li>
<li><strong>Bei GPU-VMs müssen eigene Host-Devices vorher umgezogen werden.</strong> Ist <code>cozystack.gpu-operator</code> aktiv, gehört <code>KubeVirt.spec.configuration.permittedHostDevices</code> jetzt dem Bundle und wird beim ersten Reconcile überschrieben. Handgepflegte Einträge vorher nach <code>.gpu.permittedHostDevices</code> verschieben und prüfen, dass jeder <code>resourceName</code> zu dem passt, was die Nodes tatsächlich anbieten.</li>
<li><strong>MetalLB wechselt auf das FRR-K8s-BGP-Backend und auf reine HTTPS-Metriken.</strong> Mit dem Sprung v0.15.2 auf v0.16.1 übernimmt MetalLB das Upstream-Standard-Backend FRR-K8s; der klassische FRR-Modus ist deprecated. <code>kube-rbac-proxy</code> weicht nativem TLS plus RBAC — jede Scrape-Konfiguration, die noch auf die alten Klartext-HTTP-Endpunkte zeigt, muss angepasst werden. Die Portsperrliste im Host-Netzwerk wurde entsprechend rotiert, inklusive des neuen Probe-Ports 17472 für <code>/healthz</code> und <code>/readyz</code>.</li>
<li><strong>Extern veröffentlichte Datenbanken und Messaging-Dienste erhalten automatisch TLS.</strong> Instanzen mit <code>external: true</code> schalten nach dem Upgrade auf TLS um. Der Trust Anchor ist eine selbstsignierte CA, externe Clients müssen sie also abholen und pinnen. Cluster-interne Instanzen bleiben unberührt.</li>
</ul>
<p>Und ein Punkt für alle, die später auf 1.6 wollen: v1.5.4 ist das erste 1.5.x-Release mit Migrations-<code>targetVersion: 46</code>. Der Pin, den es auf die CAPI-Objekte <code>KubeadmConfigTemplate</code> setzt, verhindert später, dass ein 1.6-Upgrade diese Templates unter einem noch laufenden, mitten im Rollover befindlichen MachineSet weglöscht. Der schmerzhafte Weg nach 1.6 führt über jede ältere Version der 1.5-Linie.</p>
<h2 id="gateway-api-über-cilium">Gateway API über Cilium</h2>
<p>Cozystack-native Dienste lassen sich jetzt über die Gateway API mit Cilium als Datenebene veröffentlichen — optional und parallel zu den bestehenden ingress-nginx-Controllern pro Tenant. Umgesetzt wird das über eine neue CRD <code>gateway.cozystack.io/v1alpha1 TenantGateway</code>, die der <code>cozystack-controller</code> reconciled.</p>
<p>Aktiviert wird der Pfad plattformweit mit <code>publishing.gateway.enabled=true</code>. Ein Tenant bekommt danach entweder mit <code>tenant.spec.gateway=true</code> sein eigenes Gateway samt LoadBalancer-IP und Zertifikat, oder er erbt das Gateway des nächsten übergeordneten Tenants über dasselbe label-basierte Selektormodell, das bereits die Ingress-Vererbung steuert. Zwei Zertifikatsmodi stehen bereit: HTTP-01 als Standard (ein Zertifikat pro Anwendung, ohne Plattformkonfiguration für neue Apps) und optional DNS-01 (ein Wildcard-Zertifikat für eine Apex-Domain, mit Cloudflare, Route 53, DigitalOcean und RFC 2136).</p>
<p>Die Standardeinstellung bleibt ingress-nginx, bestehende Cluster ändern ihr Verhalten also nicht. Zwei Nebenwirkungen treffen jedoch alle:</p>
<ul>
<li>Cilium Envoy und die Gateway-API-Unterstützung sind ab sofort immer aktiv. Das bedeutet ein zusätzliches DaemonSet <code>cilium-envoy</code> mit rund 100 MB RAM pro Node im Leerlauf. Auf dicht belegten Nodes einplanen.</li>
<li><code>cozystack-api</code> ruft Admission (<code>createValidation</code> / <code>deleteValidation</code>) nun bei Create <strong>und</strong> Delete für <code>apps.cozystack.io/*</code> auf. Eigene ValidatingAdmissionPolicies oder Webhooks auf diesen Kinds feuern damit bei allen drei Verben.</li>
</ul>
<p>Referenz: <a href="https://cozystack.io/docs/v1.5/networking/gateway-api/">Gateway-API-Leitfaden</a>.</p>
<h2 id="backups-die-ohne-vorarbeit-funktionieren">Backups, die ohne Vorarbeit funktionieren</h2>
<p>Frühere Releases haben die Backup-Maschinerie installiert. v1.5 schließt die Lücke zwischen „installiert“ und „funktioniert ohne S3-Konfiguration pro Anwendung“.</p>
<p>Neu ist eine plattformverwaltete Standard-<code>BackupClass</code> namens <code>cozy-default</code>, hinterlegt mit dem System-Bucket <code>cozy-backups</code>. Anwendungen aktivieren sie über <code>useSystemBucket</code>; die Plattform projiziert daraufhin gemeinsam genutzte Backup-Credentials mit RBAC-Isolation und Projektionsmetriken in den Tenant-Namespace und verzichtet vollständig auf Credential-Secrets pro Release. Für jede backupfähige Anwendung gibt es jetzt eine Standardstrategie — Velero für VMDisk und VMInstance, CNPG für PostgreSQL, Altinity für ClickHouse, dazu MariaDB, FoundationDB und etcd — und eine Velero-<code>BackupStorageLocation</code> ist auf den System-Bucket verdrahtet. Die alten S3-Felder pro Tenant bei Postgres und ClickHouse sind zugunsten dieses Wegs deprecated.</p>
<p><strong>Velero ist jetzt ein Standard-Systempaket</strong>, kein optionales mehr. Das behebt einen deterministischen Fehler: Der Standard-<code>backupstrategy-controller</code> hängt hart von Velero ab, weshalb er auf Clustern ohne Velero in <code>DependenciesNotReady</code> verharrte und die Plattform-HelmRelease nie Ready wurde. Bestehende Cluster erhalten Velero beim Upgrade im Namespace <code>cozy-velero</code>. Wer keine VMs sichert, deaktiviert es über <code>bundles.disabledPackages</code>.</p>
<p>Zwei neue Strategien kommen hinzu. Eine <strong>etcd</strong>-Strategie (clusterweite CRD <code>strategy.backups.cozystack.io Etcd</code>, nur S3) mit Snapshot-BackupJob und einem destruktiven In-place-RestoreJob. Und eine generische, anwendungsunabhängige <strong>Job</strong>-Strategie: Der Betreiber liefert ein Kubernetes-Job-Template, Cozystack rendert und startet es als einmaliges Backup und rendert es für die Wiederherstellung erneut mit <code>.Mode == &quot;restore&quot;</code>. Namespace-übergreifende Restores unterstützt die Job-Strategie nicht.</p>
<p>Referenzen: <a href="https://cozystack.io/docs/v1.5/applications/backup-and-recovery/">Backup und Recovery für Anwendungen</a>, <a href="https://cozystack.io/docs/v1.5/operations/services/managed-app-backup-configuration/">Backup-Konfiguration für Managed Apps</a>.</p>
<h2 id="flux-v28-und-helm-controller-sharding">Flux v2.8 und helm-controller-Sharding</h2>
<p>Flux springt von v2.7.3 auf v2.8.0 — sowohl das eingebettete Flux des Management-Clusters als auch das optionale Flux-Addon für Tenants; die Charts flux-operator und flux-instance gehen von v0.33.0 auf v0.50.0.</p>
<p>Der helm-controller v1.5 bringt standardmäßig Server-Side Apply mit <code>--force-conflicts</code> und kstatus-basierte Health-Checks. Zwei praktische Konsequenzen: Falsch platzierte Chart-Felder, die v2.7 stillschweigend verworfen hat, sind jetzt harte Fehler (in diesem Release korrigiert für foundationdb, kafka, kubevirt-instancetypes, vm-instance und das Plattform-Chart), und übergeordnete HelmReleases warten, bis jede untergeordnete Ressource Ready ist, bevor sie selbst Ready melden. Die Korrektheit steigt, die Erstinstallation dauert länger und ist strenger — deshalb haben mehrere Pakete im selben Release explizite <code>spec.timeout</code>- und <code>dependsOn</code>-Einträge bekommen.</p>
<p>Parallel dazu verteilt ein neuer <strong>flux-shard-operator</strong> die HelmReleases der Tenants über mehrere helm-controller-Shards. Ein lauter Tenant — klassisch eine HelmRelease in endloser Remediation — kann die Reconciliation für alle anderen damit nicht mehr ausbremsen. Die Zuordnung erfolgt pro Tenant: Alle HelmReleases eines Tenants landen im selben Shard, zugewiesen greedy nach geringster Last, wobei ein Mutating Webhook das Shard-Label beim CREATE setzt. Voreinstellung ist <code>shardCount: auto</code> — die Shard-Zahl ergibt sich aus der Anzahl der Tenant-HelmReleases, kleine Cluster bleiben bei einem Shard, große Flotten sharden automatisch; ein Integer fixiert den Wert. Das handgebaute Deployment <code>flux-tenants</code> wird von Migration 44 geleert und stillgelegt.</p>
<h2 id="tls-für-managed-datenbanken-und-messaging">TLS für Managed-Datenbanken und Messaging</h2>
<p>Vier Managed-App-Charts erhalten TLS über einen einzigen Wert <code>tls.enabled</code> mit einheitlicher Drei-Zustands-Semantik. Nicht gesetzt, erbt er von <code>external</code>: TLS ist an, wenn der Dienst extern veröffentlicht wird, und aus, wenn er cluster-intern bleibt. Ein explizites <code>true</code> oder <code>false</code> gewinnt immer. Der Trust Anchor ist in allen Fällen eine chart- oder operatorverwaltete selbstsignierte CA, die Clients abholen und pinnen — eine öffentlich vertrauenswürdige CA gibt es auf diesem Pfad nicht.</p>
<ul>
<li><strong>Kafka</strong> liefert TLS auf dem externen LoadBalancer-Listener (Port 9094) aus, die Zertifikate verwaltet der Strimzi-Operator durchgängig. Clients vertrauen über die vom Operator veröffentlichten Secrets <code>&lt;release&gt;-cluster-ca-cert</code> und <code>&lt;release&gt;-clients-ca-cert</code>. Der externe Listener hängt jetzt nur noch an <code>external: true</code> und ist von <code>tls.enabled</code> entkoppelt.</li>
<li><strong>NATS</strong> und <strong>Qdrant</strong> nutzen eine eigenständige cert-manager-Kette (selbstsignierter Issuer, CA, Leaf) im Tenant-Namespace. NATS deckt Client-Verbindungen und Cluster-Routen ab, Qdrant REST und gRPC. Clients vertrauen dem Secret <code>&lt;release&gt;-ca</code>.</li>
<li><strong>PostgreSQL</strong> liefert über CNPG ohnehin immer TLS aus. Hier trägt <code>tls.enabled</code> bei <code>external: true</code> den externen Hostnamen in die SANs des operatorverwalteten Serverzertifikats ein — genau das lässt <code>sslmode=verify-full</code> gegen den externen Endpunkt funktionieren. Clients lesen <code>ca.crt</code> aus dem Secret <code>&lt;release&gt;-credentials</code>.</li>
</ul>
<p>Die TLS-Arbeit dieses Releases endet bei diesen vier Charts. Die übrigen Managed Services — MariaDB, Valkey, ClickHouse, OpenSearch, RabbitMQ, MongoDB — bleiben unverändert.</p>
<h2 id="gpu-passthrough-ohne-manuelles-patchen">GPU-Passthrough ohne manuelles Patchen</h2>
<p>Die GPU-Aktivierung ist jetzt auf allen drei Wegen verdrahtet, auf denen eine GPU einen Workload erreichen kann — jeder davon brauchte bisher manuelle Nacharbeit.</p>
<p>Für <strong>Tenant-Kubernetes</strong> bekommen Node-Gruppen, die <code>gpus</code> deklarieren, automatisch das Kubelet-Label <code>gpu=on</code>, sodass das Device-Plugin von HAMi schedulen und <code>nvidia.com/gpu</code> anbieten kann. Der GPU-Operator im Tenant lädt den Treiber mit <code>NVreg_NvLinkDisable=1</code> — das behebt den Passthrough einer einzelnen SXM-GPU, der zuvor bei „Fabric State: In Progress“ hängen blieb, während CUDA „system not yet initialized“ meldete. Beide Vorgaben lassen sich über <code>addons.gpuOperator.valuesOverride</code> überschreiben.</p>
<p>Für <strong>KubeVirt-VMs</strong> befüllt ein aktivierter <code>cozystack.gpu-operator</code> die KubeVirt-CR selbst: Er injiziert das Feature Gate <code>HostDevices</code> und füllt <code>permittedHostDevices</code> (sowie <code>mediatedDevicesConfiguration</code> für vGPU) aus mitgelieferten NVIDIA-Standardtabellen. GPU-VMs lassen sich damit ohne manuelles Patchen schedulen — zum Preis des Ownership-Wechsels aus den Upgrade-Hinweisen oben.</p>
<p>Zusätzlich gibt es eine dritte <strong><code>container</code>-Variante</strong> des GPU-Operators für Hosts, auf denen NVIDIA-Treiber und Container-Toolkit bereits vom Betriebssystem installiert sind; sie stellt GPUs ausschließlich über das Device-Plugin an gewöhnliche Container-Pods bereit.</p>
<p>GPU-Sharing bleibt in Cozystack die Kombination aus NVIDIA GPU Operator und HAMi. Referenz: <a href="https://cozystack.io/docs/v1.5/kubernetes/gpu-sharing/">GPU-Sharing und Operator-Varianten</a>.</p>
<h2 id="ebenfalls-in-v150">Ebenfalls in v1.5.0</h2>
<ul>
<li><strong>Löschschutz.</strong> Objekte mit dem Label <code>platform.cozystack.io/no-delete=true</code> lassen sich nicht mehr direkt löschen. Die Prüfung läuft prozessintern im kube-apiserver über eine ValidatingAdmissionPolicy — ohne Webhook, DaemonSet, TLS oder zusätzliches Image. Geschützt sind in diesem Release die Namespaces <code>cozy-system</code> und <code>tenant-root</code>, die HelmRelease <code>tenant-root</code>, die ConfigMap <code>cozystack-version</code>, die OCIRepository <code>cozystack-packages</code>, die cert-manager-ClusterIssuer, der LinstorCluster und die Packages-CRDs. Zum Löschen zuerst das Label entfernen: <code>kubectl label &lt;kind&gt; &lt;name&gt; platform.cozystack.io/no-delete-</code>. Voraussetzung ist Kubernetes 1.30+.</li>
<li><strong>Dropdowns im Dashboard mit Laufzeitdaten.</strong> Eine neue, namespace-gebundene und nur lesbare Ressource <code>Option</code> (<code>core.cozystack.io/v1alpha1</code>), berechnet beim Lesen durch eine privilegierte In-Process-Provider-Registry, plus das Schema-Schlüsselwort <code>x-cozystack-options</code>, das Charts deklarieren. GPU-Geräte, KubeVirt-Instancetypes und -Preferences, Multus-Netze, VM-Images, Storage-Pools, StorageClasses, BackupClasses und Backup-Pläne werden damit im Cozystack Dashboard zu echten Dropdowns statt Freitext oder veralteter statischer Enums. Tenants erhalten lesenden Zugriff auf die Optionen im eigenen Namespace.</li>
<li><strong>Tenants dürfen ihre VMs starten, stoppen und neu starten.</strong> Das fehlende <code>update</code> auf den KubeVirt-Subressourcen <code>virtualmachines/start</code>, <code>/stop</code> und <code>/restart</code> ist jetzt auf Ebene <code>cozy:tenant:use:base</code> erteilt; die Power-Buttons im Dashboard lieferten zuvor für jede Tenant-Rolle 403.</li>
<li><strong>Grafana-Dashboard „Tenant Overview“</strong> für Plattform-Admins, ausgerollt nur in das Root-Grafana in <code>cozy-monitoring</code> und nie in die Grafanas einzelner Tenants, sowie eine neue Admin-Seite <strong>Cluster Usage</strong> mit eigener ClusterRole <code>cozystack-dashboard-cluster-usage</code> (clusterweite und Node-bezogene Auslastung inklusive GPUs). Ohne das Binding ist der Sidebar-Eintrag fail-closed.</li>
<li><strong><code>storageClass</code> ist bei 16 Stateful-Apps als unveränderlich markiert</strong> — ein Wechsel migriert nie Daten, weil PVCs <code>storageClassName</code> bei der Erstellung festschreiben. Die Durchsetzung ist in v1.5.0 rein UI-seitig: Der aggregierte Apiserver wertet die CEL-Regel bei Update noch nicht aus, ein direktes <code>kubectl patch</code> wird also weiterhin akzeptiert.</li>
<li>Erwähnenswerte Fixes: <code>cozystack-api</code> veröffentlicht das freie <code>.spec</code> jetzt als <code>x-kubernetes-preserve-unknown-fields</code> statt <code>additionalProperties: true</code> — Letzteres brachte den kube-controller-manager clusterweit mit einem Nil-Pointer-Panic im VAP-Typechecker zum Absturz. Tenant-Kubeconfigs verwenden für den Keycloak-OIDC-Issuer den Root-Host, sodass <code>kubectl oidc-login</code> bei Nicht-Root-Tenants nicht mehr an der TLS-Prüfung scheitert. <code>config_path</code> für Registry-Konfiguration funktioniert auf containerd-2.x-Tenant-Nodes. RWX-Block-Volumes laufen über den Upstream-Hotplug-Detach statt über den NFS-Cleanup-Zweig. OpenSearch wird endlich vom PaaS-Bundle referenziert.</li>
</ul>
<h2 id="plattformkomponenten">Plattformkomponenten</h2>
<table>
  <thead>
      <tr>
          <th>Komponente</th>
          <th>Änderung</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Flux</td>
          <td>v2.7.3 → v2.8.0 (Charts flux-operator/flux-instance v0.33.0 → v0.50.0)</td>
      </tr>
      <tr>
          <td>MetalLB</td>
          <td>v0.15.2 → v0.16.1, FRR-K8s als Standard-Backend, Metriken nur noch über HTTPS</td>
      </tr>
      <tr>
          <td>SeaweedFS</td>
          <td>4.05 → 4.31 (siehe Upgrade-Warnung oben)</td>
      </tr>
      <tr>
          <td>etcd-operator</td>
          <td>v0.4.3 → v0.4.5 (v0.4.5 repariert einen Restore-Datadir-Pfad, der Restores unbrauchbar machte)</td>
      </tr>
      <tr>
          <td>ouroboros</td>
          <td>v0.7.2 → v0.8.0</td>
      </tr>
      <tr>
          <td>seaweedfs-cosi-driver</td>
          <td>v0.3.1, mit Selbstheilung bei verwaisten Sockets</td>
      </tr>
      <tr>
          <td>kuberture</td>
          <td>neues optionales Systempaket v0.1.1</td>
      </tr>
      <tr>
          <td>Go-Toolchain</td>
          <td>1.26.4, <code>golang.org/x/net</code> v0.55.0</td>
      </tr>
  </tbody>
</table>
<p><code>kuberture</code> ist standardmäßig aus. Es schließt eine Lücke von external-dns — external-dns kann keine EndpointSlices lesen — indem es die EndpointSlice <code>default/kubernetes</code> des API-Servers beobachtet und annotierte Headless Services erzeugt, die external-dns konsumiert, um den Kubernetes-API-Endpunkt im DNS zu veröffentlichen. Aktivierung über <code>bundles.enabledPackages</code> mit mindestens einem Eintrag unter <code>config.outputs</code>.</p>
<h2 id="die-patch-linie-15">Die Patch-Linie 1.5</h2>
<ul>
<li><strong>v1.5.1</strong> (24. Juni 2026) behebt eine Regression aus v1.5.0: Für die KubeVirt-Preferences <code>windows.11</code>, <code>windows.2k22</code> und <code>windows.2k25</code> war der persistente EFI/TPM-Zustand wieder aktiviert worden. KubeVirt legt dafür ein ReadWriteOnce-PVC <code>persistent-state-for-&lt;vm&gt;</code> auf der StorageClass <code>replicated</code> an — das bindet die VM an ihren Node und blockiert Live-Migration und Node-Drains. Auf Clustern mit <code>evictionStrategy: LiveMigrate</code> kann das ein Cluster-Upgrade vollständig anhalten. Secure Boot und vTPM funktionieren weiterhin; nur der Zustand überlebt keinen Reboot.</li>
<li><strong>v1.5.2</strong> (3. Juli 2026) bringt zehn Fixes, darunter ein Kamaji-DataStore-Deadlock beim Löschen, der Tenant-Namespaces festfahren konnte, eine victoria-metrics-operator-Abhängigkeit, die bei <code>certManager.enabled: false</code> nie auflösbar war, und MariaDB-Instanzen mit einer Replik, die der Operator-Webhook ablehnte.</li>
<li><strong>v1.5.3</strong> wurde getaggt, das GitHub-Release blieb aber ein Entwurf und wurde nie veröffentlicht. Kein Betreiber hat es erhalten.</li>
<li><strong>v1.5.4</strong> (19. August 2026) ist das letzte Release der 1.5-Linie und die Version, die ausgerollt gehört.</li>
</ul>
<h2 id="upgrade">Upgrade</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl annotate namespace cozy-system helm.sh/resource-policy<span class="o">=</span>keep --overwrite
</span></span><span class="line"><span class="cl">kubectl annotate configmap -n cozy-system cozystack-version helm.sh/resource-policy<span class="o">=</span>keep --overwrite
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">helm upgrade cozystack oci://ghcr.io/cozystack/cozystack/cozy-installer <span class="se">\
</span></span></span><span class="line"><span class="cl">  --version 1.5.4 <span class="se">\
</span></span></span><span class="line"><span class="cl">  --namespace cozy-system
</span></span></code></pre></div><p>Die Annotationen sind Pflicht, keine Empfehlung: Ohne sie kann das Entfernen oder Aktualisieren des Installer-Releases den Namespace <code>cozy-system</code> samt Inhalt löschen. Bestehende Values wiederverwenden. Vollständiger Ablauf und Prüfschritte danach: <a href="https://cozystack.io/docs/v1.5/operations/cluster/upgrade/">Upgrade-Leitfaden</a>.</p>
<h2 id="wo-ænix-ins-spiel-kommt">Wo Ænix ins Spiel kommt</h2>
<p>Cozystack ist ein CNCF-Sandbox-Projekt unter Apache 2.0, und die beschriebenen Upgrade-Pfade gelten für alle gleichermaßen. Ænix hat Cozystack geschaffen und gehört zu seinen Maintainern; es bietet <a href="https://aenix.io/de/produkte/cozystack-enterprise-support/">Enterprise-Support für Cozystack</a> — inklusive Upgrade-Planung für die scharfen Kanten dieses Releases — für Teams, die die Plattform nicht allein tragen wollen.</p>
<h2 id="release-links">Release-Links</h2>
<ul>
<li><a href="https://github.com/cozystack/cozystack/releases/tag/v1.5.0">Cozystack v1.5.0 auf GitHub</a></li>
<li><a href="https://github.com/cozystack/cozystack/releases/tag/v1.5.4">Cozystack v1.5.4 auf GitHub</a></li>
<li><a href="https://cozystack.io/docs/v1.5/">Cozystack-v1.5-Dokumentation</a></li>
<li><a href="https://t.me/cozystack">Telegram</a> und <a href="https://kubernetes.slack.com/archives/C06L3CPRVN1">Slack</a> (Einladung über <a href="https://slack.kubernetes.io/">slack.kubernetes.io</a>)</li>
</ul>
]]></content:encoded></item><item><title>White-Label-Cloud-Playbook — für MSPs und Reseller 2026</title><link>https://aenix.io/de/blog/2026/05/white-label-cloud-playbook-msp-reseller/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/white-label-cloud-playbook-msp-reseller/</guid><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cozystack</category><category>Multi-tenancy</category><category>Hosting</category><category>Observability</category><description>Architektur und Reseller-Ökonomie für den Start einer White-Label-Cloud unter eigener Marke — und wie das Engagement mit Ænix dafür aufgebaut ist.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/white-label-cloud-playbook-msp-reseller.jpg" alt=""></p><h2 id="warum-die-white-label-cloud-für-msps-wichtig-ist">Warum die White-Label-Cloud für MSPs wichtig ist</h2>
<p>MSPs haben Kundenbeziehungen, die Hyperscaler nicht ohne Weiteres nachbilden können. Ihnen fehlt jedoch das Cloud-Produkt, um diese Beziehungen im großen Maßstab zu monetarisieren. Die White-Label-Cloud — als Produkt des MSP gebrandet, betrieben auf geteilter oder dedizierter Infrastruktur — schließt diese Lücke.</p>
<p>Das Muster 2026: Der MSP erhält ein gebrandetes, mandantenfähiges Cloud-Produkt auf einer Open-Source-Plattform; die Kunden nutzen die Cloud unter der Marke des MSP; der MSP vereinnahmt die Marge zwischen Plattformkosten und Kundenpreis.</p>
<h2 id="architektur">Architektur</h2>
<ul>
<li><strong>Mehrstufiges Tenant CRD</strong> — Root-Tenant → MSP-Tenant → Tenant des MSP-Kunden. Isolation auf jeder Ebene.</li>
<li><strong>Gebrandetes Cozystack Dashboard</strong> — der MSP kann Farben, Logo, Domain und die Optionen des Servicekatalogs anpassen</li>
<li><strong>WHMCS-Integration</strong> (proprietäres Ænix-Modul) — die Abrechnung läuft über das bestehende Kundenverwaltungssystem des MSP</li>
<li><strong>Servicekatalog</strong> — der MSP kann festlegen, welche Services er seinen Kunden anbietet (z. B. Kafka ausblenden, wenn er es nicht unterstützt)</li>
<li><strong>SLA-Management</strong> — Nachverfolgung des SLA pro Kunde über die Observability von Cozystack</li>
</ul>
<h2 id="reseller-ökonomie">Reseller-Ökonomie</h2>
<p>Typische Ökonomie für einen MSP, der eine White-Label-Cloud betreibt:</p>
<ul>
<li><strong>Plattformkosten</strong> — Ænix-Subskription (White-Labeling ab der Standard-Stufe, 3.000 $ pro 10 Nodes und Monat; siehe <a href="https://aenix.io/de/preise/">Preise</a>) + Hardware + Colocation</li>
<li><strong>Kosten pro Kunde</strong> — zusätzliche Hardware, Storage und Bandbreite</li>
<li><strong>Kundenpreis</strong> — typischerweise 30–50 % über den reinen Plattformkosten</li>
<li><strong>Marge</strong> — deckt Support, Vertrieb und Betrieb des MSP</li>
</ul>
<p>Der Break-even liegt bei 30–50 zahlenden Kunden, wenn Sie Plattform und Werkzeuge abdecken; bei 50–100, wenn zusätzlich eine eigene Rufbereitschaft finanziert wird. Danach ist die Ökonomie positiv, abhängig vom Kundenmix.</p>
<h2 id="aufbau-des-engagements">Aufbau des Engagements</h2>
<ul>
<li><strong>Platform Readiness Assessment</strong> (14 oder 28 Tage, Festpreis) inklusive Produktreife</li>
<li><strong>Plattform live in wenigen Wochen</strong> über den produktisierten Installer, sobald die Hardware bereitsteht; Produkt- und Vertriebsarbeit läuft parallel in den folgenden Monaten</li>
<li><strong>Optionale Managed Services</strong></li>
</ul>
]]></content:encoded></item><item><title>Telco-Cloud-Modernisierung 2026 — von Legacy-NFV zur Kubernetes-nativen Edge</title><link>https://aenix.io/de/blog/2026/05/telco-cloud-modernisierung-nfv-kubernetes-edge/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/telco-cloud-modernisierung-nfv-kubernetes-edge/</guid><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Telco</category><category>Sovereignty</category><category>Multi-tenancy</category><category>Cozystack</category><category>Cloud</category><category>AI and ML</category><description>Wie Tier-1- und Tier-2-Telcos Legacy-NFV-Umgebungen zu Kubernetes-nativen, souveränen Cloud-Plattformen modernisieren — ein Leitfaden für Architekten.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/telco-cloud-modernisierung-nfv-kubernetes-edge.jpg" alt=""></p><p>Die Telco-Cloud-Diskussion des Jahres 2026 steht an einem
ungewöhnlichen Schnittpunkt von Belastungen, denen keine andere Branche
gleichzeitig ausgesetzt ist. NFV-Deployments aus den Jahren 2015–2020
kommen in die Jahre. NIS2-Pflichten gelten für die gesamte Infrastruktur
des Betreibers. Als souverän vermarktete Cloud-Produkte sind kommerziell
attraktiv (eine regionale Souveränitätspositionierung können Hyperscaler
nur schwer nachbilden). Die Nachfrage nach Edge Compute für
5G/6G-Workloads wächst. AI für den Netzbetrieb (Verkehrsprognose,
Anomalieerkennung, kundennahe Assistenten) entsteht gerade.</p>
<p>Die architektonische Antwort lautet selten „eine Plattform für alles“ —
Telcos haben mehrere Betriebsdomänen, jede mit eigenen Randbedingungen.
Die Muster, die über alle Domänen hinweg funktionieren, sind jedoch zu
Kubernetes-nativen Multi-Site-Plattformen mit starker
Mandantentrennung, souveränem Betrieb und Edge-bewusstem Scheduling
zusammengewachsen.</p>
<h2 id="was-die-modernisierung-tatsächlich-ersetzt">Was die Modernisierung tatsächlich ersetzt</h2>
<p>Die meisten europäischen Tier-1-Telcos betreiben 2026 drei oder vier
parallele Infrastrukturumgebungen:</p>
<h3 id="1-legacy-nfv-umgebung-baujahr-20152020">1. Legacy-NFV-Umgebung (Baujahr 2015–2020)</h3>
<p>Typischerweise aufgebaut auf VMware Cloud Foundation, auf
OpenStack-basierten Herstellerdistributionen (Red Hat OSP, Mirantis
Cloud Platform, Wind River usw.) oder auf herstellerspezifischer NFVI
(Ericsson CEE, Nokia CloudBand). Sie hostet VNFs von
Netzwerkausrüstern mit herstellerspezifischen
Zertifizierungsanforderungen.</p>
<p>Treiber der Modernisierung: Lebenszyklen der Herstellerdistributionen
(EOL von Red Hat OSP, Umbruch bei Mirantis), die VMware-Preise unter
Broadcom und eine betriebliche Komplexität, die mit jeder Fluktuation im
Team zunimmt. Die meisten Tier-1-Betreiber haben parallele
Modernisierungsprogramme laufen.</p>
<h3 id="2-it-cloud-getrennt-von-nfv">2. IT-Cloud (getrennt von NFV)</h3>
<p>Für Business-Workloads, Kundenportale, Billing, OSS/BSS. Typischerweise
eine separate VMware-Landschaft oder ein Deployment in einer
Hyperscaler-Region. Bei VMware derselbe Broadcom-Druck, beim
Hyperscaler-Deployment der Souveränitätsdruck.</p>
<h3 id="3-edge-compute-5g6g-ära">3. Edge Compute (5G/6G-Ära)</h3>
<p>Verteilte Edge-Standorte in Umspannwerken, Vermittlungsstellen und
MEC-Knoten. Deployments mit kleinerem Footprint und zeitweise
unterbrochener Anbindung an den Core. Häufig auf einem anderen Stack
als die Core-Plattform aufgebaut (ältere Orchestrierung für kleine
Footprints).</p>
<h3 id="4-ai--data-lake--netzanalytik">4. AI / Data Lake / Netzanalytik</h3>
<p>Eine neuere Umgebung für Verkehrsprognose, Anomalieerkennung und
kundennahe AI. Heute oft beim Hyperscaler; bei sensiblen
Workload-Mustern wächst der Souveränitätsdruck, sie on-prem zu holen.</p>
<h2 id="die-vision-einer-einzigen-plattform-und-wo-sie-funktioniert">Die Vision einer einzigen Plattform (und wo sie funktioniert)</h2>
<p>Der architektonische Reiz einer Modernisierung auf Basis von Cozystack
ist eine einheitliche Plattform über alle vier Umgebungen hinweg: ein
Betriebsmodell, ein Upgrade-Lebenszyklus, ein Observability-Stack,
föderierte Identitäten, GitOps-gesteuerte Änderungen.</p>
<p>Wo das funktioniert:</p>
<ul>
<li><strong>IT-Cloud-Workloads</strong> — ein unkompliziertes Deployment auf Basis von
Cozystack. Die meisten IT-Cloud-Modernisierungen bei Tier-1-Telcos
folgen diesem Muster.</li>
<li><strong>AI / Data Lake / Analytics</strong> — Workload-Muster der Cozystack AI
Platform; standardmäßig souverän; mandantenfähig für den Zugriff über
Geschäftsbereiche hinweg.</li>
<li><strong>Edge Compute</strong> — Cozystack unterstützt Edge-Deployments mit kleinem
Footprint und Föderation zum Core. Standardisiert über alle Standorte.</li>
</ul>
<p>Wo eine differenzierte Betrachtung nötig ist:</p>
<ul>
<li><strong>Speziell die NFV-Umgebung</strong> — die VNF-Zertifizierung mit
Herstellerausrüstung wird weiterhin von den Herstellern gesteuert. Die
darunterliegende Cozystack-Plattform kann KubeVirt-basierte VNFs
hosten, der Zertifizierungs-Stack bleibt aber an die Hersteller
gebunden. Manche VNFs sind auf bestimmten OpenStack-Distributionen
zertifiziert und brauchen einen parallelen Modernisierungsstrang.</li>
<li><strong>Kritisches Netz-OAM im SCADA-Stil</strong> — vom Netz getrennte
(air-gapped) Netzmanagementsysteme mit eigenem Betriebsmodell.
Cozystack kann sie hosten, die OT-artige Betriebsdisziplin
unterscheidet sich jedoch von der IT-Cloud.</li>
</ul>
<p>Das praktische Muster: Cozystack als IT-Cloud-Plattform, AI-Plattform
und Edge-Plattform; NFV erhält einen eigenen Modernisierungsstrang mit
einer Cozystack-äquivalenten Architektur, soweit die
Herstellerzertifizierung es zulässt.</p>
<h2 id="mandantenfähigkeit-im-telco-umfeld">Mandantenfähigkeit im Telco-Umfeld</h2>
<p>Telcos haben mehrschichtige Anforderungen an die Mandantenfähigkeit:</p>
<ul>
<li><strong>Trennung der operativen Geschäftsbereiche</strong> — Festnetz-Breitband,
Mobilfunk, Geschäftskunden, Privatkunden; jeder Geschäftsbereich hat
eine andere operative Verantwortung.</li>
<li><strong>Kundenseitige Services</strong> — der Telco bietet seinen Geschäftskunden
Cloud-Kapazität an (Produktlinie souveräne Cloud); jeder Kunde ist ein
eigener Tenant.</li>
<li><strong>Interne versus externe Workloads</strong> — rein interne Workloads (OAM,
Observability-Backends) gegenüber kundenseitigen Workloads
(Cloud-Produkt, Kundenportal).</li>
<li><strong>Sektorale bzw. regulierte Tenants</strong> — Telcos hosten zunehmend
regulierte Workloads (Nähe zum Finanzsektor, Aufträge der öffentlichen
Hand) mit sektoraler Tenant-Isolation.</li>
</ul>
<p>Das Tenant-CRD-Modell von Cozystack mit verschachtelten Tenants
unterstützt alle vier Ebenen nativ. Ein Tier-1-Telco betreibt
typischerweise 5–50 Top-Level-Tenants mit Hunderten bis Tausenden
verschachtelter Tenants.</p>
<h2 id="positionierung-über-souveränität">Positionierung über Souveränität</h2>
<p>Für Telcos ist Souveränität nicht nur eine Compliance-Frage, sondern ein
kommerzielles Unterscheidungsmerkmal. Europäische Kunden sehen
Abhängigkeiten von Hyperscalern mit Hauptsitz in den USA zunehmend als
strukturelles Risiko. Telcos können in ihrer Region souveräne
Cloud-Produkte anbieten, mit denen von Hyperscalern betriebene Angebote
bei den inhaltlichen Souveränitätskriterien nicht mithalten können.</p>
<p>Eine Architektur auf Basis von Cozystack unterstützt das kommerziell:</p>
<ul>
<li><strong>Verschlüsselung mit Passphrase beim Kunden</strong> — optionale
Volume-Verschlüsselung im Ruhezustand (LINSTOR und LUKS); die Passphrase
verwaltet der Kunde des Telcos, der Telco leistet den Betriebssupport</li>
<li><strong>Air-Gap-Option</strong> — für Anwendungsfälle mit
Verschlusssachen</li>
<li><strong>Open-Source-Fundament</strong> — Exit-Fähigkeit ist eingebaut; der Telco
bindet seine Kunden nicht an eine Herstellerbeziehung</li>
<li><strong>EU-Rechtsraum</strong> — die EU-Präsenz des Telcos plus die
EU-Vertragsgesellschaft von Ænix (AENIX s.r.o.)</li>
</ul>
<p>Für kommerzielle Produktlinien einer souveränen Cloud ist die Ænix
Public Cloud Platform die typische Ergänzung — mehrere Regionen, mehrere
Rechenzentren, ein tiefer Servicekatalog und ein Kundenportal im eigenen
Markenauftritt.</p>
<h2 id="die-realität-von-edge-compute">Die Realität von Edge Compute</h2>
<p>5G/6G hat Anforderungen an verteiltes Computing mit sich gebracht, die
die Architektur der NFV-Ära nicht vorhergesehen hat. Modernes Edge
Compute für den Telco-Betrieb umfasst:</p>
<ul>
<li><strong>MEC-Knoten (Multi-access Edge Computing)</strong> an Basisstationen oder
Vermittlungsstellen für latenzarme Kunden-Workloads</li>
<li><strong>Verteilte RAN-Intelligenz</strong> — vRAN-/O-RAN-Workloads mit
Echtzeitanforderungen</li>
<li><strong>Customer-Edge-Compute</strong> — vom Telco verwaltete Edge-Instanzen beim
Kunden vor Ort (Fabriken, Smart-Grid-Standorte, Verkehrsknotenpunkte)</li>
<li><strong>Sektorale Edge</strong> — vom Telco betriebene Edge für Branchenkunden
(Bankfilialen, Gesundheitseinrichtungen, Einzelhandel)</li>
</ul>
<p>Cozystack unterstützt Edge-Deployments mit reduziertem Footprint
(typisch sind Cluster mit rund 3 Nodes an Edge-Standorten) und
Föderation zu regionalen und zentralen Plattformen. Dasselbe
Betriebsmodell, dieselbe Observability, ein je Ebene differenzierter
Servicekatalog.</p>
<h2 id="ai-für-den-telco-betrieb">AI für den Telco-Betrieb</h2>
<p>Die AI-Workload-Muster bei Tier-1-Telcos:</p>
<ul>
<li><strong>Verkehrsprognose und Kapazitätsplanung</strong> — Inferenz rund um die Uhr
auf Netztelemetrie</li>
<li><strong>Anomalieerkennung</strong> — Sicherheits- und Betriebsanomalien in
Echtzeit</li>
<li><strong>Kundennahe AI</strong> — Chatbot, Unterstützung bei Rechnungsfragen,
Routing im Kundenservice</li>
<li><strong>Netzoptimierung</strong> — Routing, Traffic Engineering, Energieeffizienz</li>
<li><strong>Betrugserkennung</strong> — Erkennung von Transaktionsanomalien,
Identitätsprüfung</li>
<li><strong>Sektorale AI-Services</strong> — vom Telco gehostete AI-Kapazität für
Branchenkunden (AI für Banken, Gesundheitswesen und öffentlichen
Sektor)</li>
</ul>
<p>Es dominieren Workload-Profile mit dauerhaft hoher Auslastung — genau
der Fall, in dem dedizierte GPUs wirtschaftlich besser abschneiden als
der Hyperscaler. Die Ænix AI Platform passt dazu.</p>
<h2 id="phasen-einer-tier-1-telco-modernisierung">Phasen einer Tier-1-Telco-Modernisierung</h2>
<p>Die Cloud-Plattform folgt dem Muster im Betreibermaßstab: 3–6 Monate
Pilot, danach 9–18 Monate bis zum vollen Multi-Region-Betrieb. Edge-Ausbau
und NFV-Modernisierung laufen als längere parallele Stränge, getaktet durch
den Standort-Rollout und die Lebenszyklen der Hersteller. Eine typische
Aufteilung in Phasen:</p>
<h3 id="phase-0--strategisches-engagement-beginn-des-pilots">Phase 0 — Strategisches Engagement (Beginn des Pilots)</h3>
<p>Architektur-Review über alle vier Umgebungen. Kommerzielle Abstimmung zur
Produktlinie souveräne Cloud, zur sektoralen Positionierung und zur
Reihenfolge der Modernisierung. Benennung von Sponsoren und Leitungen
der Arbeitsstränge.</p>
<h3 id="phase-1--modernisierung-der-it-cloud">Phase 1 — Modernisierung der IT-Cloud</h3>
<p>Die Ænix Private Cloud Platform bzw. Public Cloud Platform wird
bereitgestellt. Interne Workloads werden migriert. Das Kundenportal für
das souveräne Cloud-Produkt geht live.</p>
<h3 id="phase-2--ai--data-lake-parallel">Phase 2 — AI / Data Lake (parallel)</h3>
<p>Die Ænix AI Platform wird bereitgestellt. Workloads der
Netzanalytik wandern on-prem. Kundennahe AI-Services gehen live.</p>
<h3 id="phase-3--ausbau-der-edge-fortlaufend-getaktet-durch-den-standort-rollout">Phase 3 — Ausbau der Edge (fortlaufend, getaktet durch den Standort-Rollout)</h3>
<p>Edge-Standorte werden an MEC-, Vermittlungsstellen- und
Customer-Edge-Standorten aufgebaut. Identitäten und Observability sind
übergreifend föderiert.</p>
<h3 id="phase-4--nfv-modernisierung-parallel-getaktet-durch-die-lebenszyklen-der-hersteller">Phase 4 — NFV-Modernisierung (parallel, getaktet durch die Lebenszyklen der Hersteller)</h3>
<p>Replatforming herstellerzertifizierter VNFs, wo zulässig.
Greenfield-Deployments neuer VNFs auf einer Architektur auf Basis von
Cozystack. Die Legacy-NFV-Umgebung wird parallel weiterbetrieben, bis
der Lebenszyklus des Herstellers ein Upgrade erzwingt.</p>
<p>Ab Phase 5 hängt alles vom Wachstum des kundenseitigen Produkts ab:
regionale Expansion, sektorale SKUs, neue Service-Familien.</p>
<h2 id="wann-das-zu-einem-telco-passt">Wann das zu einem Telco passt</h2>
<p>Gute Passung:</p>
<ul>
<li>Europäischer Tier-1- oder Tier-2-Telekommunikationsbetreiber</li>
<li>Ein laufendes Programm zur Modernisierung von Legacy-NFV</li>
<li>Die strategische Absicht, eine Produktlinie souveräne Cloud anzubieten</li>
<li>Ein Budgetrahmen in Millionenhöhe über ein mehrjähriges Programm</li>
<li>Rückendeckung auf oberster Führungsebene (CIO / CTO / Leitung des
Cloud-Geschäftsbereichs)</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Kleinere Betreiber (regional, MVNO-artig), die Cloud verkaufen — die
Ænix Public Cloud Platform im Providermaßstab zu den <a href="https://aenix.io/de/preise/">veröffentlichten
Preisen</a> statt eines vollständigen Betreiberprogramms</li>
<li>Betreiber mit umfangreicher, noch funktionierender OpenStack-basierter
NFV-Investition — die Modernisierung kann warten, bis der Lebenszyklus
des Herstellers sie erzwingt</li>
</ul>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/branchen/telco/">Branchenseite Telco</a></strong> — die kommerzielle
Landingpage</li>
<li><strong><a href="https://aenix.io/de/produkte/public-cloud-platform/">Produktseite Public Cloud Platform</a></strong> —
das Produkt für Telcos, die Cloud-Services verkaufen</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/sovereign-cloud-builder/">Sovereign-Cloud-Builder-Leistungen</a></strong> —
für den Aufbau einer Produktlinie souveräne Cloud</li>
<li><strong><a href="https://aenix.io/de/loesungen/sovereign-ai/">Sovereign-AI-Leistungen</a></strong> — für
AI-Workload-Muster</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/public-cloud-platform-souveraenes-cloud-produkt/">Phasen des Aufbaus einer Public Cloud Platform</a></strong> —
mehrjährige Aufbauphasen</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/sovereign-ai-architektur-entscheidungen/">Entscheidungen für eine Sovereign-AI-Architektur</a></strong> —
sieben Entscheidungen für Sovereign AI</li>
</ul>
]]></content:encoded></item><item><title>SRE als Produktdisziplin — was ein SRE-Engagement tatsächlich verändert</title><link>https://aenix.io/de/blog/2026/05/sre-produktdisziplin-engagement-zuverlaessigkeit/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/sre-produktdisziplin-engagement-zuverlaessigkeit/</guid><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DevOps</category><category>Platform Engineering</category><category>Observability</category><category>Cozystack</category><description>SRE in Produktteams einbetten, als zentrale Funktion aufbauen oder als Engagement einkaufen — was jedes Modell leistet und wie Sie den Erfolg messen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/sre-produktdisziplin-engagement-zuverlaessigkeit.jpg" alt=""></p><p>SRE — Site Reliability Engineering — gehört zu den am weitesten
verbreiteten und zugleich am häufigsten missverstandenen
Engineering-Disziplinen des letzten Jahrzehnts. Die meisten mittleren
und großen Engineering-Organisationen behaupten, „SRE zu machen“.
Deutlich weniger betreiben die Disziplin tatsächlich so, wie sie das
ursprüngliche SRE-Buch von Google beschreibt: als Softwareentwicklung,
angewandt auf den Betrieb, mit expliziten Error Budgets, SLOs, die die
Priorisierung beeinflussen, und einer harten Obergrenze für operativen
Toil.</p>
<h2 id="was-sre-genau-bedeutet">Was SRE genau bedeutet</h2>
<p>Die ursprüngliche Google-Formulierung ruht auf drei tragenden
Eigenschaften:</p>
<h3 id="1-sre-ist-softwareentwicklung-angewandt-auf-den-betrieb">1. SRE ist Softwareentwicklung, angewandt auf den Betrieb</h3>
<p>SREs sind Softwareentwickler — sie schreiben Code, liefern Systeme aus
und automatisieren den Betrieb. Sie sind kein umbenanntes Ops-Team mit
derselben Aufgabe und einem schickeren Titel. Die Frage „Schreibt Ihr
SRE eigentlich Code?“ ist ein echter Test; Teams, die ihn nicht
bestehen, haben eine Betriebsfunktion, keine SRE-Funktion.</p>
<h3 id="2-error-budgets-beeinflussen-die-priorisierung">2. Error Budgets beeinflussen die Priorisierung</h3>
<p>Das SLO definiert die Messlatte. Das Error Budget ist die Differenz
zwischen 100 % und dem SLO-Zielwert. Ist das Error Budget aufgebraucht,
verschiebt sich die Priorisierung des Produktteams — die Feature-Arbeit
pausiert, Zuverlässigkeitsarbeit hat Vorrang. Ist das Error Budget
gesund, kann die Feature-Arbeit weiterlaufen.</p>
<p>Entscheidend ist: Das ist ein <em>Vertrag</em>, keine Empfehlung. Eine
SLO-Verletzung hat echte Folgen für die Produkt-Roadmap. Organisationen,
die SLOs haben, sie aber die Roadmap nicht beeinflussen lassen, haben
Observability, keine SRE-Praxis.</p>
<h3 id="3-operativer-toil-ist-begrenzt-oft-auf-50-">3. Operativer Toil ist begrenzt (oft auf 50 %)</h3>
<p>Die Google-Formulierung lautet: SREs dürfen höchstens 50 % ihrer Zeit
mit operativem Toil verbringen (wiederkehrender, manueller,
automatisierbarer Arbeit). Der Rest muss in Softwareentwicklung fließen,
die Toil reduziert. Dadurch verbessert sich die Funktion mit der Zeit
selbst — der Toil sinkt, die Engineering-Kapazität steigt.</p>
<p>Teams, die die Toil-Grenze strukturell überschreiten, haben eine
Betriebsfunktion, die sich als SRE ausgibt. Die Disziplin erodiert über
Monate, bis die Funktion nicht mehr vom klassischen Betrieb zu
unterscheiden ist.</p>
<h2 id="drei-engagement-modelle">Drei Engagement-Modelle</h2>
<p>Im Jahr 2026 sind drei strukturell unterschiedliche SRE-Modelle im
produktiven Einsatz:</p>
<h3 id="modell-1-eingebettetes-sre">Modell 1: eingebettetes SRE</h3>
<p>SREs sitzen in den Produktteams. Ein Produktteam umfasst 2–5
Engineers, von denen einer die SRE-Funktion übernimmt. Dasselbe Team
verantwortet Features und Zuverlässigkeit; der SRE prägt Architektur
und Bereitschaftsdienst von innen heraus.</p>
<p>Stärken: Ausrichtung zwischen SRE- und Produktprioritäten, schnelles
Feedback, keine Reibung zwischen Teams.</p>
<p>Schwächen: Die SRE-Qualität schwankt von Team zu Team, abhängig von der
eingebetteten Person. Zentrale SRE-Expertise wächst nicht kumulativ.
Über viele Produktteams hinweg lässt sich das Modell kaum skalieren,
ohne an Konsistenz zu verlieren.</p>
<p>Passt für: Organisationen mit 100–300 Engineers, in denen jedes
Produktteam klare Verantwortung trägt und pro Team etwa ein Engineer
mit SRE-Kompetenz verfügbar ist.</p>
<h3 id="modell-2-zentrale-sre-funktion">Modell 2: zentrale SRE-Funktion</h3>
<p>SREs sitzen in einer eigenen Funktion mit eigener Berichtslinie. Sie
beraten die Produktteams, setzen Zuverlässigkeitsstandards, betreiben
gemeinsam genutzte Infrastrukturkomponenten und die Services auf dem
kritischen Pfad.</p>
<p>Stärken: SRE-Expertise wächst kumulativ. Standards sind über Teams
hinweg konsistent. Services auf dem kritischen Pfad haben dedizierte
Verantwortliche für ihre Zuverlässigkeit.</p>
<p>Schwächen: Reibung zwischen Teams, wenn SRE-Empfehlungen mit den
Prioritäten der Produktteams kollidieren. Es besteht das Risiko, dass
SRE als Bremse statt als Ermöglicher wirkt.</p>
<p>Passt für: Organisationen ab 300 Engineers mit mehreren Services auf dem
kritischen Pfad und einer klaren Platform-Engineering-Funktion. Häufig
mit Platform Engineering als Schwesterfunktion kombiniert.</p>
<h3 id="modell-3-hybrid-eingebettet-plus-zentral">Modell 3: hybrid (eingebettet plus zentral)</h3>
<p>Eingebettete SREs in den Produktteams kümmern sich um die
teamspezifische Zuverlässigkeit. Eine zentrale SRE-Funktion betreibt die
gemeinsame Infrastruktur, setzt Standards und übernimmt die Eskalation
bei teamübergreifenden Incidents.</p>
<p>Stärken: verbindet die Vorteile beider Ansätze. Das häufigste Muster in
großen Organisationen (Google, Netflix, große Fintechs).</p>
<p>Schwächen: erfordert eine erhebliche Größe, um die doppelte Investition
zu rechtfertigen. Unterhalb von 500 Engineers lässt sich der Overhead
kaum amortisieren.</p>
<p>Passt für: Organisationen ab 500 Engineers mit mehreren
Geschäftsbereichen und einem umfangreichen Portfolio
zuverlässigkeitskritischer Workloads.</p>
<h2 id="wo-sre-zum-theater-wird">Wo SRE zum Theater wird</h2>
<p>Muster, die wir in Assessments beobachten:</p>
<h3 id="theater-1-slos-existieren-beeinflussen-die-roadmap-aber-nicht">Theater 1: SLOs existieren, beeinflussen die Roadmap aber nicht</h3>
<p>SLOs sind dokumentiert. Dashboards zeigen die SLO-Einhaltung.
Quartalsreviews erwähnen SLO-Trends. Die Priorisierung der Produktteams
läuft jedoch unabhängig vom Zustand des Error Budgets. Kommt es zu einer
SLO-Verletzung, folgt eine incidentbezogene Feuerwehraktion, aber keine
Neupriorisierung der Roadmap.</p>
<p>Das ist Observability mit SLO-Etiketten, keine SRE-Praxis. Für
Kaufentscheidungen ist die Unterscheidung wichtig: Organisationen in
diesem Zustand brauchen nicht mehr Dashboards, sondern ein anderes
Governance-Modell.</p>
<h3 id="theater-2-sre-titel-für-klassischen-betrieb">Theater 2: SRE-Titel für klassischen Betrieb</h3>
<p>Betriebsingenieure werden in „SRE“ umbenannt, ohne dass sich ihre
Arbeitsinhalte ändern. Sie verbringen weiterhin 90 % ihrer Zeit mit der
Ticket-Queue. Über Shell-Skripte hinaus schreiben sie keinen Code. Über
das Error Budget haben sie keinerlei Entscheidungsbefugnis.</p>
<p>Das ist ein Etikettenwechsel, kein Wandel der Disziplin. Typisch für
Übergänge von DevOps zu SRE, in die kein Executive Sponsor investiert
hat.</p>
<h3 id="theater-3-error-budgets-definiert-aber-nie-angewendet">Theater 3: Error Budgets definiert, aber nie angewendet</h3>
<p>Error Budgets werden berechnet. Einige Dashboards zeigen sie an. Es gibt
aber keinen Prozess dafür, was passiert, wenn sie aufgebraucht sind.
Faktisch ist das dasselbe wie gar kein Error Budget.</p>
<p>Abhilfe: Schreiben Sie das explizite Protokoll für den Feature-Stopp
auf, das beim Aufbrauchen des Error Budgets greift. Lassen Sie es von
der Produktführung absegnen. Testen Sie es einmal mit einem künstlichen
Budgetverbrauch, bevor Sie davon ausgehen, dass es in Produktion
funktioniert.</p>
<h3 id="theater-4-post-mortems-ohne-maßnahmen">Theater 4: Post-Mortems ohne Maßnahmen</h3>
<p>Nach Incidents finden Post-Mortems statt. Sie werden geschrieben. Sie
landen in einem Ordner. Keine einzige Maßnahme wird bis zum Abschluss
verfolgt. Dieselbe Klasse von Incidents tritt innerhalb von sechs
Monaten erneut auf.</p>
<p>Abhilfe: Maßnahmen aus Post-Mortems kommen in dasselbe Backlog wie die
Feature-Arbeit — mit benannten Verantwortlichen, Fälligkeitsterminen und
expliziter Priorisierung. Ein Post-Mortem hat nicht funktioniert, wenn
seine Maßnahmen nicht umgesetzt werden.</p>
<h2 id="was-ein-sre-engagement-von-ænix-liefert">Was ein SRE-Engagement von Ænix liefert</h2>
<p>Typischerweise arbeiten wir mit Organisationen, deren SRE-Praxis sich in
einem von drei Zuständen befindet:</p>
<ul>
<li><strong>Vor SRE</strong> — keine formale SRE-Funktion; Zuverlässigkeit ist
incidentgetriebene Feuerwehrarbeit. Das Engagement umfasst die
Definition der Funktion, einen Einstellungsplan und erste SLOs für
kritische Services.</li>
<li><strong>SRE im Theater-Zustand</strong> — SRE-Titel und Dashboards gibt es, die
Disziplin ist aber nicht angekommen. Das Engagement diagnostiziert,
welche Theater-Muster wirken, entwirft Korrekturen und umfasst häufig
funktionsübergreifende Governance-Arbeit.</li>
<li><strong>Reifes SRE, das wachsen muss</strong> — die Disziplin funktioniert in einem
Geschäftsbereich und muss nun auf die ganze Organisation skalieren oder
neue Service-Familien aufnehmen (AI/GPU-Workloads, Edge Compute,
souveräne Cloud). Das Engagement konzentriert sich auf Konsistenz und
Wissenstransfer.</li>
</ul>
<h3 id="arbeitsstrang-1--slo-definition">Arbeitsstrang 1 — SLO-Definition</h3>
<p>Für jeden kritischen Service definieren wir:</p>
<ul>
<li>SLI (Service Level Indicator) — was wir messen</li>
<li>SLO (Service Level Objective) — den Zielwert</li>
<li>Error Budget — die Differenz zwischen 100 % und dem SLO</li>
<li>Burn-down-Policy — was geschieht, während das Budget verbraucht wird</li>
<li>Erholungsschwelle — was die Priorität der Feature-Arbeit
wiederherstellt</li>
</ul>
<p>Ænix definiert Ihre SLOs nicht isoliert für Sie — wir moderieren den
Workshop, in dem Engineering- und Produktführung sie gemeinsam
erarbeiten. SLOs ohne gemeinsame Verantwortung setzen sich nicht durch.</p>
<h3 id="arbeitsstrang-2--incident-response-prozess">Arbeitsstrang 2 — Incident-Response-Prozess</h3>
<p>Rollen (Incident Commander, Protokollführung, Kommunikation).
Schweregrad-Klassifizierung. Aufbau der Runbooks. Eskalationswege.
Vorlage für Blameless Post-Mortems. Nachverfolgung der Maßnahmen.</p>
<p>Häufig ist das der Arbeitsstrang mit der größten Hebelwirkung — das
Framework vervielfacht die Wirksamkeit bei jedem künftigen Incident.</p>
<h3 id="arbeitsstrang-3--toil-messen-und-reduzieren">Arbeitsstrang 3 — Toil messen und reduzieren</h3>
<p>Wir inventarisieren die aktuelle Arbeit des SRE- bzw. Ops-Teams und
kategorisieren sie: Toil (wiederkehrend, manuell, automatisierbar)
gegenüber Engineering (dauerhaft, automatisierungserzeugend). Dann
messen wir den Toil-Anteil.</p>
<p>Wir empfehlen die 3–5 Automatisierungen, die den meisten Toil abbauen,
staffeln sie nach ROI und übergeben sie dem Engineering-Team zur
Umsetzung; bei Bedarf unterstützen wir.</p>
<h3 id="arbeitsstrang-4--observability-stack">Arbeitsstrang 4 — Observability-Stack</h3>
<p>Die Standardempfehlung von Ænix für Observability: VictoriaMetrics für
Metriken, VictoriaLogs für Logs, OpenTelemetry für Tracing, wo sinnvoll.
Selbst gehostet (souveränitätsfreundlich, im großen Maßstab mit weniger
Overhead als Prometheus + Loki, kein Datenabfluss an einen
SaaS-Anbieter).</p>
<p>Bei Organisationen, die bereits einen anderen Stack nutzen, arbeiten wir
mit dem Vorhandenen, statt einen Austausch zu forcieren. Der
Observability-Stack ist wichtig; die SRE-Disziplin ist wichtiger.</p>
<h3 id="arbeitsstrang-5--design-der-funktion">Arbeitsstrang 5 — Design der Funktion</h3>
<p>Empfehlung für das eingebettete, zentrale oder hybride Modell passend zum
Profil der Engineering-Organisation. Personalplanung.
Einstellungsprioritäten. Berichtslinie. Schnittstelle zu Platform
Engineering (sofern eigene Funktion) und zu den Produktteams.</p>
<h2 id="die-zuverlässigkeits-defaults-von-cozystack">Die Zuverlässigkeits-Defaults von Cozystack</h2>
<p>Organisationen, die ein Ænix-Plattformprodukt betreiben, haben bei der
SRE-Praxis einen Vorsprung, weil die Plattform mit SRE-tauglichen
Voreinstellungen ausgeliefert wird:</p>
<ul>
<li><strong>Integrierte Observability</strong> — VictoriaMetrics + VictoriaLogs sind
vorinstalliert, mit Alert-Regeln für die Plattformkomponenten</li>
<li><strong>Deklarative Änderungshistorie</strong> — Tenants und Services sind
Kubernetes-Ressourcen, verwaltet über GitOps; jede Änderung hat einen
Commit, einen Autor und ein Review</li>
<li><strong>Backup- und Restore-Muster</strong> — Velero plus PITR pro Anwendung; RPO /
RTO werden im Engagement pro Service dokumentiert</li>
</ul>
<p>SLO-Definitionen und Werkzeuge für Fehlerinjektion (Chaos Engineering)
sind keine Plattformfunktionen; sie werden im Engagement mit Ihnen
entworfen.</p>
<p>So kann sich das SRE-Engagement auf die organisationsspezifische Arbeit
konzentrieren (Design der Funktion, an Geschäftsprioritäten
ausgerichtete SLOs, Governance), statt das technische Fundament neu
aufzubauen.</p>
<h2 id="wann-dieses-engagement-passt">Wann dieses Engagement passt</h2>
<p>Gute Passung:</p>
<ul>
<li>Engineering-Organisation mit über 200 Engineers, in der
Zuverlässigkeit zum Thema auf Vorstandsebene wird</li>
<li>Ein Muster jüngster Incidents hat Zuverlässigkeitslücken offengelegt</li>
<li>Regulatorisch getriebene RTO/RPO-Pflichten (DORA Artikel 11–12, NIS2
Artikel 21 Absatz 2 Buchstabe c)</li>
<li>Bestehende Investitionen in Observability, aber keine klare
SRE-Disziplin</li>
<li>Eine Platform-Engineering-Funktion existiert oder wird aufgebaut (SRE
ergänzt Platform Engineering ganz natürlich)</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Kleinere Organisationen (unter 100 Engineers) — meist eingebettetes SRE
statt einer eigenen Funktion; das Ænix-Engagement kann schlanker
ausfallen (Workshop plus Beratung statt eines mehrmonatigen
Engagements)</li>
<li>Organisationen mit reifem SRE in einem Geschäftsbereich, das
ausgeweitet werden soll — der Umfang kann enger gefasst werden</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Reine Feuerwehr-Kultur ohne Rückendeckung der Engineering-Führung für
den Wandel der Disziplin — ein SRE-Engagement ohne Unterstützung des
Managements verkommt zu einem Incident-Response-Training; das ist
hilfreich, aber nicht das, was wir anbieten</li>
</ul>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/dienstleistungen/sre-consulting/">SRE-Consulting-Leistungen</a></strong> —
die kommerzielle Landingpage</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/devops-best-practices-2026/">DevOps-Best-Practices für 2026</a></strong> —
die acht DevOps-Praktiken einschließlich SRE</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/platform-engineering-vs-devops-vs-sre/">Platform Engineering vs DevOps vs SRE</a></strong> —
Begriffe und Design der Funktion</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/cloud-engineering/">Cloud-Engineering-Disziplinen</a></strong> —
die sieben Disziplinen, die sich gegenseitig verstärken</li>
</ul>
]]></content:encoded></item><item><title>Cozystack 1.4: Neues Dashboard, persistente Tenant-Worker, Backup-Strategien und anteiliges GPU-Sharing</title><link>https://aenix.io/de/blog/2026/05/cozystack-1-4-neues-dashboard-persistente-tenant-worker-backup-strategien-gpu-sharing/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/cozystack-1-4-neues-dashboard-persistente-tenant-worker-backup-strategien-gpu-sharing/</guid><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><dc:creator>Timur Tukaev</dc:creator><category>Cozystack</category><category>Kubernetes</category><category>KubeVirt</category><category>GPU</category><category>Multi-tenancy</category><category>Talos</category><description>Cozystack v1.4.0 ist verfügbar. Das Release erschien am 19. Mai 2026 und bündelt alle Fixes aus der Patch-Reihe v1.3.1 bis v1.3.3.</description><content:encoded><![CDATA[<blockquote>
<p><strong>Anmerkung der Redaktion (September 2026):</strong> Diese Release-Ankündigung ist so erhalten, wie sie am 28. Mai 2026 veröffentlicht wurde. Cozystack ist seither weitergegangen — die aktuelle Release-Linie ist 1.6. Das neueste Patch-Release finden Sie in die <a href="https://github.com/cozystack/cozystack/releases">Cozystack-Releases</a> und die <a href="https://cozystack.io/docs/">aktuelle Dokumentation</a>. Die Dokumentationslinks unten verweisen bewusst auf die v1.4-Dokumentation, die das Release im Auslieferungszustand beschreibt.</p>
</blockquote>
<p>Cozystack v1.4.0 ist verfügbar. Das Release wurde am 19. Mai 2026 veröffentlicht und bündelt alle Fixes aus der Patch-Reihe v1.3.1 bis v1.3.3.</p>
<p>Dieser Zyklus konzentriert sich auf den Betrieb von Cozystack als Produktivplattform: eine schnellere Dashboard-Architektur, langlebigere Worker für Tenant-Kubernetes, klarere Ressourcen-Dimensionierung, Backup-Abläufe für Managed Applications, bessere GPU-Auslastung, sichereres Veröffentlichen über Ingress und weniger Race Conditions bei Erstinstallation und Upgrade.</p>
<p><img src="https://aenix.io/img/blog/medium/cozystack-1-4-new-dashboard-ui-persistent-tenant-workers-backup-strategies-and-fractional-gpu-sharing/cover.jpg" alt="Release Cozystack 1.4" width="1200" height="630" loading="lazy" decoding="async"></p>
<h2 id="die-wichtigsten-neuerungen">Die wichtigsten Neuerungen</h2>
<h3 id="neues-schemagetriebenes-dashboard">Neues, schemagetriebenes Dashboard</h3>
<p>Cozystack 1.4 liefert ein neu geschriebenes Dashboard aus dem Projekt <code>cozystack/cozystack-ui</code> aus. Der bisherige Stack aus <code>openapi-ui</code> plus BFF ist durch ein Frontend auf Basis von React 19 und TypeScript ersetzt, das direkt mit der Kubernetes-API spricht.</p>
<p><img src="https://aenix.io/img/blog/medium/cozystack-1-4-new-dashboard-ui-persistent-tenant-workers-backup-strategies-and-fractional-gpu-sharing/02.png" alt="Das neue Cozystack-Dashboard" width="1915" height="672" loading="lazy" decoding="async"></p>
<p>Die neue Architektur entfernt einen zusätzlichen Prozess und eine Proxy-Schicht, während das Dashboard schemagetrieben bleibt. Außerdem verbessert sie mehrere alltägliche Abläufe:</p>
<ul>
<li>Der VNC-Zugriff auf virtuelle Maschinen verwendet jetzt dynamische WebSocket-URLs statt deployment-spezifischer Annahmen über <code>localhost</code>.</li>
<li>Das Dashboard kann <code>ApplicationDefinition</code>-Ressourcen für Anwendungskatalog und Marketplace auslesen.</li>
<li>Betreiber können Branding zur Laufzeit über eine ConfigMap einspielen — Logos, Namen und Markenfarben —, ohne das Image neu zu bauen.</li>
<li>Bestehende Lesezeichen auf <code>/openapi-ui/*</code> werden auf die neue Konsole umgeleitet.</li>
<li>Das Paket heißt durchgängig <code>cozy-dashboard</code>.</li>
</ul>
<p>Das neue Dashboard zeigt den IaaS-Marketplace, der von ApplicationDefinition-Ressourcen gespeist wird.</p>
<p><img src="https://aenix.io/img/blog/medium/cozystack-1-4-new-dashboard-ui-persistent-tenant-workers-backup-strategies-and-fractional-gpu-sharing/03.png" alt="Der IaaS-Marketplace im neuen Cozystack-Dashboard" width="1902" height="874" loading="lazy" decoding="async"></p>
<p>Der PaaS-Katalog umfasst Managed Databases, Messaging, Objektspeicher, Secrets, Suche und Inference-Dienste.</p>
<p>Das Ausrollen eines Managed-Kubernetes-Clusters läuft über dasselbe schemagetriebene Formular, wobei Cluster-Addons deklarativ zur Verfügung stehen.</p>
<p>Ein Managed-HTTP-Cache-Deployment, bei dem PVC-Größe, Storage-Klasse, Endpunkte und Ressourcenparameter vollständig aus dem Anwendungsschema erzeugt werden.</p>
<p>Dokumentation:</p>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/getting-started/deploy-app/">Anwendungen über das neue Dashboard ausrollen</a></li>
<li><a href="https://cozystack.io/docs/v1.4/cozystack-api/application-definitions/">ApplicationDefinition-Referenz</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/configuration/white-labeling/">White-Labeling und Branding zur Laufzeit</a></li>
</ul>
<h3 id="persistenter-worker-speicher-für-tenant-kubernetes">Persistenter Worker-Speicher für Tenant-Kubernetes</h3>
<p>Die Worker-VMs von Tenant-Kubernetes nutzen jetzt PVC-gestützte persistente Disks über die KubeVirt-<code>dataVolumeTemplates</code>. Bisher lief der Worker auf flüchtigem <code>emptyDisk</code>-Speicher, wodurch Kubelet-Zertifikate, kubeconfig und der containerd-Zustand nach einem VM-Neustart verloren gingen. Ein neu gestarteter Worker konnte damit seine Identität verlieren und musste von Hand wiederhergestellt werden.</p>
<p>In v1.4 übersteht der Worker-Zustand VM-Neustarts. Das NodeGroup-Feld <code>ephemeralStorage</code> heißt jetzt <code>diskSize</code>, und eine neue Option <code>storageClass</code> je NodeGroup lässt Betreiber steuern, wo die Worker-Disks bereitgestellt werden. Migration 39 schreibt Altwerte beim Upgrade automatisch um.</p>
<p>Bestehende Tenant-Cluster rollen ihre Worker-Nodes einmalig neu aus, weil sich das KubeVirt-Machine-Template ändert. Betreiber sollten Kapazität für diesen Rollout einplanen und die Storage-Klasse bewusst wählen. Für viele Worker-Disk-Szenarien empfiehlt sich die StorageClass <code>local</code>, weil Worker-Disks Neustarts nun überstehen und keine DRBD-Replikationssemantik brauchen.</p>
<p>Dokumentation: <a href="https://cozystack.io/docs/v1.4/kubernetes/">Konfiguration von Tenant-Kubernetes</a>.</p>
<h3 id="ressourcen-presets-als-instance-types">Ressourcen-Presets als Instance Types</h3>
<p>Ressourcen-Presets folgen jetzt einer Cloud-üblichen Systematik <code>&lt;series&gt;.&lt;size&gt;</code>. Das neue Modell deckt fünf Serien mit unterschiedlichem CPU-zu-Speicher-Verhältnis ab:</p>
<ul>
<li><code>t1</code> für sehr kleine und speicherarme Workloads.</li>
<li><code>c1</code> für rechenlastig ausgewogene Workloads.</li>
<li><code>s1</code> für Standarddienste wie Proxies und Caches.</li>
<li><code>u1</code> für universelle Workloads wie Datenbanken und Messaging.</li>
<li><code>m1</code> für speicherhungrige Workloads wie Suche und Analytik.</li>
</ul>
<p>Jede Serie umfasst acht Größen von <code>nano</code> bis <code>4xlarge</code>, womit Betreibern und Tenants insgesamt 40 Presets zur Verfügung stehen.</p>
<p>Die bisherigen flachen Namen wie <code>small</code>, <code>medium</code> und <code>large</code> werden weiterhin als veraltete Aliase akzeptiert. Bestehende Deployments behalten dieselben CPU- und Speicherwerte, während Migration 39 die gespeicherten Werte auf die neuen Namen umschreibt. Die Cozystack-API gibt jetzt Deprecation-Warnungen aus, wenn App-CRs noch die alten Preset-Namen verwenden.</p>
<p>Dokumentation: <a href="https://cozystack.io/docs/v1.4/guides/resource-management/">Ressourcen-Presets</a>.</p>
<h3 id="deklarative-backup-strategien-für-managed-applications">Deklarative Backup-Strategien für Managed Applications</h3>
<p>Der Backup-Strategy-Controller unterstützt jetzt PostgreSQL, MariaDB, ClickHouse und FoundationDB. Tenants definieren eine Strategie zusammen mit den Ressourcen <code>BackupClass</code>, <code>Plan</code>, <code>BackupJob</code> und <code>RestoreJob</code>, während der Controller die backend-spezifischen Objekte für den jeweiligen Managed Service zusammensetzt.</p>
<p>Die neuen Strategien unterstützen geplante Backups, Ad-hoc-Snapshots, In-place-Restores und Restore-to-copy-Abläufe gegen S3-kompatiblen Objektspeicher. Zugangsdaten werden über Kubernetes-Secrets referenziert statt inline hinterlegt, und die RBAC des Controllers ist so eingeschränkt, dass er ausschließlich auf explizit referenzierte Secrets zugreifen kann.</p>
<p>Das erweitert die bestehenden Backup-Abläufe für VMInstance und VMDisk und bringt Cozystack der vollständigen Backup-Abdeckung über den gesamten Katalog der Managed Applications näher.</p>
<p>Dokumentation:</p>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/operations/services/managed-app-backup-configuration/">Backup-Konfiguration für Managed Apps</a></li>
<li><a href="https://cozystack.io/docs/v1.4/applications/backup-and-recovery/">Backup und Wiederherstellung von Anwendungen</a></li>
</ul>
<h3 id="anteiliges-gpu-sharing-mit-hami">Anteiliges GPU-Sharing mit HAMi</h3>
<p>Cozystack 1.4 ergänzt <code>hami</code> als optionales Systempaket. HAMi v2.8.1, ein CNCF-Sandbox-Projekt, ermöglicht anteiliges GPU-Sharing für Tenant-Kubernetes-Cluster.</p>
<p>Mit aktiviertem HAMi können Tenant-Workloads Ressourcen wie <code>nvidia.com/gpu</code>, <code>nvidia.com/gpumem</code> und <code>nvidia.com/gpucores</code> anfordern. Damit teilen sich mehrere Pods eine physische NVIDIA-GPU bei expliziter Aufteilung von Speicher und Rechenleistung. Die Integration umfasst Device-Plugin, Scheduler-Extender, Mutating Webhook und RuntimeClass. Sie wird über den Schalter <code>hami.enabled</code> zugeschaltet und setzt den NVIDIA GPU Operator voraus.</p>
<p>Ein Kompatibilitätshinweis ist dabei wichtig: Die Compute-Isolation von HAMi setzt Container-Images mit einer glibc älter als 2.34 voraus. Die Speicherbegrenzung funktioniert breit, Alpine- und musl-basierte Images werden für die HAMi-core-Compute-Isolation jedoch nicht unterstützt.</p>
<p>Dokumentation: <a href="https://cozystack.io/docs/v1.4/kubernetes/gpu-sharing/">GPU-Sharing mit HAMi</a>.</p>
<h3 id="ein-schalter-für-proxy-protokoll-und-hairpin-nat">Ein Schalter für PROXY-Protokoll und Hairpin-NAT</h3>
<p>Die neue Option <code>publishing.proxyProtocol: true</code> aktiviert das PROXY-Protokoll am Host-ingress-nginx und rollt Ouroboros aus, um das damit verbundene Hairpin-NAT-Problem zu lösen.</p>
<p>Ist das PROXY-Protokoll aktiv, kann clusterinterner Verkehr an die eigenen öffentlichen Hostnamen des Clusters andernfalls ohne den erforderlichen PROXY-Header bei ingress-nginx ankommen. Ouroboros korrigiert diesen Pfad über CoreDNS-Rewrite-Snippets. Cozystack stellt es sowohl als Systempaket auf Host-Ebene als auch als Addon je Tenant über <code>addons.ouroboros.enabled</code> bereit.</p>
<p>Das Standardverhalten bleibt unverändert. Cluster, die das PROXY-Protokoll nicht aktivieren, erhalten keine neuen Ressourcen.</p>
<p>Dokumentation: <a href="https://cozystack.io/docs/v1.4/networking/hairpin-proxy-protocol/">PROXY-Protokoll und Hairpin-NAT</a>.</p>
<h3 id="besseres-helmrelease-verhalten-und-zuverlässigerer-tenant-bootstrap">Besseres HelmRelease-Verhalten und zuverlässigerer Tenant-Bootstrap</h3>
<p>Der Cozystack-Operator stellt die Stellschrauben für die HelmRelease-Erzeugung jetzt als Operator-Flags und Chart-Werte bereit, darunter Interval, Retry-Interval, Install-Timeout, Upgrade-Timeout und Max History.</p>
<p>Die Retry-Strategie nutzt jetzt <code>RetryOnFailure</code> und vermeidet damit Deinstallations- und Neuinstallationsschleifen, wenn eine Erstinstallation langsam läuft. Anwendungen können zudem je Application ein eigenes Install- und Upgrade-Timeout über die Annotation <code>release.cozystack.io/helm-install-timeout</code> setzen. Tenant-Kubernetes nutzt das, um Kamaji beim Kaltstart genug Zeit zu geben, und behebt damit den wiederkehrenden Fehlerfall <code>wait hr/tenant-kubernetes timeout</code>.</p>
<p>Dokumentation:</p>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/kubernetes/">Betrieb von Tenant-Kubernetes</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/troubleshooting/flux-cd/">Fehlersuche in Flux CD</a></li>
</ul>
<h3 id="kubelet-reservierungen-für-worker-nodes">Kubelet-Reservierungen für Worker-Nodes</h3>
<p>Worker-Nodes in Tenant-Kubernetes erhalten jetzt automatisch berechnete Kubelet-Reservierungen für CPU und Arbeitsspeicher. Das schützt das Kubelet selbst davor, unter Speicherdruck abgeräumt zu werden, und macht die Entscheidungen von Scheduler und Autoscaler genauer.</p>
<p>Die Annotationen des Cluster-Autoscalers melden jetzt die zuteilbaren (allocatable) CPU- und Speicherwerte statt der Rohwerte, sodass Autoscaling-Entscheidungen dem entsprechen, was Kubernetes tatsächlich schedulen kann.</p>
<p>Dokumentation: <a href="https://cozystack.io/docs/v1.4/kubernetes/">Betrieb von Tenant-Kubernetes</a>.</p>
<h2 id="außerdem-in-v140">Außerdem in v1.4.0</h2>
<ul>
<li>PostgreSQL-Parameter sind jetzt typisiert und durch eine Denylist gegen gefährliche Werte wie <code>archive_command</code>, <code>restore_command</code>, <code>ssl_passphrase_command</code>, <code>dynamic_library_path</code> und <code>*_preload_libraries</code> abgesichert.</li>
<li>Keycloak erhält Unterstützung für <code>extraEnv</code> und die Anpassung des Nutzerprofils.</li>
<li>Die etcd-Anwendung stellt über den aktualisierten etcd-operator S3-Backup-Zeitpläne bereit.</li>
<li>Die <code>upgradeCRDs</code>-Policy ist jetzt je Paket konfigurierbar.</li>
<li><code>cozyreport</code> sammelt jetzt Flux, cert-manager, Host-Kontext, Anwendungsressourcen und eine übergeordnete <code>summary.txt</code>.</li>
<li>Der SeaweedFS-Tenant-Ingress begrenzt einzelne PUT-Requests auf 5 GB.</li>
<li>Für Grafana und VictoriaMetrics kamen GPU-Observability-Dashboards und Recording Rules hinzu.</li>
<li>Die Portfilterung für VMInstance ist im neuen cozy-proxy-v0.3.0-Modus korrigiert.</li>
<li>LINSTOR CSI ist aktualisiert, mit Fixes für Dual-Attach- und transiente Demotion-Fehler.</li>
</ul>
<p>Dokumentation:</p>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/applications/postgres/">PostgreSQL-Konfiguration</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/oidc/">Keycloak und OIDC</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/services/etcd/">Konfiguration des etcd-Dienstes</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/services/seaweedfs/">Konfiguration des SeaweedFS-Dienstes</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/services/monitoring/dashboards/">Monitoring-Dashboards</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/troubleshooting/">Fehlersuche und Diagnose</a></li>
</ul>
<h2 id="plattformkomponenten">Plattformkomponenten</h2>
<p>Cozystack 1.4 aktualisiert die Plattformbasis und mehrere Kernpakete:</p>
<ul>
<li>Talos: v1.12.7 auf v1.13.0</li>
<li>cert-manager: v1.19.3 auf v1.20.2</li>
<li>Cilium: v1.19.1 auf v1.19.3</li>
<li>NVIDIA GPU Operator: v25.3.0 auf v26.3.1</li>
<li>etcd-operator: v0.4.2 auf v0.4.3</li>
<li>KubeVirt: v1.6.3 auf v1.8.2</li>
<li>cozy-proxy: v0.2.0 auf v0.3.0</li>
<li>linstor-csi: v1.10.6</li>
<li>HAMi: v2.8.1</li>
<li>Ouroboros: v0.7.2</li>
</ul>
<p>Dokumentation:</p>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/guides/platform-stack/">Überblick über den Plattform-Stack</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/cluster/upgrade/">Upgrade-Leitfaden</a></li>
</ul>
<h2 id="hinweise-zum-upgrade">Hinweise zum Upgrade</h2>
<p>Die meisten Betreiber können ohne manuelle Konfigurationsänderungen auf v1.4.0 aktualisieren. Cozystack behält für bestehende Workloads dieselbe API-Oberfläche, und die plattforminternen Migrationen erledigen die wesentlichen Wertumschreibungen.</p>
<p>Einige betriebliche Details sollten Sie einplanen:</p>
<ul>
<li>Die Worker von Tenant-Kubernetes rollen einmalig durch. Die Migration von <code>ephemeralStorage</code> auf <code>diskSize</code> läuft automatisch, bestehende Worker-VMs werden aber nacheinander ersetzt, weil sich das KubeVirt-Machine-Template ändert.</li>
<li>KubeVirt-VMs, die schon vor dem Plattform-Upgrade liefen, brauchen danach einen Kaltstart. Der KubeVirt-Sprung von v1.6.3 auf v1.8.2 überquert eine Upstream-Änderung an QEMU, und die Live-Migration von VMs aus der Zeit vor dem Upgrade kann fehlschlagen. Nach dem Upgrade angelegte VMs sind nicht betroffen.</li>
<li>Die alten Preset-Namen funktionieren weiterhin als veraltete Aliase, neue Deployments sollten jedoch die Namen im Schema <code>&lt;series&gt;.&lt;size&gt;</code> verwenden.</li>
<li>PostgreSQL-Deployments, die Parameter der Denylist verwenden, lassen sich nicht mehr rendern, solange diese Parameter nicht entfernt sind.</li>
<li>cert-manager v1.20 ändert die Standard-UID/GID im Container auf 65532. Betreiber mit eigener PodSecurityPolicy, mit imagePullSecrets oder mit Zertifikaten, die über das Dateisystem eingebunden und auf die bisherige UID festgelegt sind, sollten ihre Konfiguration prüfen.</li>
</ul>
<p>Dokumentation:</p>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/operations/cluster/upgrade/">Upgrade-Leitfaden</a></li>
<li><a href="https://cozystack.io/docs/v1.4/kubernetes/">Betrieb von Tenant-Kubernetes</a></li>
<li><a href="https://cozystack.io/docs/v1.4/virtualization/">Betrieb der Virtualisierung</a></li>
<li><a href="https://cozystack.io/docs/v1.4/guides/resource-management/">Ressourcenverwaltung</a></li>
<li><a href="https://cozystack.io/docs/v1.4/applications/postgres/">PostgreSQL-Konfiguration</a></li>
</ul>
<h2 id="dokumentation-die-sie-kennen-sollten">Dokumentation, die Sie kennen sollten</h2>
<ul>
<li><a href="https://cozystack.io/docs/v1.4/getting-started/deploy-app/">Neues Dashboard und Anwendungskatalog</a></li>
<li><a href="https://cozystack.io/docs/v1.4/cozystack-api/application-definitions/">ApplicationDefinition-Referenz</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/configuration/white-labeling/">White-Labeling und Branding zur Laufzeit</a></li>
<li><a href="https://cozystack.io/docs/v1.4/kubernetes/">Konfiguration von Tenant-Kubernetes</a></li>
<li><a href="https://cozystack.io/docs/v1.4/guides/resource-management/">Ressourcen-Presets</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/services/managed-app-backup-configuration/">Backup-Konfiguration für Managed Apps</a></li>
<li><a href="https://cozystack.io/docs/v1.4/applications/backup-and-recovery/">Backup und Wiederherstellung von Anwendungen</a></li>
<li><a href="https://cozystack.io/docs/v1.4/kubernetes/gpu-sharing/">GPU-Sharing mit HAMi</a></li>
<li><a href="https://cozystack.io/docs/v1.4/networking/hairpin-proxy-protocol/">PROXY-Protokoll und Hairpin-NAT</a></li>
<li><a href="https://cozystack.io/docs/v1.4/operations/cluster/upgrade/">Upgrade-Leitfaden</a></li>
<li><a href="https://cozystack.io/docs/v1.4/">Cozystack-v1.4-Dokumentation</a></li>
</ul>
<h2 id="dank-an-alle-mitwirkenden">Dank an alle Mitwirkenden</h2>
<p>Dieses Release ist geprägt von der Arbeit von <a href="https://github.com/androndo">@androndo</a>, <a href="https://github.com/Arsolitt">@Arsolitt</a>, <a href="https://github.com/dislogical">@dislogical</a>, <a href="https://github.com/dvc">@dvc</a>, <a href="https://github.com/IvanHunters">@IvanHunters</a>, <a href="https://github.com/kvaps">@kvaps</a>, <a href="https://github.com/lexfrei">@lexfrei</a>, <a href="https://github.com/matthieu-robin">@matthieu-robin</a>, <a href="https://github.com/mattia-eleuteri">@mattia-eleuteri</a>, <a href="https://github.com/myasnikovdaniil">@myasnikovdaniil</a>, <a href="https://github.com/sircthulhu">@sircthulhu</a> und <a href="https://github.com/tym83">@tym83</a>.</p>
<p>Ein besonderes Willkommen an die erstmaligen Mitwirkenden <a href="https://github.com/dvc">@dvc</a> und <a href="https://github.com/dislogical">@dislogical</a>. Vielen Dank an alle.</p>
<h2 id="release-links">Release-Links</h2>
<ul>
<li><a href="https://github.com/cozystack/cozystack/releases/tag/v1.4.0">Cozystack v1.4.0 auf GitHub</a></li>
<li><a href="https://github.com/cozystack/cozystack/compare/v1.3.0...v1.4.0">Vollständiges Changelog v1.3.0 bis v1.4.0</a></li>
<li><a href="https://github.com/cozystack/cozystack-ui">Cozystack UI</a></li>
<li><a href="https://github.com/Project-HAMi/HAMi">HAMi</a></li>
<li><a href="https://github.com/lexfrei/ouroboros">Ouroboros</a></li>
</ul>
<h2 id="community">Community</h2>
<ul>
<li>GitHub: <a href="https://github.com/cozystack/cozystack">cozystack/cozystack</a></li>
<li>Telegram: <a href="https://t.me/cozystack">@cozystack</a></li>
<li>Slack: <a href="https://kubernetes.slack.com/archives/C06L3CPRVN1">#cozystack</a> im Kubernetes-Workspace (<a href="https://slack.kubernetes.io/">Einladung</a>)</li>
<li><a href="https://zoom-lfx.platform.linuxfoundation.org/meetings/cozystack">Kalender der Community-Meetings abonnieren</a></li>
<li><a href="https://webcal.prod.itx.linuxfoundation.org/lfx/lfsixxnFWxbvsyEuC2">Meetings dem eigenen Kalender hinzufügen</a></li>
</ul>
<hr>
<p>Dieser Beitrag ist eine deutsche Fassung des Artikels <a href="https://blog.aenix.io/cozystack-1-4-0c5e399a7308">Cozystack 1.4: New Dashboard UI, Persistent Tenant Workers, Backup Strategies, and Fractional GPU Sharing</a>, zuerst erschienen bei <a href="https://blog.aenix.io">Ænix</a> auf Medium.</p>
]]></content:encoded></item><item><title>Sieben Entscheidungen beim Entwurf einer Sovereign-AI-Architektur</title><link>https://aenix.io/de/blog/2026/05/sovereign-ai-architektur-entscheidungen/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/sovereign-ai-architektur-entscheidungen/</guid><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DORA</category><category>NIS2</category><category>Sovereignty</category><category>AI and ML</category><category>Multi-tenancy</category><category>Financial Services</category><description>Sieben Architekturentscheidungen hinter einem souveränen AI-Stack, wie sie ineinandergreifen und welche Kombinationen in realen Deployments immer wiederkehren.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/sovereign-ai-architektur-entscheidungen.jpg" alt=""></p><h2 id="die-sieben-entscheidungen">Die sieben Entscheidungen</h2>
<h3 id="1-auslöserprofil">1. Auslöserprofil</h3>
<p>Was treibt Sie in Richtung Souveränität? (Regulierte Datenklasse / Wirtschaftlichkeit der Inference / Prüfbarkeit / Air-Gap-Anforderung)</p>
<h3 id="2-regulatorischer-rahmen">2. Regulatorischer Rahmen</h3>
<p>Welche Aufsicht bindet Sie? (DORA, NIS2, sektorale Vorgaben, Vorgabe einer souveränen Cloud, grenzüberschreitende Übermittlung nach DSGVO)</p>
<h3 id="3-modellauswahl">3. Modellauswahl</h3>
<p>Open-Weight oder proprietär. Gängige Open-Weight-Modelle 2026: Llama, Mistral, Qwen, DeepSeek, Phi, Gemma. Die Wahl hängt ab von:</p>
<ul>
<li>Sprachanforderung (mehrsprachig oder Englisch)</li>
<li>Workload-Typ (Chat / RAG / Code / Vision / Embedding)</li>
<li>Lizenz (kommerzielle Nutzung, Namensnennung, Weitergabe)</li>
<li>Angestrebter Leistungsfähigkeit</li>
</ul>
<h3 id="4-hardware-dimensionierung">4. Hardware-Dimensionierung</h3>
<ul>
<li>NVIDIA H100/H200 — das Arbeitspferd für Fine-Tuning und Inference mit hohem Durchsatz</li>
<li>NVIDIA Blackwell — neuer, höchste Speicherbandbreite</li>
<li>NVIDIA L40S — 48 GB, mandantenfähige Inference-Flotte</li>
<li>NVIDIA A100 — kosteneffizient, Gebrauchtmarkt</li>
<li>AMD MI300/MI325 — Alternative, wenn das Ökosystem passt</li>
</ul>
<h3 id="5-mandantenmodell">5. Mandantenmodell</h3>
<ul>
<li>Single-Tenant: Labor / einzelnes Team / PoC</li>
<li>Mandantenfähig über das Tenant CRD: Unternehmensplattform / kundenseitiges Angebot</li>
<li>Ein Cluster je Tenant: höchste Isolation, im Betrieb teuer</li>
</ul>
<h3 id="6-souveränitätskontrollen">6. Souveränitätskontrollen</h3>
<ul>
<li>Kundenkontrollierte Verschlüsselungsschlüssel (HSM)</li>
<li>Transparenz der Lieferkette bis zur zweiten Stufe</li>
<li>Vollständige Audit-Trails in Formaten, die die Aufsicht auswerten kann</li>
<li>Air-Gap-Option für die sensibelsten Workloads</li>
</ul>
<h3 id="7-betriebsmodell">7. Betriebsmodell</h3>
<ul>
<li>Betrieb durch den Kunden (Sie betreiben die Plattform)</li>
<li>Betrieb durch den Anbieter (Ænix oder ein vergleichbarer Anbieter betreibt sie)</li>
<li>Hybrid (Sie betreiben; der Anbieter übernimmt den Second-Level-Support)</li>
</ul>
<h2 id="wie-die-entscheidungen-ineinandergreifen">Wie die Entscheidungen ineinandergreifen</h2>
<p>Die sieben Entscheidungen sind nicht unabhängig voneinander. Das Auslöserprofil prägt den regulatorischen Rahmen; der regulatorische Rahmen prägt die Souveränitätskontrollen; die Souveränitätskontrollen prägen das Betriebsmodell; das Betriebsmodell beeinflusst, welche Modellauswahl überhaupt machbar ist.</p>
<h2 id="häufige-kombinationen">Häufige Kombinationen</h2>
<p><strong>Muster 1: Regulierte Finanzbranche + dauerhafte Inference + mandantenfähig</strong>
DORA + Kontrollen nach Artikel 28 + mandantenfähiges Tenant CRD + Volume-Verschlüsselung mit einer Passphrase, die Sie verwalten + von Ænix verwalteter Betrieb + Open-Weight-Modell (Klasse Llama 70B) auf einer H100/L40S-Flotte.</p>
<p><strong>Muster 2: Öffentlicher Sektor + Air-Gap + eingestufte Daten</strong>
Vorgabe einer souveränen Cloud + Air-Gap + Betrieb durch den Kunden + Open-Weight-Modell (Llama / Phi) auf Hardware des Kunden.</p>
<p><strong>Muster 3: AI-Startup + dauerhafte Inference rund um die Uhr + kundenseitiges Angebot</strong>
Keine spezifische Aufsicht + Kostenwirtschaftlichkeit als Auslöser + mandantenfähig + Betrieb durch den Kunden + Open-Weight-Modell + GPU-Mix passend zum Workload.</p>
<h2 id="so-nutzen-sie-den-entscheidungsleitfaden">So nutzen Sie den Entscheidungsleitfaden</h2>
<p>Beantworten Sie die Fragen oben der Reihe nach und notieren Sie Ihre Antworten; die Architekturoptionen grenzen sich dabei von selbst ein. Der <a href="https://aenix.io/de/ressourcen/sovereign-ai-architektur-leitfaden/">Sovereign-AI-Architektur-Leitfaden</a> geht dieselben Entscheidungen ausführlicher durch.</p>
<p>Zur konkreten Zusammenarbeit siehe <strong><a href="https://aenix.io/de/loesungen/sovereign-ai/">Sovereign AI</a></strong>.</p>
]]></content:encoded></item><item><title>Souveräne Cloud im öffentlichen Sektor — vom Vergaberahmen zur laufenden Plattform</title><link>https://aenix.io/de/blog/2026/05/oeffentlicher-sektor-souveraene-cloud-vergabe/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/oeffentlicher-sektor-souveraene-cloud-vergabe/</guid><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Public Sector</category><category>Sovereignty</category><category>Compliance</category><category>NIS2</category><category>Cozystack</category><description>Wie Vergabeverantwortliche und IT-Leitungen im öffentlichen Sektor Souveränitätsvorgaben in eine laufende Cloud-Plattform übersetzen — Regelwerke und Phasen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/oeffentlicher-sektor-souveraene-cloud-vergabe.jpg" alt=""></p><p>Die Diskussion um souveräne Clouds im öffentlichen Sektor ist 2026
zersplitterter als bei Finanzdienstleistern. Es gibt keine einzelne
Verordnung wie DORA, die für eine gemeinsame Richtung sorgt.
Stattdessen hat jede Jurisdiktion ihr eigenes Regelwerk, oft
aufgesetzt auf DSGVO, NIS2 und sektorale Zusatzanforderungen. Ein
multinationales Projekt im öffentlichen Sektor — oder schon ein
nationales, das mehrere Regionen umfasst — muss in der Regel drei
oder mehr Regelwerke gleichzeitig abdecken.</p>
<h2 id="die-landschaft-der-regelwerke">Die Landschaft der Regelwerke</h2>
<h3 id="eu-ebene">EU-Ebene</h3>
<ul>
<li><strong>EUCS (EU Cybersecurity Certification Scheme for Cloud Services)</strong> —
vorgeschlagenes EU-weites Schema (Annahme ausstehend). Drei
Vertrauensniveaus (Basic, Substantial, High). Das Niveau High
verlangt inhaltliche Souveränitätskontrollen.</li>
<li><strong>NIS2</strong> — die öffentliche Verwaltung ist ein Sektor nach Anhang I;
Einrichtungen der Zentralregierung sind wesentliche Einrichtungen
(Artikel 3). Pflichten aus Artikel 21 und Artikel 23.</li>
<li><strong>DSGVO</strong> — Grundlage für personenbezogene Daten, Regeln für
grenzüberschreitende Übermittlungen in den Artikeln 44-50.</li>
</ul>
<h3 id="ebene-der-mitgliedstaaten">Ebene der Mitgliedstaaten</h3>
<ul>
<li><strong>Frankreich: SecNumCloud</strong> — strenges französisches nationales
Regelwerk. Das anspruchsvollste Souveränitätsschema eines
EU-Mitgliedstaats. Referenzstandard für mehrere andere nationale
Initiativen.</li>
<li><strong>Deutschland: BSI C5</strong> — der deutsche Kriterienkatalog für
Cloud-Sicherheit. Inzwischen auch über Deutschland hinaus für den
Betrieb in der DACH-Region breit referenziert.</li>
<li><strong>Italien: ACN</strong> — Regelwerke der Nationalen Agentur für
Cybersicherheit; Infrastrukturregeln des Polo Strategico Nazionale.</li>
<li><strong>Spanien: ENS High</strong> — höchste Stufe des Esquema Nacional de
Seguridad.</li>
</ul>
<p>Andere Mitgliedstaaten haben eigene Varianten.</p>
<h3 id="zentralasien-und-apac">Zentralasien und APAC</h3>
<ul>
<li><strong>Kasachstan</strong> — per Vergaberecht vorgeschriebene Souveränität für
Workloads des öffentlichen Sektors über goszakup.gov.kz /
mitwork.kz / zakup.sk.kz.</li>
<li><strong>Singapur: IM8</strong> — IT-Sicherheitsstandards der Regierung.</li>
<li><strong>Indien: MeitY</strong> — Ministry of Electronics IT, einschließlich des
STQC-Rahmens für gelistete Cloud-Anbieter (Empanelled CSP).</li>
<li><strong>Australien: IRAP</strong> — Information Security Registered Assessors
Program; Stufen Protected / Secret für Workloads der Regierung.</li>
</ul>
<h3 id="sektorale-zusatzanforderungen">Sektorale Zusatzanforderungen</h3>
<ul>
<li>Eingestufte Workloads (in den meisten Jurisdiktionen):
zusätzliche nationale Geheimschutzeinstufung</li>
<li>Gesundheitswesen: nationale Regeln zur Souveränität von
Gesundheitsdaten</li>
<li>Kritische Infrastruktur: sektorale Cybersicherheitsanforderungen</li>
</ul>
<h2 id="was-inhaltlich-souverän-bedeutet">Was „inhaltlich souverän“ bedeutet</h2>
<p>Ein „souveränes“ Cloud-Produkt, das nicht alle folgenden Punkte
inhaltlich erfüllt, fällt in einem Audit auf dem höchsten
Vertrauensniveau der meisten Regelwerke durch:</p>
<h3 id="1-datenresidenz-auf-jeder-schicht">1. Datenresidenz auf jeder Schicht</h3>
<p>Nicht nur beim produktiven Storage. Backups, Observability,
CI/CD-Artefakte, Telemetrie der Managed Services,
grenzüberschreitende Replikation, Verarbeitung durch Unterauftragnehmer
— jede Schicht muss die Residenzanforderung einhalten.</p>
<h3 id="2-kundenkontrollierte-verschlüsselungsschlüssel">2. Kundenkontrollierte Verschlüsselungsschlüssel</h3>
<p>HSM-gestützt für sensible Datenklassen. Dokumentierte Rotation.
Verfahren für den Notfallzugriff. Personal des Anbieters kann Schlüssel
unter keinen Umständen auslesen oder kopieren. An genau dieser Stelle
scheitern „souveräne“ Angebote von Hyperscalern am häufigsten: Der
Anbieter behält operativen Zugriff auf die Schlüssel und verfehlt damit
die inhaltliche Bedingung.</p>
<h3 id="3-open-source-fundament-der-plattform">3. Open-Source-Fundament der Plattform</h3>
<p>Für Transparenz, Ausstiegsfähigkeit und Prüfbarkeit. Closed-Source-Plattformen,
die an die Roadmap eines einzelnen Herstellers gebunden sind, verfehlen
die inhaltlichen Anforderungen mehrerer Regelwerke (selbst wenn sie die
formalen Prüfungen der Vergaberichtlinien bestehen).</p>
<h3 id="4-transparenz-der-lieferkette">4. Transparenz der Lieferkette</h3>
<p>Die Lieferketten-Bestimmungen der Regelwerke (DORA Art. 28, NIS2
Art. 21 Abs. 2 lit. d, nationale Schemata) erwarten
eine Dokumentation der Lieferkette mindestens bis zur zweiten Stufe.
Die meisten souveränen Cloud-Konstrukte auf Hyperscaler-Basis enden bei
der ersten Stufe (dem Hyperscaler selbst).</p>
<h3 id="5-option-für-air-gap-deployments">5. Option für Air-Gap-Deployments</h3>
<p>Für die sensibelsten Workloads — eingestufte Daten, Gesundheitswesen mit strikter Residenz. Updates gelangen
über kontrollierte Kanäle in die Umgebung (Artefakt-Registry auf
Kundenseite, manuelle Freigabe). Die meisten Souveränitätsregelwerke
verlangen auf dem höchsten Niveau Air-Gap-Unterstützung als
architektonische Option, auch wenn sie nicht jeder Workload nutzt.</p>
<h3 id="6-vollständige-audit-trails-in-standardformaten">6. Vollständige Audit-Trails in Standardformaten</h3>
<p>Logs in Standardformaten (Syslog, CEF, OpenTelemetry), die das
Audit-Team des Kunden unabhängig vom Plattformhersteller auswerten
kann. Manipulationssicher. Aufbewahrung gemäß der längsten
anwendbaren regulatorischen Anforderung.</p>
<h3 id="7-keine-telemetrie-die-nach-hause-telefoniert">7. Keine Telemetrie, die nach Hause telefoniert</h3>
<p>Telemetrie, die den Perimeter des Kunden verlässt, muss Opt-in sein und
ausdrücklich dokumentiert werden. Viele von Hyperscalern verwaltete
Cloud-Produkte haben nicht abschaltbare Telemetriekanäle und verfehlen
dieses Kriterium.</p>
<h3 id="8-betriebliche-unabhängigkeit-unter-souveräner-jurisdiktion">8. Betriebliche Unabhängigkeit unter souveräner Jurisdiktion</h3>
<p>Zugriffe von Personal des Anbieters werden protokolliert und sind
zeitlich begrenzt. Die Supportgesellschaft unterliegt souveräner
Jurisdiktion (Ænix hat die AENIX s.r.o. in Tschechien für Verträge in
der EU und die AENIX INC in Delaware für Verträge in den USA). Kein
jurisdiktionsübergreifendes Support-Routing für souveränitätskritische
Workloads.</p>
<h2 id="was-eine-cozystack-basierte-architektur-über-alle-regelwerke-hinweg-liefert">Was eine Cozystack-basierte Architektur über alle Regelwerke hinweg liefert</h2>
<p>Das Architekturmuster, das alle wichtigen Regelwerke gleichzeitig
erfüllt:</p>
<ul>
<li><strong>Open-Source-Plattform</strong> — Cozystack unter Apache 2.0, CNCF-Projekt,
herstellerneutrales Fundament. Der Kunde kann die Plattform prüfen,
verändern oder den Plattformanbieter austauschen.</li>
<li><strong>Schlüssel beim Kunden</strong> — die Volume-Verschlüsselung ist pro
Storage-Klasse wählbar (Opt-in), die Schlüsselverwaltung entwerfen wir
mit Ihnen; Ænix hält niemals Schlüssel.</li>
<li><strong>Air-Gap-Unterstützung</strong> — dokumentierter Installationsablauf ohne
Internetverbindung für Anwendungsfälle mit eingestuften Daten.</li>
<li><strong>Selbst betriebene Observability</strong> — VictoriaMetrics und
VictoriaLogs innerhalb der Jurisdiktion; kein Residenzleck durch
SaaS-Observability.</li>
<li><strong>Kundenkontrollierte Identity</strong> — Integration mit Keycloak / Active
Directory / nationalem IdP; Ænix hält niemals produktive Zugangsdaten.</li>
<li><strong>Mandantenfähiges Tenant CRD</strong> — starke Isolation je Datenklasse,
Geschäftsbereich oder sektoraler Zusatzanforderung.</li>
<li><strong>Audit-isolierte Umgebungen</strong> — getrennte Cluster für Produktion,
Audit und forensische Kopie.</li>
<li><strong>Supportgesellschaft unter EU-Jurisdiktion</strong> — AENIX s.r.o.
(Tschechien).</li>
</ul>
<p>Das Architekturmuster ist dasselbe; die Zertifizierungsarbeit ist je
Regelwerk spezifisch. Bei Projekten auf SecNumCloud-Niveau beauftragt
der Kunde in der Regel einen zertifizierten Auditor; Ænix liefert
Architektur und Dokumentation, der Kunde führt den Auditzyklus durch.</p>
<h2 id="realitäten-der-vergabe">Realitäten der Vergabe</h2>
<p>Projekte im öffentlichen Sektor werden von Vergaberahmen bestimmt, wie
es in der Privatwirtschaft nicht der Fall ist. Einige praktische
Realitäten:</p>
<h3 id="angebot-auf-eine-ausschreibung">Angebot auf eine Ausschreibung</h3>
<p>Ausschreibungen im öffentlichen Sektor legen in der Regel fest, welche
Regelwerke erfüllt sein müssen (SecNumCloud High, BSI C5, EUCS
Substantial usw.). Das Angebot muss die inhaltliche Erfüllung belegen,
nicht nur die Absicht. Das Modell der Zusammenarbeit mit Ænix umfasst
Unterstützung bei der Angebotserstellung; Referenzen können unter NDA
geteilt werden, soweit der Kunde zustimmt.</p>
<h3 id="mehrjährige-rahmenverträge">Mehrjährige Rahmenverträge</h3>
<p>Viele Projekte im öffentlichen Sektor laufen über Rahmenverträge mit
spezifischen Compliance- und Ausstiegsklauseln. Vertragspartner ist
die jeweilige Gesellschaft von Ænix (AENIX s.r.o. in Tschechien für die
EU; AENIX INC in Delaware für die USA); die Struktur der Zusammenarbeit
passt sich den Anforderungen des Rahmenvertrags an.</p>
<h3 id="ænix-ist-kein-hyperscaler--genau-darum-geht-es">Ænix ist kein Hyperscaler — genau darum geht es</h3>
<p>Mehrere Vorgaben im öffentlichen Sektor verlangen ausdrücklich eine
souveräne Bereitstellung ohne Hyperscaler. Das Open-Core-Modell von
Ænix — Hardware des Kunden, Schlüssel beim Kunden, wo Verschlüsselung aktiviert ist, betriebliche
Kontrolle beim Kunden, optionaler Support durch Ænix — erfüllt diese
Vorgaben strukturell statt über vertragliche Hilfskonstruktionen.</p>
<h2 id="projektphasen-im-öffentlichen-sektor">Projektphasen im öffentlichen Sektor</h2>
<h3 id="phase-0--klärung-der-regelwerke">Phase 0 — Klärung der Regelwerke</h3>
<p>Die anwendbaren Regelwerke bestätigen. Das mit der höchsten Messlatte
identifizieren (meist SecNumCloud High in Frankreich, BSI C5 in
Deutschland, EUCS High, wo EU-weite Anforderungen gelten, nationale
Vergaberegeln andernorts). Die Architektur gegen die
höchste Messlatte entwerfen und auf die übrigen abbilden.</p>
<h3 id="phase-1--architektur-und-angebotserstellung">Phase 1 — Architektur und Angebotserstellung</h3>
<p>Die Unterlagen für das Vergabeverfahren erstellen: technisches
Angebot, Abbildung auf die Compliance-Anforderungen der Regelwerke,
Referenzarchitektur, beispielhafter Nachweiskatalog. Typische Dauer:
2-4 Monate.</p>
<h3 id="phase-2--aufbau-der-plattform-in-phase-1-nach-den-modellen-public-cloud-platform--private-cloud-platform">Phase 2 — Aufbau der Plattform in Phase 1 (nach den Modellen Public Cloud Platform / Private Cloud Platform)</h3>
<p>Deployment über mehrere Rechenzentren, Air-Gap-Option bei Bedarf
aktiviert, Integration einer souveränen Identity, audit-isolierte
Umgebungen. Ein nationales Programm mit mehreren Regionen läuft mit
3–6 Monaten Pilot und danach 9–18 Monaten bis zum vollen
Multi-Region-Betrieb; eine Private Cloud für eine einzelne Behörde ist
ein Aufbau von 3–12 Monaten nach einem Assessment von 14 oder 28 Tagen.</p>
<h3 id="phase-3--zertifizierungszyklus">Phase 3 — Zertifizierungszyklus</h3>
<p>Der Kunde beauftragt einen akkreditierten Auditor; Ænix liefert
Architekturdokumentation, Control Mapping und Nachweiskatalog.
Engineers von Ænix nehmen, soweit zulässig, an den technischen
Gesprächen mit dem Auditor teil. Typischer Zertifizierungszyklus:
6-12 Monate parallel zu Phase 2.</p>
<h3 id="phase-4--produktionsbetrieb">Phase 4 — Produktionsbetrieb</h3>
<p>Das Team des Kunden betreibt die Plattform mit Beratung durch Ænix und
einer Plus- oder Enterprise-Support-Stufe (siehe <a href="https://aenix.io/de/preise/">Preise</a>).
Jährlicher Rezertifizierungszyklus (bei den meisten
Regelwerken).</p>
<p>Die zertifizierte Produktion kommt wegen des Zertifizierungszyklus später
als in der Privatwirtschaft — doch der Wert der Zertifizierung wächst mit: Ist
die Plattform einmal zertifiziert, behält sie die Zertifizierung durch
die jährliche Rezertifizierung, statt sie für jedes Projekt neu zu
erwerben.</p>
<h2 id="die-bestehende-position-von-ænix-im-öffentlichen-sektor">Die bestehende Position von Ænix im öffentlichen Sektor</h2>
<p>Ænix schließt Verträge über die AENIX s.r.o. (EU) und die AENIX INC (USA)
und arbeitet innerhalb der Vergaberahmen des öffentlichen Sektors.
Konkrete Projekte sind vertraulich; Referenzen nennen wir unter NDA im
Discovery Call.</p>
<h2 id="wann-dieses-modell-der-zusammenarbeit-passt">Wann dieses Modell der Zusammenarbeit passt</h2>
<p>Gute Passung:</p>
<ul>
<li>Nationale Initiativen für souveräne Clouds (öffentlich, als
öffentlich-private Partnerschaft, Betreiber einer souveränen Cloud)</li>
<li>Regionale oder sektorale Cloud-Programme von EU-Mitgliedstaaten</li>
<li>Hosting eingestufter Daten mit
Air-Gap-Anforderung</li>
<li>Souveräne Cloud im Gesundheitswesen auf nationaler oder regionaler
Ebene</li>
<li>Bildungs- und Forschungskonsortien mit einem Planungshorizont über
mehrere Jahrzehnte</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Vergaben einzelner Ministerien oder Behörden mit kleinerem Umfang —
hier passt womöglich eher die Private Cloud Platform als die Public
Cloud Platform</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Workloads, bei denen eine von Hyperscalern verwaltete Cloud die
Regelwerke bereits erfüllt (bei einigen spezifischen Vergaberahmen)</li>
<li>Organisationen ohne Souveränitätsdruck (nutzen Sie das Produkt für
die Privatwirtschaft, das zum Workload-Profil passt)</li>
</ul>
<h2 id="wo-sie-tiefer-einsteigen-können">Wo Sie tiefer einsteigen können</h2>
<ul>
<li><strong><a href="https://aenix.io/de/branchen/oeffentlicher-sektor/">Branchenseite Öffentlicher Sektor</a></strong> —
die kommerzielle Landingpage</li>
<li><strong><a href="https://aenix.io/de/loesungen/data-sovereignty/">Data Sovereignty</a></strong> —
Landingpage zum Kaufanlass Souveränität</li>
<li><strong><a href="https://aenix.io/de/loesungen/nis2-compliance/">NIS2-Compliance</a></strong> —
für die NIS2-Anforderungen (die öffentliche Verwaltung fällt unter
Anhang I)</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/sovereign-cloud-builder/">Sovereign Cloud Builder</a></strong> —
die passende Form der Zusammenarbeit</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/souveraene-cloud-aufbauen-eu-zentralasien/">Souveräne Cloud aufbauen — Playbook für die EU und Zentralasien</a></strong> —
Playbook für souveräne Clouds in der EU und in Zentralasien</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/datenresidenz-anforderungen-2026/">Datenresidenz-Anforderungen 2026</a></strong> —
Datenresidenz Schicht für Schicht</li>
</ul>
]]></content:encoded></item><item><title>Public Cloud Platform im Betreibermaßstab — was der Start einer nationalen souveränen Cloud erfordert</title><link>https://aenix.io/de/blog/2026/05/public-cloud-platform-souveraenes-cloud-produkt/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/public-cloud-platform-souveraenes-cloud-produkt/</guid><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cozystack</category><category>Multi-tenancy</category><category>Sovereignty</category><category>Cloud</category><category>Platform Engineering</category><description>Was ein souveräner Cloud-Aufbau im Betreibermaßstab auf der Ænix Public Cloud Platform für Telcos, Banken und nationale Betreiber umfasst: Phasen, Zeitplan.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/public-cloud-platform-souveraenes-cloud-produkt.jpg" alt=""></p><p>Die meisten Hosting-Anbieter betreiben die Ænix Public Cloud Platform im
Providermaßstab: Der produktisierte Installer bringt die Plattform wenige
Wochen nach Bereitstellung der Hardware live, die Preise folgen den
veröffentlichten Support-Stufen. In diesem Beitrag geht es um das andere
Ende — das Programm im Betreibermaßstab. Dort lautet die Frage nicht
„Sollen wir Cozystack einsetzen?“ — das ist bereits entschieden. Sie
lautet: „Wir bringen ein Cloud-Produkt im nationalen Maßstab oder für
Tier-1-Kunden auf den Markt; wie sieht die Partnerschaft mit Ænix über
3–6 Monate Pilot und die 9–18 Monate bis zum vollen Multi-Region-Betrieb
aus?“</p>
<h2 id="wer-die-public-cloud-platform-im-betreibermaßstab-einsetzt">Wer die Public Cloud Platform im Betreibermaßstab einsetzt</h2>
<p>Fünf Käuferprofile prägen die Projekte im Betreibermaßstab:</p>
<ol>
<li><strong>Tier-1-Telcos / nationale Betreiber</strong> — etablierte
Telekommunikationsanbieter, die eine Public Cloud als Teil ihres
Produktportfolios starten oder ausbauen. Häufig verbunden mit einer
Souveränitätspositionierung („unsere souveräne Cloud“, „nationale
Cloud“).</li>
<li><strong>Große Banken mit eigener Cloud</strong> — die Bank nutzt ihr eigenes
Cloud-Produkt für interne Workloads und verkauft mitunter auch
Kapazität an ihren Kundenstamm.</li>
<li><strong>Initiativen für souveräne Clouds</strong> — staatlich beauftragte
Cloud-Produkte, teils als öffentlich-private Partnerschaft
aufgesetzt, mit ausdrücklichen Souveränitätsanforderungen und
Abstimmung mit der Aufsicht.</li>
<li><strong>Hosting-Anbieter im großen Maßstab</strong> — Anbieter mit mehr als rund
5.000 Kunden, bei denen das Betriebsmodell der Public Cloud Platform
auf mehrere Regionen mit Active/Active über mehrere Rechenzentren
skaliert werden muss.</li>
<li><strong>Nationale AI/GPU-Betreiber</strong> — dauerhafte Inference- und
Trainingskapazität für Kunden aus bestimmten Sektoren (Banken,
Gesundheitswesen, öffentlicher Sektor), in denen
AI-Souveränität eine Anforderung auf nationaler Ebene ist.</li>
</ol>
<p>Alle fünf teilen dieselbe betriebliche Realität: Active/Active über
mehrere Regionen oder Rechenzentren; Infrastrukturinvestitionen im
Millionen-Euro-Bereich; kundenseitige SLAs, die sich an den
Erwartungen der nationalen Aufsicht orientieren; und eine Partnerschaft
mit Ænix, die Jahre dauert, nicht Monate.</p>
<h2 id="was-ein-aufbau-im-betreibermaßstab-zusätzlich-umfasst">Was ein Aufbau im Betreibermaßstab zusätzlich umfasst</h2>
<h3 id="activeactive-über-mehrere-regionen-und-rechenzentren">Active/Active über mehrere Regionen und Rechenzentren</h3>
<p>Deployments in einem einzigen Rechenzentrum bedient die Public Cloud
Platform im Providermaßstab (oder die Private Cloud Platform für den
internen Einsatz). Ein Aufbau im Betreibermaßstab geht vom ersten Tag an davon aus, dass der Kunde
Active/Active über Regionen oder Rechenzentren hinweg braucht, mit
einer rechenzentrumsübergreifenden Replikation, die auf die RTO/RPO-Ziele
abgestimmt ist. Control Plane, Observability, Identity und
Storage-Schicht der Plattform sind von Grund auf für mehrere Regionen
ausgelegt, statt nachträglich umgerüstet zu werden.</p>
<h3 id="tiefe-des-servicekatalogs">Tiefe des Servicekatalogs</h3>
<p>Ein Aufbau im Providermaßstab stellt rund 20 Managed Services bereit.
Ein Aufbau im Betreibermaßstab zielt typischerweise auf 30-50+ Services
aus Compute, Storage, Networking, Managed Databases, Observability,
AI/GPU, Message Queues, Suche, Content Delivery und Security-Tooling.
Die Paketarchitektur von Cozystack (die Ressourcen Package,
PackageSource und ApplicationDefinition, Stand v1.x) trägt diesen
Ausbau des Katalogs.</p>
<h3 id="betriebsteam-im-großen-maßstab">Betriebsteam im großen Maßstab</h3>
<p>10-30+ Engineers betreiben die Plattform, je nach Kundenzahl und SLA.
Zur Zusammenarbeit im Betreibermaßstab gehören Rekrutierung und
Schulung des Betriebsteams als eigener, umfangreicher Arbeitsstrang —
nicht nach dem Muster „Sie finden die Leute, wir schulen sie“, sondern:
„Wir entwerfen die Organisationsstruktur gemeinsam mit Ihnen, sitzen
in den Interviews mit, schulen praktisch und leisten in den ersten
12-18 Monaten Eskalations-Support (Plus- oder Enterprise-Stufe), während
Ihr Team Sicherheit gewinnt.“</p>
<h3 id="abstimmung-mit-aufsicht-und-souveränitätsvorgaben">Abstimmung mit Aufsicht und Souveränitätsvorgaben</h3>
<p>Welches Souveränitätsregelwerk im Markt des Kunden auch gilt —
SecNumCloud, BSI C5, EUCS, sektorale Zusatzanforderungen, nationale
Vergabevorgaben —, die Architektur wird so entworfen, dass sie es
inhaltlich erfüllt und nicht nur vertraglich. Ein Katalog der
Compliance-Nachweise ist Teil der Lieferung.</p>
<h3 id="brand-engineering-für-die-kundenseite">Brand Engineering für die Kundenseite</h3>
<p>Über die Anpassung des Cozystack Dashboards hinaus umfasst eine
Zusammenarbeit im Betreibermaßstab echte Markenarbeit: ein Kundenportal, das wie ein
erstklassiges Cloud-Produkt wirkt und nicht wie eine angepasste
Cozystack-Instanz. UX-Abläufe, die darauf abgestimmt sind, wie die
Kunden des Kunden über Bestellen, Konfigurieren und Bezahlen denken.
Von Designern geführt, nicht vom Engineering.</p>
<h2 id="wie-eine-zusammenarbeit-im-betreibermaßstab-in-phasen-verläuft">Wie eine Zusammenarbeit im Betreibermaßstab in Phasen verläuft</h2>
<p>Die Phasen 0 und 1 bilden den Pilot und dauern zusammen 3–6 Monate. Die
Phasen 2–4 dauern 9–18 Monate bis zum vollen Multi-Region-Betrieb und
überlappen, soweit die Teams es erlauben.</p>
<h3 id="phase-0--discovery-und-aufbau-der-partnerschaft-beginn-des-pilots">Phase 0 — Discovery und Aufbau der Partnerschaft (Beginn des Pilots)</h3>
<p>Vor dem Engineering steht die Einigung über:</p>
<ul>
<li>Strategische Ziele (welches Cloud-Produkt, welcher Kundenstamm,
welche Wettbewerbspositionierung)</li>
<li>Regulatorischen Rahmen (welche Regelwerke die Plattform binden)</li>
<li>Organisationsstruktur (wer verantwortet was; wie die Teams von Ænix
und Kunde zusammenarbeiten)</li>
<li>Kommerzielle Struktur (Modell der Zusammenarbeit, IP, Supportmodell
nach dem Go-live)</li>
<li>Roadmap (Reihenfolge der Services, geografische Expansion, SLA-Stufen)</li>
</ul>
<p>Ergebnis: ein unterzeichneter Plan für die Zusammenarbeit mit
benannten Verantwortlichen für jeden Arbeitsstrang auf beiden Seiten.</p>
<h3 id="phase-1--fundament-restlicher-pilot">Phase 1 — Fundament (restlicher Pilot)</h3>
<p>Beschaffung und Einbau der Hardware. Deployment der Talos/Cozystack-Plattform
im ersten Rechenzentrum. Storage-Schicht (LINSTOR/DRBD im großen
Maßstab). Netzwerkfundament. Integration mit der bestehenden
Mitarbeiter-Identity des Kunden (Keycloak / Okta / Active Directory /
souveräner IdP). Erster Observability-Stack.</p>
<p>Endzustand: funktionierende Plattform, eine Region, nur interner
Zugriff. Noch nicht bereit für Kunden.</p>
<h3 id="phase-2--fundament-für-mehrere-regionen">Phase 2 — Fundament für mehrere Regionen</h3>
<p>Das zweite Rechenzentrum wird aufgebaut. Die rechenzentrumsübergreifende
Replikation wird validiert. Föderierte Identity. Storage-Replikation
über Regionen hinweg (LINSTOR asynchron oder Ceph regionsübergreifend).
Disaster-Recovery-Muster werden getestet. Das Fundament der
Compliance-Dokumentation entsteht.</p>
<p>Endzustand: Plattform über mehrere Rechenzentren, interner Zugriff,
RTO/RPO gegen die Zielwerte validiert.</p>
<h3 id="phase-3--ausbau-des-servicekatalogs">Phase 3 — Ausbau des Servicekatalogs</h3>
<p>Rollout Service für Service. Zuerst die grundlegenden Services
(Compute, Storage, Basis-Networking, Managed PostgreSQL). Danach
kommen die Familien der Managed Services hinzu (Datenbanken, Queues,
Caches, Suche, Observability). Schließlich produktspezifische Services
(GPU, AI-Inference, sektorspezifisches Compliance-Tooling).</p>
<p>Jeder Service durchläuft: Deployment → interne Tests → Pilot mit
befreundeten Kunden → Produktions-GA. Rollout in Kohorten, kein Big Bang.</p>
<h3 id="phase-4--kunden-onboarding-und-eingeschränkte-ga">Phase 4 — Kunden-Onboarding und eingeschränkte GA</h3>
<p>Das Kundenportal geht live (mit Brand Engineering). Die
Billing-Integration ist durchgängig validiert. Support-Runbooks sind
dokumentiert. Die ersten 10-50 befreundeten Kunden sind an Bord. Das
SLA-Monitoring läuft im Regelbetrieb.</p>
<p>Endzustand: Das Cloud-Produkt ist mit der ersten Kundenkohorte live,
Billing- und Support-Abläufe haben sich bewährt.</p>
<h3 id="phase-5--general-availability-und-skalierung-fortlaufend">Phase 5 — General Availability und Skalierung (fortlaufend)</h3>
<p>Start am offenen Markt. Marketing und Vertrieb legen los. Das
Betriebsteam wächst mit den Kunden. Der Eskalations-Support von Ænix
(Plus- oder Enterprise-Stufe) läuft weiter, bis das Team des Kunden ihn
selbst übernehmen kann (typischerweise 12-24 Monate nach GA).</p>
<p>Alle weiteren Phasen folgen der Roadmap: neue Services, neue Regionen,
neue sektorspezifische SKUs.</p>
<h2 id="woran-cloud-projekte-im-millionen-euro-bereich-scheitern">Woran Cloud-Projekte im Millionen-Euro-Bereich scheitern</h2>
<p>Drei Fehlermuster, die wir in der Branche beobachtet haben:</p>
<h3 id="1-zu-wenig-investition-in-brand-engineering">1. Zu wenig Investition in Brand Engineering</h3>
<p>Eine vom Engineering getriebene Plattform mit einer UX auf
Engineering-Niveau. Kunden klicken sich durch, finden sie funktional,
aber wenig ansprechend, und melden sich stattdessen beim Hyperscaler
an. Eine Zusammenarbeit im Betreibermaßstab enthält ausdrücklich eine
Designpartnerschaft, um genau das zu vermeiden.</p>
<h3 id="2-betriebsteam-für-den-go-live-dimensioniert-nicht-für-das-volumen-in-18-monaten">2. Betriebsteam für den Go-live dimensioniert, nicht für das Volumen in 18 Monaten</h3>
<p>Cloud-Produkte wachsen im ersten Jahr nach GA exponentiell, wenn die
Positionierung stimmt. Betriebsteams, die auf die Kundenzahl zum
Go-live ausgelegt sind, werden in Monat 6-12 überrollt. Planen Sie die
Betriebskapazität für das Volumen in 18 Monaten und stellen Sie
vorausschauend ein.</p>
<h3 id="3-dialog-mit-der-aufsicht-aufgeschoben">3. Dialog mit der Aufsicht aufgeschoben</h3>
<p>Eine Souveränitätspositionierung hängt von der Zustimmung der Aufsicht
ab (ausdrücklich oder stillschweigend). Projekte, die das Gespräch mit
der Aufsicht bis in eine späte Phase verschieben, bauen schließlich
ihre Architektur um, um Erwartungen zu erfüllen, die sie von Anfang an
hätten einplanen können. Binden Sie die Aufsicht in Phase 0-1 ein,
nicht in Phase 4.</p>
<h2 id="wann-ein-programm-im-betreibermaßstab-die-richtige-antwort-ist">Wann ein Programm im Betreibermaßstab die richtige Antwort ist</h2>
<p>Gute Passung:</p>
<ul>
<li>Tier-1-Telco / nationaler Betreiber / große Bank / Initiative für
eine souveräne Cloud</li>
<li>Betriebliche Realität mit mehreren Regionen oder Rechenzentren</li>
<li>5.000+ angestrebte Kunden oder ein strategischer Kundenstamm</li>
<li>Budgetrahmen im Millionen-Euro-Bereich über ein mehrjähriges Programm</li>
<li>Souveränität und Positionierung gegenüber der Aufsicht sind Kern des
Nutzenversprechens</li>
<li>Sponsoring auf oberster Führungsebene (mindestens CIO oder CTO)</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Große Hosting-Anbieter unterhalb des Maßstabs eines Tier-1-Telcos —
je nach Wachstumsprofil passt die Public Cloud Platform im
Providermaßstab, Region für Region erweitert, oft besser als ein
vollständiges Betreiberprogramm</li>
<li>Auf AI/GPU fokussierte Betreiber, bei denen der AI-Workload dominiert
— hier passt die Ænix AI Platform womöglich besser, ergänzt um
ausgewählte Komponenten der Public Cloud Platform</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Kleinere Hosting-Anbieter — die Public Cloud Platform im
Providermaßstab (zu den <a href="https://aenix.io/de/preise/">veröffentlichten Preisen</a>) passt
bei Wirtschaftlichkeit und Betriebsmodell deutlich besser</li>
<li>Regulierte Unternehmen, die Cloud konsumieren statt sie anzubieten —
hier ist die Private Cloud Platform die richtige Antwort</li>
</ul>
<h2 id="struktur-der-zusammenarbeit">Struktur der Zusammenarbeit</h2>
<ul>
<li><strong>Discovery Call</strong> (Führungsebene, 60-90 Min.) — Einschätzung der
strategischen Passung</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>
(Festpreis, 28 Tage vollständig) — Grundlage für den Aufbau der
Partnerschaft; Ergebnis ist ein unterzeichneter Plan</li>
<li><strong>Pilot</strong> (Phasen 0–1, 3–6 Monate), danach <strong>Phasen 2–4</strong> (9–18 Monate
bis zum vollen Multi-Region-Betrieb)</li>
<li><strong>Support-Subskription</strong> (fortlaufend) — Plus- oder Enterprise-Stufe
(siehe <a href="https://aenix.io/de/preise/">Preise</a>), bis das Team des Kunden die Eskalation
übernehmen kann</li>
</ul>
<p>Umfang der Zusammenarbeit: mehrjähriges Programm, kalkuliert je
Ausschreibung.</p>
<h2 id="wo-sie-tiefer-einsteigen-können">Wo Sie tiefer einsteigen können</h2>
<ul>
<li><strong><a href="https://aenix.io/de/produkte/public-cloud-platform/">Public Cloud Platform</a></strong> —
Funktionsübersicht, produktspezifische FAQ</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/public-cloud-builder/">Public Cloud Builder</a></strong> —
Details zur Zusammenarbeit</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/sovereign-cloud-builder/">Sovereign Cloud Builder</a></strong> —
für die Variante mit Schwerpunkt Souveränität</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/souveraene-cloud-aufbauen-eu-zentralasien/">Souveräne Cloud aufbauen — Playbook für die EU und Zentralasien</a></strong> —
Architekturmuster für souveräne Clouds</li>
</ul>
]]></content:encoded></item><item><title>Von Proxmox zu Cozystack — wenn Single-Tenant an seine Grenzen stößt</title><link>https://aenix.io/de/blog/2026/05/proxmox-migration-cozystack-single-tenant-grenzen/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/proxmox-migration-cozystack-single-tenant-grenzen/</guid><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Proxmox</category><category>Cozystack</category><category>Migration</category><category>Multi-tenancy</category><category>Hosting</category><description>Wann wächst Proxmox VE über Single-Tenant hinaus? Leitfaden zur Migration von Proxmox zu Cozystack für MSPs und Teams an Grenzen bei Mandanten und Skalierung.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/proxmox-migration-cozystack-single-tenant-grenzen.jpg" alt=""></p><p>Proxmox VE ist eine der erfolgreichsten Open-Source-Virtualisierungsplattformen
des letzten Jahrzehnts: ausgereift, einfach zu installieren, mit starker
Community, unter AGPLv3 und mit kommerzieller Subscription. Wir sprechen mit
vielen Betreibern, die mit Proxmox angefangen haben, gewachsen sind und nun
prüfen, was als Nächstes kommt.</p>
<p>Entscheidend ist: Für viele von ihnen ist Proxmox die richtige Antwort. Dieser
Artikel zeigt, wann eine Migration gerechtfertigt ist und wann sie verfrüht wäre.</p>
<h2 id="wo-proxmox-weiterhin-gewinnt">Wo Proxmox weiterhin gewinnt</h2>
<p>Proxmox VE bleibt die richtige Antwort für:</p>
<ul>
<li><strong>IT-Abteilungen im Mittelstand</strong> — kleine und mittlere Unternehmen mit
10–50 virtualisierten Workloads im eigenen Haus, ohne Bedarf an
kundenseitiger Mandantenfähigkeit</li>
<li><strong>Single-Tenant-Labs und Entwicklungsumgebungen</strong> — die betriebliche
Einfachheit von Proxmox schlägt jede schwergewichtigere Alternative</li>
<li><strong>Etablierte Betreiber mit stabilem Kundenstamm unter rund 200 Kunden</strong> —
die kommerzielle Rechnung von Proxmox geht weiterhin auf; die
Migrationskosten würden den Nutzen übersteigen</li>
<li><strong>Überwiegend VM-basierte Workloads</strong> — der Funktionsumfang von Proxmox
mit KVM und LXC passt sauber</li>
<li><strong>Bestehende Betreiber mit tiefer Proxmox-Expertise und stabilem Team</strong> —
zu den Wechselkosten gehört auch die Umschulung des Teams</li>
</ul>
<p>Wenn Ihre Situation darauf zutrifft: <em>Migrieren Sie nicht.</em> Die Ænix Public
Cloud Platform ist für den Single-Tenant-Betrieb im Mittelstand
überdimensioniert. Das sagen wir bereits im Discovery Call, statt das
Engagement zu forcieren.</p>
<h2 id="woran-man-erkennt-dass-proxmox-zu-klein-wird">Woran man erkennt, dass Proxmox zu klein wird</h2>
<p>Eine Migration verdient eine ernsthafte Prüfung, wenn mindestens drei der
folgenden Punkte zutreffen:</p>
<h3 id="1-die-kundenzahl-wächst-über-rund-300">1. Die Kundenzahl wächst über rund 300</h3>
<p>Das Mandantenmodell von Proxmox (Pools, Realms und Berechtigungen, keine harte
Isolation) wirkt ab etwa 300 kundenseitigen Tenants zu dünn. Audit-Trails
pro Kunde, Isolationsgarantien und die Durchsetzung von Quotas werden zur
betrieblichen Belastung.</p>
<h3 id="2-kunden-fragen-nach-diensten-jenseits-von-vms">2. Kunden fragen nach Diensten jenseits von VMs</h3>
<p>Managed PostgreSQL, MariaDB, MongoDB, Redis, Valkey, Kafka, S3-kompatibler
Object Storage, Tenant-Kubernetes-Cluster, GPU-Dienste. Proxmox deckt VMs und
LXC ab; alles andere wird über manuelle Integration oder externe Systeme
angeflanscht.</p>
<h3 id="3-whmcs-oder-eine-vergleichbare-kundenverwaltung">3. WHMCS oder eine vergleichbare Kundenverwaltung</h3>
<p>Proxmox hat eine WHMCS-Integration, doch der Servicekatalog jenseits von VMs
bedeutet manuelle Integrationsarbeit. Die Ænix Public Cloud Platform ergänzt
eine WHMCS-Integration (ein proprietäres Ænix-Modul, nicht Teil des
Open-Source-Projekts Cozystack), die den gesamten Servicekatalog abdeckt.</p>
<h3 id="4-activeactive-über-mehrere-rechenzentren">4. Active/Active über mehrere Rechenzentren</h3>
<p>Proxmox-Clustering ist auf ein Rechenzentrum beschränkt. Geografische
Verteilung erfordert manuelle Replikationsmuster zwischen Clustern. Cozystack
behandelt Active/Active über mehrere Rechenzentren als vollwertigen
Deployment-Modus.</p>
<h3 id="5-nachfrage-nach-containernativen-diensten">5. Nachfrage nach containernativen Diensten</h3>
<p>Kunden wollen Tenant-Kubernetes-Cluster oder containernative Servicekataloge.
Proxmox kann Container über LXC betreiben, ist aber nicht das richtige
Betriebsmodell für kundenseitiges Kubernetes-as-a-Service.</p>
<h3 id="6-wiederkehrender-lizenz--und-subscription-druck-bei-kommerziellem-proxmox">6. Wiederkehrender Lizenz- und Subscription-Druck bei kommerziellem Proxmox</h3>
<p>Die kommerzielle Subscription von Proxmox ist wettbewerbsfähig, aber ein
realer Kostenfaktor. Betreiber mit wachsendem Infrastruktur-Footprint stellen
mitunter fest, dass sich die gesamten Subscription-Kosten dem nähern, was Ænix
für den Support der Public Cloud Platform berechnet — und an diesem Punkt
geben Servicekatalog und betriebliche Vorteile von Cozystack den Ausschlag.</p>
<h2 id="architekturabbildung-proxmox--cozystack">Architekturabbildung: Proxmox → Cozystack</h2>
<table>
  <thead>
      <tr>
          <th>Proxmox VE</th>
          <th>Entsprechung in Cozystack</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>KVM-Hypervisor</strong></td>
          <td>KubeVirt (KVM-basiert)</td>
      </tr>
      <tr>
          <td><strong>LXC-Container</strong></td>
          <td>Native Kubernetes-Container (anderes Modell — LXC im System-Stil vs. Kubernetes im Anwendungsstil)</td>
      </tr>
      <tr>
          <td><strong>ZFS-Storage</strong></td>
          <td>LINSTOR (DRBD)</td>
      </tr>
      <tr>
          <td><strong>Ceph (von Proxmox verwaltet)</strong></td>
          <td>LINSTOR (DRBD); Cozystack liefert kein Ceph aus</td>
      </tr>
      <tr>
          <td><strong>Linux SDN / Bridges</strong></td>
          <td>Cilium (eBPF)</td>
      </tr>
      <tr>
          <td><strong>Proxmox-Web-UI</strong></td>
          <td>Cozystack Dashboard</td>
      </tr>
      <tr>
          <td><strong>Proxmox Backup Server (PBS)</strong></td>
          <td>Velero + S3-kompatibles Ziel + PITR pro Anwendung</td>
      </tr>
      <tr>
          <td><strong>PVE-Storage-Replikation</strong></td>
          <td>LINSTOR-DRBD-Replikation</td>
      </tr>
      <tr>
          <td><strong>Proxmox API / pvesh, qm, pct</strong></td>
          <td>Kubernetes API</td>
      </tr>
      <tr>
          <td><strong>Datacenter / Pool / VM</strong></td>
          <td>Tenant CRD + Namespace + KubeVirt-VM</td>
      </tr>
      <tr>
          <td><strong>Berechtigungsmodell (Rollen)</strong></td>
          <td>Kubernetes RBAC + Geltungsbereich des Tenant CRD</td>
      </tr>
  </tbody>
</table>
<p>Zwei Bereiche erfordern ein Redesign statt einer 1:1-Abbildung:</p>
<ul>
<li><strong>LXC vs. Kubernetes-Container</strong> — Proxmox-LXC ist ein System-Container
(vollständiges OS-Image), ein Kubernetes-Container ist ein
Anwendungscontainer (ein einzelner Prozess oder wenige). Workloads, die LXC
im Sinne von System-Containern nutzen, wandern entweder in KubeVirt-VMs oder
werden umgebaut.</li>
<li><strong>Mandantenmodell</strong> — das Tenant-Modell von Proxmox (Pools, Realms
und Berechtigungen) gegenüber dem Tenant CRD von Cozystack (Kubernetes-nativ).
Die kundenseitige Isolation ist in Cozystack stärker; die betriebliche
Abstraktion ist eine andere.</li>
</ul>
<h2 id="migrationsphasen">Migrationsphasen</h2>
<h3 id="phase-0--assessment-14-oder-28-tage">Phase 0 — Assessment (14 oder 28 Tage)</h3>
<p>Bestandsaufnahme: Kundenzahl, genutzte kundenseitige Dienste, Anzahl der VMs,
Betriebssystem-Mix, LXC-Nutzung, Storage-Klassen, Netzwerktopologie,
Backup-Muster, Integration von WHMCS bzw. der Kundenverwaltung.</p>
<p>Ehrlicher TCO-Vergleich: das heutige Proxmox mit kommerzieller Subscription
und Betriebsteam gegenüber der Ænix Public Cloud Platform mit
Hardwareerneuerung und Ænix-Support-Stufe. Bei Betreibern unter rund 300
Kunden bleibt Proxmox dabei oft wettbewerbsfähig; oberhalb von etwa 500 gewinnt
Cozystack in der Regel durch Servicekatalog und betriebliche Tiefe.</p>
<p>Ergebnis: eine Go/No-Go-Entscheidung mit quantifizierter Begründung.</p>
<h3 id="phase-1--cozystack-fundament-wenige-wochen">Phase 1 — Cozystack-Fundament (wenige Wochen)</h3>
<p>Mit dem produktisierten Installer ist die Plattform wenige Wochen nach
Bereitstellung der Hardware live; Katalog- und Markenarbeit füllen den Rest
der Phase. Die Cozystack-Plattform wird auf neuer Hardware oder auf umgewidmeter
Proxmox-Hardware bereitgestellt (handelsübliche x86-Server lassen sich leicht
umziehen). Das Cilium-Networking wird konfiguriert, LINSTOR-Storage in den
Betrieb überführt, die Identitätsintegration eingerichtet (typischerweise
Keycloak plus IdP des Kunden). Das Cozystack Dashboard wird an die bestehende
Marke des Betreibers angepasst.</p>
<p>Die WHMCS-Integration wird Ende-zu-Ende validiert. Der Servicekatalog wird
mit den vom Betreiber gewählten Diensten befüllt (zuerst VMs, danach Managed
Databases, dann S3, und von dort aus weiter).</p>
<h3 id="phase-2--migration-der-pilotkunden">Phase 2 — Migration der Pilotkunden</h3>
<p>5–20 wohlgesonnene Kunden werden als erste Kohorte zu Cozystack migriert.
Ablauf pro Kunde:</p>
<ol>
<li>Kunden-VMs werden vom Proxmox-Format qcow2 in ein KubeVirt-kompatibles
Format konvertiert</li>
<li>Die Netzwerkkonfiguration wird übertragen (Proxmox-Bridges → Cilium
ClusterPool + NetworkPolicies)</li>
<li>Der Storage wird migriert (ZFS- / Ceph-Volumes → LINSTOR in
Cozystack)</li>
<li>Validierungsfenster auf Kundenseite (7–14 Tage)</li>
<li>Umschaltung von DNS und Load Balancer</li>
</ol>
<p>Während des Piloten baut das Support-Team betriebliche Vertrautheit mit
Cozystack auf. Die Dokumentationsmuster spielen sich ein.</p>
<h3 id="phase-3--produktive-migrationskohorten">Phase 3 — Produktive Migrationskohorten</h3>
<p>Kohorten von jeweils 30–100 Kunden. Pro Kunde derselbe Ablauf wie im Piloten,
mit wachsender betrieblicher Effizienz, je mehr das Team den Workflow
verinnerlicht.</p>
<p>Kunden mit LXC werden gesondert behandelt: entweder als KubeVirt-VM im
System-Stil (1:1-Ersatz) oder durch Umbau zu einem Kubernetes-nativen
Anwendungscontainer (je nach Präferenz und Unterstützung des Kunden).</p>
<h3 id="phase-4--abschaltung-von-proxmox-parallel-zu-phase-3">Phase 4 — Abschaltung von Proxmox (parallel zu Phase 3)</h3>
<p>Mit dem Abschluss der Migrationskohorten wandert die Proxmox-Hardware in den
Cozystack-Cluster. Die Proxmox-Subscription läuft gemäß Verlängerungszyklus
aus. Die Daten des Proxmox Backup Server werden gemäß den Kundenvereinbarungen
archiviert.</p>
<h2 id="realistische-zeitpläne">Realistische Zeitpläne</h2>
<p>Für einen typischen mittelgroßen Hosting-Anbieter (300–1.000 Kunden):</p>
<ul>
<li>Phase 0: 14 oder 28 Tage</li>
<li>Phase 1: wenige Wochen nach Bereitstellung der Hardware</li>
<li>Phasen 2–3: zusammen typischerweise 3–9 Monate</li>
<li>Phase 4: parallel zu den letzten Kohorten</li>
</ul>
<p><strong>Die Plattform läuft wenige Wochen nach Bereitstellung der Hardware; der
Umzug von Workloads und Kunden dauert typischerweise 3–9 Monate.</strong></p>
<p>Bei größeren Betreibern (1.000–5.000 Kunden) dauert der Umzug länger, um
ein tragfähiges Kohortentempo zu halten.</p>
<h2 id="woran-migrationen-von-proxmox-zu-cozystack-scheitern">Woran Migrationen von Proxmox zu Cozystack scheitern</h2>
<h3 id="1-lxc-workloads">1. LXC-Workloads</h3>
<p>Wenn ein erheblicher Teil der Kunden-Workloads LXC als System-Container nutzt
(z. B. ein LAMP-Stack pro Kunde in einem einzigen LXC), erfordert die
Migration zu Kubernetes-nativen Containern einen Umbau. Die Alternative ist der
Betrieb als KubeVirt-VMs (1:1-Abbildung, aber höherer Ressourcenbedarf).
Planen Sie dafür in Phase 0 Zeit ein.</p>
<h3 id="2-abweichende-kundenseitige-apis">2. Abweichende kundenseitige APIs</h3>
<p>Manche Kunden haben eigene Werkzeuge gegen die Proxmox API gebaut. Cozystack
stellt die Kubernetes API und die Cozystack Dashboard API bereit; die
Schnittstellenverträge unterscheiden sich. Migrationsunterstützung auf
Kundenseite (Dokumentation, mitunter ein API-Kompatibilitäts-Shim) ist Teil
der Engagement-Arbeit.</p>
<h3 id="3-schulung-des-betriebsteams">3. Schulung des Betriebsteams</h3>
<p>Proxmox-Betreiber sind mit der Proxmox-Web-UI und den imperativen
CLI-Werkzeugen <code>qm</code> / <code>pct</code> / <code>pvesh</code> vertraut. Cozystack setzt für produktive Änderungen GitOps voraus.
Das Betriebsteam braucht 4–8 Wochen gezielte Schulung und anschließend
3–6 Monate Praxis. Das Ænix-Engagement umfasst Schulungen; zugleich muss auch
der Kunde in den Übergang investieren.</p>
<h3 id="4-zfs-spezifische-workloads">4. ZFS-spezifische Workloads</h3>
<p>Manche Kunden haben sich gerade wegen der ZFS-Funktionen auf dem Host für
Proxmox entschieden (erweiterte Snapshots, über ZFS replizierte Backups).
Cozystack liefert LINSTOR (DRBD) aus; ZFS-spezifische Betriebsmuster lassen sich
nicht übertragen. Das Gespräch mit dem Kunden über funktionale Äquivalenz ist
Teil von Phase 0.</p>
<h2 id="im-vergleich-zu-anderen-alternativen">Im Vergleich zu anderen Alternativen</h2>
<p><strong>Im Vergleich zum Eigenbau auf reinem KVM + libvirt + Kubernetes:</strong>
Dieselben Zielkonflikte wie bei jeder Open-Source-Eigenbauoption. Mit Cozystack
ist eine mandantenfähige Plattform in wenigen Wochen bis wenigen Monaten
produktiv; ein Eigenbau braucht 12–24 Monate, bis er dasselbe Niveau erreicht. Für Betreiber mit starker
Platform-Engineering-Kapazität ist der Eigenbau eine glaubwürdige Alternative.</p>
<p><strong>Im Vergleich zu VMware (nach Broadcom):</strong> Eine Migration von Proxmox zu
VMware ist 2026 selten — der Weg zurück ist nach Broadcom wirtschaftlich
meist nicht sinnvoll.</p>
<p><strong>Im Vergleich zu Nutanix:</strong> Nutanix AHV ist ein proprietäres KVM mit
geschlossenem Quellcode. Für Betreiber, denen ein Open-Source-Fundament
wichtig ist, gewinnt Cozystack allein durch diese Eigenschaft. Für Betreiber,
die integrierten kommerziellen Support ohne den Mehraufwand von Open Source
schätzen, gewinnt Nutanix.</p>
<p><strong>Im Vergleich zu OpenShift Virtualization:</strong> Beide basieren auf KubeVirt.
OpenShift passt zu bestehenden Red-Hat- und OpenShift-Kunden; Cozystack passt
zu Betreibern, die eine Open-Source-orientierte Beschaffung und einen
schlankeren betrieblichen Footprint bevorzugen.</p>
<h2 id="wann-dieses-engagement-modell-passt">Wann dieses Engagement-Modell passt</h2>
<p>Gut geeignet:</p>
<ul>
<li>Hosting-Anbieter oder MSP mit mehr als 300 Kunden</li>
<li>Wachstumskurs in Richtung 1.000+ Kunden</li>
<li>Kundennachfrage nach Diensten jenseits von VMs</li>
<li>Betrieb über mehrere Rechenzentren</li>
<li>Budget für ein Migrationsprogramm mit typischerweise 3–9 Monaten Kundenumzug</li>
</ul>
<p>Grenzfall:</p>
<ul>
<li>Anbieter mit 200–300 Kunden — Grenzbereich; hängt vom Wachstumskurs und
vom Anspruch an den Servicekatalog ab</li>
</ul>
<p>Schlecht geeignet:</p>
<ul>
<li>Mittelstands-IT (&lt; 100 interne VMs) — Proxmox ist weiterhin besser</li>
<li>Lab- und Entwicklungsumgebungen — die Einfachheit von Proxmox gewinnt</li>
<li>Hosting-Anbieter mit weniger als 200 Kunden — schlecht geeignet für ein
vollständiges Migrationsprogramm; stattdessen eine neue Produktlinie auf
der Ænix Public Cloud Platform im Providermaßstab erwägen</li>
</ul>
<h2 id="aufbau-des-engagements">Aufbau des Engagements</h2>
<ul>
<li><strong>Discovery Call</strong> (30 Min., kostenlos)</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>
(Festpreis, 14 Tage fokussiert oder 28 Tage vollständig) — Go/No-Go mit
TCO-Vergleich</li>
<li><strong>Pilot-Deployment</strong> — Cozystack wird aufgebaut, 5–20
wohlgesonnene Kunden werden migriert</li>
<li><strong>Kohortenmigration</strong> — Kundenmigration in Kohorten; Pilot und Kohorten
zusammen typischerweise 3–9 Monate</li>
<li><strong>Abschaltung von Proxmox</strong> (parallel) — sobald Kohorten
abgeschlossen sind</li>
<li><strong>Support-Subskription</strong> (laufend) — Plus- oder Enterprise-Stufe für
Abdeckung rund um die Uhr (siehe <a href="https://aenix.io/de/preise/">Preise</a>)</li>
</ul>
<h2 id="tiefer-einsteigen">Tiefer einsteigen</h2>
<ul>
<li><strong><a href="https://aenix.io/de/migration/proxmox/">Proxmox-Migrations-Hub</a></strong> — kommerzielle Landingpage</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/proxmox-vs-vmware-vs-cozystack/">Vergleich Proxmox vs. VMware vs. Cozystack</a></strong> —
Entscheidungsmatrix</li>
<li><strong><a href="https://aenix.io/de/alternativen/proxmox-alternative/">Proxmox-Alternative</a></strong> —
kommerzielle Landingpage mit Fokus auf Alternativen</li>
<li><strong><a href="https://aenix.io/de/branchen/hosting-anbieter/">Branchenseite Hosting-Anbieter</a></strong> —
branchenspezifische Positionierung</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/public-cloud-platform-wirtschaftlichkeit-hosting-anbieter/">Wirtschaftlichkeit der Public Cloud Platform für Hosting-Anbieter</a></strong> —
Unit Economics Schritt für Schritt</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/hosting-anbieter-plattform-modernisierung/">Plattformmodernisierung für Hosting-Anbieter</a></strong> —
Modernisierungsmuster</li>
</ul>
]]></content:encoded></item><item><title>Private-Cloud-Architektur 2026 — Design, Komponenten und Umsetzungsmuster</title><link>https://aenix.io/de/blog/2026/05/private-cloud-architektur-2026/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/private-cloud-architektur-2026/</guid><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>OpenStack</category><category>Kubernetes</category><category>KubeVirt</category><category>Sovereignty</category><category>Multi-tenancy</category><category>Financial Services</category><description>Private Cloud 2026: die Architekturschichten, drei bewährte Muster, Kapazitätsplanung und die Fehler, die in Design-Reviews immer wieder auftauchen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/private-cloud-architektur-2026.jpg" alt=""></p><p>Innerhalb von rund drei Jahren ist die Private Cloud von der „Architektur von gestern“ zum „Standard von morgen für regulierte und kostensensible Workloads“ geworden. Laut dem Broadcom Private Cloud Outlook 2025 priorisieren inzwischen 53 % der Organisationen die Private Cloud für neue Workloads. Die LSEG Global Cloud Survey berichtet, dass 84 % der Finanzdienstleister ihre Cloud-Strategie wegen regulatorischen Drucks angepasst haben. Der Wandel ist real.</p>
<p>Die Architekturentscheidungen sehen 2026 allerdings anders aus als bei den OpenStack-zentrierten Private Clouds aus der Zeit um 2018. Der Standard-Stack hat sich zu Kubernetes-nativer Virtualisierung (KubeVirt) plus Open-Source-Storage und -Networking verschoben. Das Betriebsmodell ist ausgereift, die Zielkonflikte liegen klarer auf dem Tisch.</p>
<h2 id="was-private-cloud-2026-bedeutet">Was „Private Cloud“ 2026 bedeutet</h2>
<p>Eine Private Cloud ist eine dedizierte Cloud-Infrastruktur, die für eine einzelne Organisation oder einen einzelnen Tenant betrieben wird. Sie bietet dieselben Self-Service-Nutzungsmuster wie die Public Cloud (Bereitstellung auf Abruf, Mandantenfähigkeit, Observability, Automatisierung) — allerdings auf Infrastruktur, die die Organisation selbst kontrolliert.</p>
<p>2026 tritt die Private Cloud in einer dieser Formen auf:</p>
<ul>
<li><strong>Im Eigentum und Betrieb des Kunden</strong> — die Organisation besitzt die Hardware und betreibt die Plattform.</li>
<li><strong>Im Eigentum des Kunden, Betrieb durch einen Anbieter</strong> — die Organisation besitzt die Hardware, ein Anbieter betreibt die Plattform vertraglich.</li>
<li><strong>Dediziert im Eigentum des Anbieters</strong> — der Anbieter stellt dedizierte Infrastruktur (Single-Tenant) bereit, die Organisation nutzt sie.</li>
<li><strong>Souveräne Hyperscaler-Region</strong> — vom Hyperscaler betriebene Infrastruktur mit Souveränitätskontrollen (manche zählen sie dazu, manche nicht).</li>
</ul>
<p>Dieser Artikel konzentriert sich auf die Varianten 1 und 2 im Eigentum des Kunden — die Architektur ist ähnlich, der Betrieb unterscheidet sich.</p>
<h2 id="architekturschichten">Architekturschichten</h2>
<p>Eine moderne Private Cloud besteht aus sechs funktionalen Schichten:</p>
<h3 id="schicht-1-hardware">Schicht 1: Hardware</h3>
<ul>
<li><strong>Compute</strong> — x86- oder ARM-Server; aktuelle Generationen unterstützen alle relevanten Workloads. KI und GPU bilden eine eigene Hardware-Ebene (NVIDIA H100/H200/L40S/Blackwell, AMD MI-Serie).</li>
<li><strong>Storage</strong> — replizierter Block-Storage (LINSTOR, Ceph oder Hersteller-SAN). Object Storage für Backups und Anwendungen.</li>
<li><strong>Netzwerk</strong> — Rechenzentrums-Fabric (BGP-geroutetes Leaf-Spine wird zunehmend zum Standard); 25–100 Gbit/s Ethernet genügen für die meisten Workloads außerhalb von HPC.</li>
<li><strong>Rechenzentrum</strong> — eigener Standort, Colocation oder ROBO/Edge. Strom, Kühlung, physische Sicherheit.</li>
</ul>
<h3 id="schicht-2-os--und-plattformfundament">Schicht 2: OS- und Plattformfundament</h3>
<ul>
<li><strong>Betriebssystem</strong> — Linux, für Kubernetes-Hosts zunehmend minimal (Talos, Bottlerocket, Flatcar). RHEL oder Ubuntu LTS für VM-Hypervisoren außerhalb von Kubernetes.</li>
<li><strong>Kubernetes</strong> — Vanilla, OpenShift, Cozystack oder herstellergeführt. Die Wahl der Distribution ist eine strukturelle Entscheidung.</li>
<li><strong>Virtualisierung</strong> — KubeVirt für VM-Workloads innerhalb von Kubernetes (der modernste Ansatz); KVM/libvirt direkt (OpenStack); VMware (Legacy).</li>
</ul>
<h3 id="schicht-3-storage-und-networking">Schicht 3: Storage und Networking</h3>
<ul>
<li><strong>Block-Storage</strong> — LINSTOR (DRBD-basiert, Standard in Cozystack), Ceph (über Rook verwaltet), Hersteller-SAN.</li>
<li><strong>Object Storage</strong> — Ceph RGW, MinIO, SeaweedFS.</li>
<li><strong>Netzwerkvirtualisierung</strong> — Cilium (eBPF, 2026 der Standard), Calico, OVN.</li>
<li><strong>Load Balancing</strong> — MetalLB für Layer 2/3, Cilium L7, Ingress-Controller (NGINX / Traefik / Contour).</li>
</ul>
<h3 id="schicht-4-control-plane">Schicht 4: Control Plane</h3>
<ul>
<li><strong>Mandantenfähigkeit</strong> — Tenant CRD (Cozystack), Namespace-basiert (Vanilla-Kubernetes), im Stil des vCloud Director (Legacy).</li>
<li><strong>Identität</strong> — Keycloak, Okta-Integration, AD-Integration. SPIFFE/SPIRE für Service-Identitäten.</li>
<li><strong>GitOps</strong> — Argo CD oder Flux. Cozystack setzt auf Flux.</li>
<li><strong>Observability</strong> — VictoriaMetrics + VictoriaLogs (Cozystack-Standard), Prometheus + Loki, SaaS-Angebote von Herstellern.</li>
<li><strong>Backup/DR</strong> — Velero + S3, anwendungsspezifische Muster (PostgreSQL PITR).</li>
</ul>
<h3 id="schicht-5-anwendungs--und-plattformdienste">Schicht 5: Anwendungs- und Plattformdienste</h3>
<ul>
<li><strong>Managed Databases</strong> — PostgreSQL (CloudNativePG), MariaDB, MongoDB, Redis, Valkey, Kafka, ClickHouse, RabbitMQ, NATS, OpenSearch.</li>
<li><strong>Object Storage as a Service</strong> — S3-kompatibel.</li>
<li><strong>KI/ML-Plattform</strong> — KubeVirt für VM-basierte GPU-Nutzung, Kubernetes-nativ für containerbasierte GPU-Nutzung, vLLM/Triton für Inferenz.</li>
<li><strong>Self-Service-Portal</strong> — Backstage, Cozystack Dashboard, Eigenentwicklung.</li>
</ul>
<h3 id="schicht-6-betrieb">Schicht 6: Betrieb</h3>
<ul>
<li><strong>Runbooks</strong> — dokumentierte Betriebsabläufe.</li>
<li><strong>Rufbereitschaft</strong> — Modell für die Incident Response.</li>
<li><strong>Kapazitätsplanung</strong> — quartalsweise Hardwareerneuerung, Wachstumsprognosen.</li>
<li><strong>Compliance-Status</strong> — Audit-Logging, Zertifizierungen (wo zutreffend), Dialog mit der Aufsicht.</li>
</ul>
<h2 id="drei-architekturmuster-die-funktionieren">Drei Architekturmuster, die funktionieren</h2>
<h3 id="muster-1-kubernetes-native-cloud-auf-basis-von-cozystack">Muster 1: Kubernetes-native Cloud auf Basis von Cozystack</h3>
<p><strong>Was:</strong> Ein einzelner Kubernetes-Cluster (oder eine Flotte) mit Cozystack als Plattformschicht. KubeVirt für VMs, Kubernetes für Container, LINSTOR für Storage, Cilium für Networking, Tenant CRD für Mandantenfähigkeit, Cozystack Dashboard für Self-Service.</p>
<p><strong>Am besten geeignet für:</strong> Service-Provider, Betreiber souveräner Clouds, regulierte Multi-Tenant-Umgebungen. Greenfield-Projekte.</p>
<p><strong>Vorteile:</strong> Open Source, ein einziger Stack, Mandantenfähigkeit nativ, Virtualisierung und Container auf einer Plattform.</p>
<p><strong>Nachteile:</strong> Jünger als OpenStack; kleinere Community als reine Kubernetes-Deployments.</p>
<h3 id="muster-2-klassische-private-cloud-auf-basis-von-openstack">Muster 2: Klassische Private Cloud auf Basis von OpenStack</h3>
<p><strong>Was:</strong> OpenStack als Compute-Orchestrator, Ceph für Storage, OVN für Networking, Heat/Terraform für die Bereitstellung. Optional Kubernetes auf OpenStack für Container-Workloads.</p>
<p><strong>Am besten geeignet für:</strong> Organisationen mit tiefer OpenStack-Erfahrung; große Telco- oder Souveränitätsprojekte, bei denen OpenStack der Beschaffungsstandard ist.</p>
<p><strong>Vorteile:</strong> Ausgereift, breite Community, viele Anbieteroptionen.</p>
<p><strong>Nachteile:</strong> Betrieblich komplex; OpenStack-Engineers sind 2026 schwerer zu finden; weniger Kubernetes-nativ.</p>
<h3 id="muster-3-vmware-cloud-foundation-vcf--legacy">Muster 3: VMware Cloud Foundation (VCF) — Legacy</h3>
<p><strong>Was:</strong> vSphere + vSAN + NSX + vCD + Aria (früher vRealize). Proprietär, im Subscription-Modell lizenziert.</p>
<p><strong>Am besten geeignet für:</strong> Bestehende VMware-Umgebungen, die durch die Broadcom-Ökonomie noch nicht zum Ausstieg gezwungen wurden.</p>
<p><strong>Vorteile:</strong> Ausgereift, gut bekannt, umfangreiche Integrationen.</p>
<p><strong>Nachteile:</strong> Nach Broadcom nur noch als Subscription erhältlich, beobachtete Preissteigerungen um den Faktor 2 bis 5, Bindung an die Roadmap eines einzigen Herstellers.</p>
<p>(Hinweise zum VMware-Ausstieg finden Sie unter <strong><a href="https://aenix.io/de/alternativen/vmware-alternative/">VMware-Alternative</a></strong>.)</p>
<h2 id="die-architekturentscheidungen-mit-dem-größten-gewicht">Die Architekturentscheidungen mit dem größten Gewicht</h2>
<p>Fünf Entscheidungen haben die stärkste langfristige Wirkung:</p>
<h3 id="entscheidung-1-virtualisierungsschicht">Entscheidung 1: Virtualisierungsschicht</h3>
<p>KubeVirt oder klassischer Hypervisor? KubeVirt ist 2026 der Standard für Greenfield-Projekte; ein klassischer Hypervisor (KVM/libvirt direkt) ist bei sehr großen OpenStack-Deployments angemessen, bei denen der Overhead von KubeVirt ins Gewicht fällt.</p>
<h3 id="entscheidung-2-storage-architektur">Entscheidung 2: Storage-Architektur</h3>
<p>LINSTOR/DRBD für replizierten Block-Storage? LINSTOR ist betrieblich einfacher und der Cozystack-Standard. Ceph ist flexibler, aber aufwendiger im Betrieb. Ein Hersteller-SAN ist eine Option, doch die Verträge schränken Ihr Skalierungsmuster ein.</p>
<h3 id="entscheidung-3-networking">Entscheidung 3: Networking</h3>
<p>Cilium ist zum Standard-CNI für neue Deployments geworden. NSX-äquivalente Funktionen (Cilium L7, Service Mesh) ersetzen die Funktionalität von VMware NSX. Die Entscheidung hängt eher davon ab, wie vertraut Ihr Team mit eBPF ist, als von der technischen Eignung.</p>
<h3 id="entscheidung-4-mandantenmodell">Entscheidung 4: Mandantenmodell</h3>
<p>Für das Service-Provider-Modell ist das Tenant CRD (Cozystack) der Standard. Für interne Mandantenfähigkeit über mehrere Geschäftsbereiche genügen Namespaces plus RBAC. Für absolute Isolation: ein Cluster pro Tenant (betrieblich teuer).</p>
<h3 id="entscheidung-5-betriebsmodell">Entscheidung 5: Betriebsmodell</h3>
<p>Betrieb durch den Kunden (Sie betreiben die Plattform), Betrieb durch einen Anbieter (Ænix oder ein vergleichbarer Partner betreibt sie für Sie) oder hybrid (Sie betreiben, der Anbieter liefert den 2nd-Level-Support). Die Entscheidung hängt von der Kapazität des internen Teams und der Risikobereitschaft ab.</p>
<h2 id="kapazitätsplanung">Kapazitätsplanung</h2>
<p>Eine praxistaugliche Faustregel für eine Last von 100 VM-Äquivalenten:</p>
<ul>
<li><strong>Compute:</strong> 6–10 Dual-Socket-Server mit je 256–512 GB RAM. 30 % Reserve für Ausfälle und Wachstum einplanen.</li>
<li><strong>Storage:</strong> rund 100 TB repliziert (3 Replikate) für den Regelbetrieb plus Kapazität für Snapshots und Backups. Dafür werden etwa 300 TB Rohkapazität benötigt.</li>
<li><strong>Netzwerk:</strong> 25-Gbit/s-NIC pro Server, Leaf-Spine-Fabric, 100-Gbit/s-Backbone.</li>
<li><strong>Rechenzentrum:</strong> etwa 6–10 kW pro Rack bei moderner Packungsdichte.</li>
<li><strong>DR-Standort:</strong> vergleichbarer zweiter Footprint.</li>
</ul>
<p>Über 1000 VMs hinaus wächst die Hardware ungefähr linear; das Plattformteam wächst bei guter Automatisierung unterproportional.</p>
<h2 id="betriebspraktiken-auf-die-es-ankommt">Betriebspraktiken, auf die es ankommt</h2>
<ul>
<li><strong>Quartalsweise Kapazitäts-Reviews</strong> — Hardware dem Wachstum voraus beschaffen.</li>
<li><strong>Zwei Kubernetes-Upgrades pro Jahr</strong> — bei CVEs und Funktionsumfang auf dem aktuellen Stand bleiben.</li>
<li><strong>Dokumentierte Incident Response</strong> — Incident Commander, Protokollführung, Post-Mortems ohne Schuldzuweisung.</li>
<li><strong>Compliance-Status</strong> — Audit-Logs, Zertifizierungen, Dialog mit der Aufsicht, wo zutreffend.</li>
<li><strong>Realistisch bemessenes Plattformteam</strong> — 1–3 Engineers für eine kleine Private Cloud mit einem einzelnen Cluster; 5–15 für einen Service-Provider mit mehreren Clustern.</li>
</ul>
<h2 id="häufige-architekturfehler">Häufige Architekturfehler</h2>
<h3 id="fehler-1-public-cloud-architektur-kopieren">Fehler 1: Public-Cloud-Architektur kopieren</h3>
<p>Die Private Cloud wird so entworfen, dass sie intern wie AWS aussieht. Die Skalenökonomie ist eine andere; Public-Cloud-Architekturmuster (massiv verteilte Systeme mit Eventual Consistency) sind für die meisten Private Clouds überdimensioniert.</p>
<h3 id="fehler-2-herstellergeführte-private-cloud">Fehler 2: Herstellergeführte Private Cloud</h3>
<p>Wer eine „Private-Cloud-Appliance“ kauft, baut den Lock-in mit einem neuen Hersteller wieder auf. Die Roadmap des Herstellers wird zu Ihrer eigenen.</p>
<h3 id="fehler-3-zu-wenig-in-den-betrieb-investiert">Fehler 3: Zu wenig in den Betrieb investiert</h3>
<p>Compute und Storage sind gelöst, aber in Observability, Identität, Backup/DR und Runbooks wurde zu wenig investiert. Es entstehen betriebliche Altlasten.</p>
<h3 id="fehler-4-mandantenfähigkeit-im-design-ausgelassen">Fehler 4: Mandantenfähigkeit im Design ausgelassen</h3>
<p>Ein Single-Tenant-Cluster wird später auf Mandantenfähigkeit hochskaliert. Nachträglich angeflanschte Mandantenfähigkeit scheitert im großen Maßstab oder bei einer Prüfung durch die Aufsicht.</p>
<h3 id="fehler-5-hardwareerneuerung-nicht-budgetiert">Fehler 5: Hardwareerneuerung nicht budgetiert</h3>
<p>Die Hardwareerneuerung im vierten Jahr fehlt in der ursprünglichen Wirtschaftlichkeitsrechnung. Die Kostenklippe der Erneuerung kommt dann unerwartet.</p>
<h2 id="tiefer-einsteigen">Tiefer einsteigen</h2>
<ul>
<li><strong><a href="https://aenix.io/de/dienstleistungen/private-cloud-consulting/">Private-Cloud-Consulting</a></strong> — Details zum Engagement</li>
<li><strong><a href="https://aenix.io/de/loesungen/data-sovereignty/">Datensouveränität</a></strong> — Souveränität als Auslöser</li>
<li><strong><a href="https://aenix.io/de/loesungen/cloud-repatriation/">Cloud-Repatriierung</a></strong> — beim Wechsel aus der Public Cloud</li>
<li><strong><a href="https://aenix.io/de/alternativen/vmware-alternative/">VMware-Alternative</a></strong> — beim Wechsel weg von VMware</li>
<li><strong><a href="https://aenix.io/de/produkte/cozystack/">Cozystack</a></strong> — Open-Source-Plattformfundament</li>
</ul>
]]></content:encoded></item><item><title>OpenStack vs Cozystack — Modernisierungsoptionen für OpenStack-Betreiber 2026</title><link>https://aenix.io/de/blog/2026/05/openstack-vs-cozystack-modernisierung/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/openstack-vs-cozystack-modernisierung/</guid><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>OpenStack</category><category>Kubernetes</category><category>Cozystack</category><category>Sovereignty</category><category>Migration</category><description>Wo OpenStack weiterhin überzeugt, woher der betriebliche Druck kommt und welche Modernisierungspfade Teams mit OpenStack-Erfahrung offenstehen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/openstack-vs-cozystack-modernisierung.jpg" alt=""></p><p>OpenStack ist in Telco- und Behördeninfrastrukturen nach wie vor weit verbreitet. Gleichzeitig steht es unter strukturellem Druck: Der Pool an OpenStack-Engineers schrumpft, die betriebliche Komplexität wächst mit dem Alter eines Deployments, und es gibt Kubernetes-native Alternativen, die es zum Zeitpunkt des OpenStack-Designs noch nicht gab.</p>
<h2 id="wo-openstack-weiterhin-überzeugt">Wo OpenStack weiterhin überzeugt</h2>
<ul>
<li><strong>Deployments im Telco-Maßstab</strong> — Tausende Nodes mit telco-spezifischen Funktionen (NFV, DPDK-Integration, SR-IOV, Hochdurchsatz-Networking). Die Expertise ist etabliert, die Herstellerdistributionen sind ausgereift.</li>
<li><strong>Behörden- und souveräne Clouds</strong> — große OpenStack-Deployments im öffentlichen Sektor, in denen OpenStack die per Ausschreibung vorgegebene Plattform ist.</li>
<li><strong>Bestehende Investitionen</strong> — Organisationen, die seit mehr als fünf Jahren mit OpenStack arbeiten und tiefe Expertise aufgebaut haben. Die Kosten einer Migration können die Kosten des Weiterbetriebs übersteigen.</li>
<li><strong>Bestimmte Funktionen</strong> — einige OpenStack-Fähigkeiten (tiefgehende Netzwerkprogrammierbarkeit, spezielle Telco-Features) haben noch keine direkten Kubernetes-Entsprechungen.</li>
</ul>
<h2 id="woher-der-druck-kommt">Woher der Druck kommt</h2>
<ul>
<li><strong>Fachkräftemangel</strong> — der Pool an OpenStack-Expertise schrumpft. Neue Engineers werden auf Kubernetes ausgebildet, nicht auf OpenStack.</li>
<li><strong>Wildwuchs an Komponenten</strong> — über 30 Services in einem typischen OpenStack-Deployment, jeder mit eigenem Lifecycle, eigenem Upgrade-Rhythmus und eigenen Integrationstests.</li>
<li><strong>Aufwendige Upgrades</strong> — Major-Upgrades von OpenStack sind betrieblich nach wie vor schwergewichtig.</li>
<li><strong>Zersplitterte Herstellerdistributionen</strong> — Red Hat OSP, Mirantis, Canonical und andere, jede mit eigenen Vorstellungen und eigenem Supportmodell.</li>
</ul>
<h2 id="modernisierungspfade">Modernisierungspfade</h2>
<p>Für OpenStack-Betreiber, die über eine Modernisierung nachdenken:</p>
<h3 id="pfad-1-bleiben-und-optimieren">Pfad 1: bleiben und optimieren</h3>
<p>OpenStack weiterbetreiben und in die Betriebspraxis investieren (Helm-basierte Deployments, GitOps, Automatisierung). Richtig, wenn die OpenStack-Expertise tief ist und die Kosten einer Migration ihren Nutzen übersteigen.</p>
<h3 id="pfad-2-kubernetes-auf-openstack">Pfad 2: Kubernetes auf OpenStack</h3>
<p>Kubernetes-Plattformen (Cozystack oder andere) als Tenant auf OpenStack betreiben. Das fügt eine weitere Plattformschicht hinzu; manche Teams halten diesen Weg für einen schrittweisen Übergang trotzdem für praktikabel.</p>
<h3 id="pfad-3-paralleles-deployment">Pfad 3: paralleles Deployment</h3>
<p>Cozystack neben OpenStack auf neuer Hardware aufbauen. Workloads Kohorte für Kohorte migrieren. OpenStack stilllegen, sobald die Kohorten abgeschlossen sind. Der häufigste Weg zur vollständigen Modernisierung.</p>
<h3 id="pfad-4-vollständiges-lift-and-shift-auf-kubernetes">Pfad 4: vollständiges Lift-and-Shift auf Kubernetes</h3>
<p>Der aggressive Weg — die OpenStack Control Plane durch ein Kubernetes-basiertes Gegenstück (Cozystack) ersetzen. Höheres Risiko, schnelleres Ergebnis.</p>
<h2 id="cozystack-architektur-für-teams-mit-openstack-hintergrund">Cozystack-Architektur für Teams mit OpenStack-Hintergrund</h2>
<p>Einige hilfreiche Entsprechungen:</p>
<table>
  <thead>
      <tr>
          <th>OpenStack</th>
          <th>Cozystack</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Nova</td>
          <td>KubeVirt</td>
      </tr>
      <tr>
          <td>Neutron</td>
          <td>Cilium</td>
      </tr>
      <tr>
          <td>Cinder</td>
          <td>LINSTOR (DRBD-repliziertes Block-Storage)</td>
      </tr>
      <tr>
          <td>Swift</td>
          <td>SeaweedFS (S3-kompatibel)</td>
      </tr>
      <tr>
          <td>Keystone</td>
          <td>Kubernetes RBAC + Anbindung an den Workforce-IdP</td>
      </tr>
      <tr>
          <td>Glance</td>
          <td>KubeVirt CDI Image Registry</td>
      </tr>
      <tr>
          <td>Magnum</td>
          <td>Nativ — Kubernetes ist die Plattform</td>
      </tr>
      <tr>
          <td>Heat</td>
          <td>Kubernetes-Operatoren + GitOps</td>
      </tr>
      <tr>
          <td>Horizon</td>
          <td>Cozystack Dashboard</td>
      </tr>
      <tr>
          <td>Ceilometer</td>
          <td>VictoriaMetrics + VictoriaLogs</td>
      </tr>
      <tr>
          <td>Trove</td>
          <td>Managed Databases von Cozystack</td>
      </tr>
      <tr>
          <td>Designate</td>
          <td>External-DNS-Operator</td>
      </tr>
      <tr>
          <td>Octavia</td>
          <td>MetalLB / Ingress + Cilium L7</td>
      </tr>
  </tbody>
</table>
<p>Die meisten OpenStack-Engineers empfinden das Betriebsmodell von Cozystack als einfacher — weniger bewegliche Teile, stärker deklarativ, integrierte Observability.</p>
<h2 id="praktisches-vorgehen-bei-der-migration">Praktisches Vorgehen bei der Migration</h2>
<p>Für eine OpenStack-zu-Cozystack-Migration mittlerer Größe (50–500 Hosts):</p>
<ol>
<li><strong>Assessment (14 oder 28 Tage)</strong> — bestehendes OpenStack-Deployment, Klassifizierung der Workloads, Zielarchitektur für Cozystack.</li>
<li><strong>Cozystack-Fundament</strong> — paralleles Deployment auf neuer oder umgewidmeter Hardware.</li>
<li><strong>Migrationskohorten</strong> — die Workloads ziehen Kohorte für Kohorte um. Images werden über KVM→KubeVirt migriert.</li>
<li><strong>Stilllegung von OpenStack</strong> — gestaffelt, sobald die Kohorten abgeschlossen sind.</li>
</ol>
<p>Gesamtdauer: 4–12 Monate für ein mittelgroßes Deployment; 12–18 Monate bei komplexen Provider-Netzwerken oder OpenStack-APIs, die Mandanten direkt nutzen.</p>
]]></content:encoded></item><item><title>OpenStack-Migration — ein kohortenbasiertes Playbook für den Umstieg auf Cozystack 2026</title><link>https://aenix.io/de/blog/2026/05/openstack-migration-cozystack-kohorten-playbook/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/openstack-migration-cozystack-kohorten-playbook/</guid><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>OpenStack</category><category>Cozystack</category><category>Migration</category><category>Multi-tenancy</category><category>Kubernetes</category><description>Kohortenbasiertes Playbook für die Migration von produktivem OpenStack zu Cozystack: Komponenten-Mapping, Image-Konvertierung, Netzwerk, Übergabe und Zeitplan.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/openstack-migration-cozystack-kohorten-playbook.jpg" alt=""></p><p>OpenStack ist in Telekommunikations- und Großunternehmens-Infrastrukturen
nach wie vor weit verbreitet. Für die Modernisierung gibt es kein
Patentrezept: Ein ausgereiftes OpenStack im Telco-Maßstab mit tiefem
Support durch eine Hersteller-Distribution ist eine ganz andere Migration
als ein mittelgroßes Unternehmen, das Upstream-OpenStack mit einem kleinen
Betriebsteam fährt. Beide können auf Cozystack umsteigen; Phasenplanung und
Risikoprofil unterscheiden sich jedoch erheblich.</p>
<h2 id="wo-openstack-weiterhin-funktioniert-und-das-sagen-wir-auch">Wo OpenStack weiterhin funktioniert (und das sagen wir auch)</h2>
<p>Bevor wir über Migration sprechen, zunächst ehrlich der Gegenfall.
OpenStack bleibt die richtige Antwort für:</p>
<ul>
<li><strong>NFV-Umgebungen von Tier-1-Telcos</strong>, in denen die Hersteller-Distribution
(Red Hat OSP, Mirantis, Canonical, Wind River) noch Support-Laufzeit hat
und die VNF-Zertifizierung OpenStack-spezifisch ist</li>
<li><strong>Sehr große Bestände (&gt;1.000 Nodes)</strong> mit tiefem OpenStack-Know-how, bei
denen sich die betriebliche Komplexität bereits amortisiert hat</li>
<li><strong>Government Clouds</strong>, in denen OpenStack die vergaberechtlich
vorgeschriebene Plattform ist (einige Ausschreibungen des öffentlichen
Sektors in EU-Mitgliedstaaten und im APAC-Raum)</li>
<li><strong>Bestehende Investitionen im Jahr 2–3 eines fünfjährigen Rollouts</strong>, bei
denen die Migrationskosten die Kosten des Weiterbetriebs übersteigen würden</li>
</ul>
<p>Für alle anderen lohnt sich in der Regel eine ernsthafte Bewertung der
Modernisierung.</p>
<h2 id="was-openstack-betreiber-zur-migration-drängt">Was OpenStack-Betreiber zur Migration drängt</h2>
<p>Drei Treiber bestimmen die Diskussion 2026:</p>
<h3 id="1-lebenszyklus-der-hersteller-distributionen">1. Lebenszyklus der Hersteller-Distributionen</h3>
<p>Red Hat lenkt Kunden von OSP (OpenStack Platform) zu OpenShift-basierten
Angeboten. Andere Distributionen (Mirantis, Canonical) sind weiter am
Markt, doch die Anbieterlandschaft für OpenStack-Distributionen
konsolidiert sich. Prüfen Sie die Supportdaten in Ihrem eigenen
Vertrag: Bei vielen Deployments aus der Mitte der 2020er-Jahre fallen sie
in die nächsten Jahre.</p>
<h3 id="2-fachkräftemangel">2. Fachkräftemangel</h3>
<p>OpenStack-Know-how wird knapper. Neue Engineers lernen Kubernetes, nicht das
Komponentenmodell aus Nova/Neutron/Cinder/Keystone. Betreiber mit tiefer
OpenStack-Erfahrung gehen in den Ruhestand oder wechseln in andere Rollen.
Einstellen wird schwieriger, Halten ebenso.</p>
<h3 id="3-grenze-des-servicekatalogs">3. Grenze des Servicekatalogs</h3>
<p>Der Kernumfang von OpenStack ist IaaS (Compute, Netzwerk, Storage).
Verwaltete Datenbanken (Trove), Container-Orchestrierung (Magnum) und
moderne Servicefamilien (Managed Kafka, S3-Äquivalent im großen Maßstab,
GPU-as-a-Service, AI Inference) lassen sich entweder nur umständlich
anflanschen oder liegen ganz außerhalb der Plattform. Für Betreiber, deren
Kunden oder interne Teams zunehmend Services in Plattformqualität erwarten,
fällt OpenStack ohne erheblichen zusätzlichen Engineering-Aufwand zurück.</p>
<h2 id="komponenten-mapping">Komponenten-Mapping</h2>
<p>Für OpenStack-Betreiber, die Cozystack bewerten, gilt folgende kanonische
Übersetzung:</p>
<table>
  <thead>
      <tr>
          <th>OpenStack</th>
          <th>Cozystack-Äquivalent</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Nova</strong> (Compute)</td>
          <td>KubeVirt auf Talos</td>
      </tr>
      <tr>
          <td><strong>Neutron</strong> (Netzwerk)</td>
          <td>Cilium (eBPF)</td>
      </tr>
      <tr>
          <td><strong>Cinder</strong> (Block Storage)</td>
          <td>LINSTOR (per DRBD replizierter Block Storage, über den Piraeus-Operator)</td>
      </tr>
      <tr>
          <td><strong>Swift</strong> (Object Storage)</td>
          <td>SeaweedFS (S3-kompatibel, verwalteter Bucket-Service)</td>
      </tr>
      <tr>
          <td><strong>Keystone</strong> (Identität)</td>
          <td>Kubernetes RBAC + Föderation mit dem Workforce-IdP (Keycloak / Okta / AD)</td>
      </tr>
      <tr>
          <td><strong>Glance</strong> (Image-Registry)</td>
          <td>KubeVirt CDI + Container-Image-Registry</td>
      </tr>
      <tr>
          <td><strong>Magnum</strong> (Managed Kubernetes)</td>
          <td>Nativ — Kubernetes IST die Plattform</td>
      </tr>
      <tr>
          <td><strong>Heat</strong> (Orchestrierung)</td>
          <td>Kubernetes-Operatoren + GitOps (Flux / Argo CD)</td>
      </tr>
      <tr>
          <td><strong>Horizon</strong> (UI)</td>
          <td>Cozystack Dashboard</td>
      </tr>
      <tr>
          <td><strong>Ceilometer / Telemetry</strong></td>
          <td>VictoriaMetrics + VictoriaLogs</td>
      </tr>
      <tr>
          <td><strong>Trove</strong> (DBaaS)</td>
          <td>Verwaltete Datenbanken in Cozystack (PostgreSQL, MariaDB, MongoDB, Redis, Valkey, Kafka, NATS, RabbitMQ, ClickHouse, OpenSearch, Qdrant, FoundationDB)</td>
      </tr>
      <tr>
          <td><strong>Designate</strong> (DNS)</td>
          <td>external-dns-Operator + DNS-Anbieter des Kunden</td>
      </tr>
      <tr>
          <td><strong>Octavia</strong> (Load Balancing)</td>
          <td>MetalLB + Cilium L7 + Ingress Controller</td>
      </tr>
      <tr>
          <td><strong>Manila</strong> (File Share)</td>
          <td>RWX-Volumes auf DRBD-gestützten LINSTOR-Storage-Classes (Cozystack v1.0+); optionales Paket <code>nfs-driver</code> für externe NFS-Exporte</td>
      </tr>
      <tr>
          <td><strong>Project / Domain / Role</strong> (Mandantenfähigkeit)</td>
          <td>Tenant CRD + verschachtelte Tenants</td>
      </tr>
  </tbody>
</table>
<p>Die meisten OpenStack-Engineers empfinden das Betriebsmodell von Cozystack
als einfacher, sobald sie die Kubernetes-Lernkurve genommen haben — weniger
bewegliche Teile, deklarativer, integrierte Observability. Die Lernkurve
selbst ist allerdings real: 4–8 Wochen gezieltes Training pro Engineer,
länger für fachliche Tiefe.</p>
<h2 id="migrationsphasen-in-kohorten">Migrationsphasen in Kohorten</h2>
<h3 id="phase-0--assessment-14-oder-28-tage">Phase 0 — Assessment (14 oder 28 Tage)</h3>
<p>Bestandsaufnahme des OpenStack-Deployments:</p>
<ul>
<li><strong>Nutzung Service für Service</strong> — welche OpenStack-Services Sie
tatsächlich verwenden (Nova / Neutron / Cinder fast immer, alles andere
variiert)</li>
<li><strong>Workload-Inventar</strong> — Anzahl der Instanzen, Betriebssystem-Mix,
vCPU-/RAM-/Disk-Profile, Kritikalitätsstufe</li>
<li><strong>Netzwerk-Inventar</strong> — Subnetze, Security Groups, Floating IPs,
Konfigurationen externer Netze, Octavia-Load-Balancer</li>
<li><strong>Storage-Inventar</strong> — Cinder-Volume-Typen, Aufbewahrung von Snapshots,
Nutzung von Swift-Buckets</li>
<li><strong>Mandantenfähigkeit</strong> — Hierarchie aus Projects und Domains,
benutzerdefinierte Rollen, RBAC-Richtlinien</li>
<li><strong>Integrationen</strong> — VNF-Zertifizierungen der Hersteller,
Observability-Anbindungen, CI/CD-Pipelines, ITSM-Werkzeuge</li>
</ul>
<p>Ergebnis: ein Migrationsplan mit Workload-Kategorien (jetzt migrieren /
später migrieren / bleiben / neu architekturieren), Risikomarkierungen und
Optionen für die Phasenplanung.</p>
<h3 id="phase-1--cozystack-fundament">Phase 1 — Cozystack-Fundament</h3>
<p>Hardwarebeschaffung (oder in späteren Phasen Wiederverwendung der Kapazität,
die OpenStack freigibt). Die Cozystack-Plattform wird auf neuer Hardware
parallel zum bestehenden OpenStack aufgebaut. Das Cilium-Networking wird
gegen jene OpenStack-Netzwerkkonfigurationen validiert, die übertragen
werden sollen. LINSTOR-Storage wird im großen Maßstab in Betrieb genommen.
Föderierte Identität (Keycloak + IdP des Kunden).</p>
<p>Das Tenant-CRD-Modell wird so entworfen, dass es sich sauber aus der
Project-/Domain-Hierarchie von OpenStack ableiten lässt. Jedes
OpenStack-Project der obersten Ebene wird typischerweise zu einem
Cozystack-Tenant, verschachtelte Projects werden zu verschachtelten Tenants.</p>
<p>Endzustand: Die Cozystack-Plattform läuft, ist intern validiert und bereit
für das Onboarding der Workloads.</p>
<h3 id="phase-2--betriebswerkzeuge">Phase 2 — Betriebswerkzeuge</h3>
<p>Observability-Stack (VictoriaMetrics + VictoriaLogs), integriert in das SIEM
des Kunden. Backup/DR mit Velero plus anwendungsspezifischen Mustern.
Runbook-Bibliothek. Rufbereitschaft. Incident-Response-Prozess.
GitOps-Deployment-Workflow (standardmäßig Flux, Argo CD auf Wunsch des
Kunden).</p>
<p>Endzustand: Werkzeuge in Produktionsbetriebsqualität sind vorhanden, die
Schulung des Teams läuft.</p>
<h3 id="phase-3--workload-migration-in-kohorten">Phase 3 — Workload-Migration in Kohorten</h3>
<p>Es migrieren jeweils Kohorten von 50–200 Instanzen. Pro Kohorte:</p>
<ol>
<li><strong>Image-Konvertierung</strong> — OpenStack-Glance-Images werden in ein
KubeVirt-kompatibles Format konvertiert. Die meisten KVM-basierten
OpenStack-Images lassen sich mit <code>qemu-img convert</code> und kleinen
Metadatenanpassungen umwandeln. In Windows-Instanzen werden
virtio-Treiber injiziert.</li>
<li><strong>Netzwerk-Mapping</strong> — OpenStack-Subnetze auf Cilium ClusterPool +
NetworkPolicies, Security Groups auf NetworkPolicies,
Octavia-Load-Balancer auf MetalLB + Ingress Controller.</li>
<li><strong>Storage-Migration</strong> — Die Daten der Cinder-Volumes werden nach LINSTOR
migriert. Die Snapshot-Historie wird je nach Aufbewahrungsrichtlinie
übernommen oder bereinigt. Für Daten in Swift erlaubt die
S3-API-Kompatibilität eine direkte Migration nach SeaweedFS.</li>
<li><strong>Validierungsfenster</strong> — Der Workload läuft typischerweise 7–14 Tage
parallel auf Cozystack. Vor dem endgültigen Cutover ist die Freigabe des
Application Owners erforderlich.</li>
<li><strong>Endgültiger Cutover</strong> — DNS bzw. Load Balancer werden auf den
Cozystack-Endpunkt umgeschaltet. Die OpenStack-Instanz bleibt für ein
Rollback-Fenster von 7–30 Tagen verfügbar.</li>
</ol>
<h3 id="phase-4--betriebsübergabe-parallel-zu-phase-3">Phase 4 — Betriebsübergabe (parallel zu Phase 3)</h3>
<p>Die Ænix-Engineers reduzieren ihre direkte Beteiligung. Das Betriebsteam des
Kunden übernimmt Incidents im First- und Second-Level. Der Ænix-Support
(Plus- oder Enterprise-Stufe für 24×7) läuft für die Eskalation weiter. Übergabe der Dokumentation.
Sitzungen zum Wissenstransfer.</p>
<h3 id="phase-5--stilllegung-von-openstack">Phase 5 — Stilllegung von OpenStack</h3>
<p>Sobald Migrationskohorten abgeschlossen sind, wird OpenStack-Kapazität in
den Cozystack-Cluster überführt. Die Hardware ist dieselbe
Standard-x86-Hardware; der OpenStack-Software-Stack wird stillgelegt.
Verträge für Hersteller-Distributionen laufen gemäß ihrem Lebenszyklus aus.</p>
<h2 id="woran-migrationen-von-openstack-zu-cozystack-scheitern">Woran Migrationen von OpenStack zu Cozystack scheitern</h2>
<h3 id="1-neuentwurf-des-netzwerkmodells">1. Neuentwurf des Netzwerkmodells</h3>
<p>Das Netzwerkmodell von OpenStack Neutron war traditionell hochgradig
konfigurierbar — Provider-Netze, Tenant-Netze, Security Groups, Floating
IPs, FWaaS, VPNaaS, komplexe Routing-Topologien. Das eBPF-Modell von Cilium
ist grundlegend anders: L4/L7-NetworkPolicies, eBPF-basiertes Routing,
Hubble für Observability.</p>
<p>Ausgefeilte Neutron-Konfigurationen auf Cilium zu übertragen, erfordert
sorgfältige Architekturarbeit in Phase 0–1. Wer diese überspringt, erlebt in
Phase 3 Produktionsvorfälle, weil Kunden-Workloads ein bestimmtes
Netzwerkverhalten erwarten, das sich nicht direkt übertragen lässt.</p>
<h3 id="2-übersetzung-der-mandanten-richtlinien">2. Übersetzung der Mandanten-Richtlinien</h3>
<p>Das rollenbasierte Zugriffsmodell von OpenStack (Keystone-Rollen,
Project-Policies) lässt sich nicht 1:1 auf Kubernetes RBAC + Tenant CRD
abbilden. Benutzerdefinierte Rollen für bestimmte OpenStack-APIs haben
möglicherweise keine direkte Entsprechung in Kubernetes. Planen Sie Zeit
für einen Neuentwurf der Richtlinien ein statt für eine mechanische
Übersetzung.</p>
<h3 id="3-vnf-zertifizierung">3. VNF-Zertifizierung</h3>
<p>Tier-1-Telcos mit zertifizierten VNFs stehen vor einer anderen
Herausforderung: Der VNF-Hersteller zertifiziert auf bestimmten
OpenStack-Distributionen, nicht auf Cozystack. Drei Ansätze:</p>
<ul>
<li><strong>VNFs auf KubeVirt unter Cozystack betreiben</strong> — die VNF läuft als VM;
ob die Herstellerzertifizierung diese Konfiguration abdeckt, ist offen.
Ein Gespräch mit dem Hersteller ist notwendig.</li>
<li><strong>Zertifizierte VNFs auf OpenStack belassen</strong> — parallele Plattformen für
den Lebenszyklus der zertifizierten VNF; ein Modernisierungs-Track für
neue VNFs auf Cozystack.</li>
<li><strong>Ein Cloud-native Äquivalent verhandeln</strong> — viele VNF-Hersteller
wechseln zu Cloud-Native Network Functions (CNFs) auf Kubernetes; die
Migration lässt sich womöglich mit der CNF-Modernisierung des Herstellers
verzahnen.</li>
</ul>
<p>In der Praxis kommen alle drei Muster vor, oft beim selben Betreiber — je
nachdem, um welchen VNF-Hersteller und welche Generation es geht.</p>
<h3 id="4-wandel-der-betriebskultur">4. Wandel der Betriebskultur</h3>
<p>OpenStack-Betreiber sind imperative APIs gewohnt (CLI-Befehle, REST-Aufrufe,
Aktionen in der Konsole). Cozystack erwartet GitOps für produktive
Änderungen. Das ist ein Kulturwandel, nicht nur ein Werkzeugwechsel.
Engineers, deren OpenStack-Expertise auf imperativen Workflows aufbaut,
brauchen 4–8 Wochen gezieltes Training plus 3–6 Monate Praxis, um die
GitOps-Disziplin zu verinnerlichen.</p>
<p>Ein Ænix-Engagement umfasst Training als eigenen Workstream; zugleich muss
der Kunde selbst in den kulturellen Wandel investieren.</p>
<h2 id="realistische-zeitpläne">Realistische Zeitpläne</h2>
<p>Mittelgroßes Unternehmen (200–500 Nodes, einfache Mandantenstruktur,
überwiegend Standard-Networking):</p>
<ul>
<li>Phase 0: 14 oder 28 Tage</li>
<li>Phasen 1–5: Fundament, Betriebswerkzeuge, Kohortenmigration, Übergabe
und Stilllegung, teilweise parallel</li>
</ul>
<p><strong>Gesamt: 4–12 Monate für ein mittelgroßes Deployment; 12–18 Monate bei
komplexen Provider-Netzwerken oder OpenStack-APIs, die Mandanten direkt
nutzen</strong></p>
<p>Tier-1-Telco (1.000–5.000 Nodes, komplexe Mandantenstruktur, zertifizierte
VNF-Umgebungen, NFV-spezifisches Networking):</p>
<ul>
<li>Phase 0: 2–3 Monate</li>
<li>Phase 1: 4–6 Monate</li>
<li>Phase 2: 2–3 Monate</li>
<li>Phase 3: 12–24 Monate (mehrere parallele Kohorten)</li>
<li>Phase 4–5: 6–12 Monate</li>
<li>Track zur VNF-Modernisierung: parallel 18–36 Monate</li>
</ul>
<p><strong>Gesamt: 24–48 Monate für die vollständige Modernisierung; erste
produktive Workloads auf Cozystack innerhalb von 12–18 Monaten</strong></p>
<h2 id="wann-die-migration-von-openstack-zu-cozystack-die-richtige-antwort-ist">Wann die Migration von OpenStack zu Cozystack die richtige Antwort ist</h2>
<p>Gute Passung:</p>
<ul>
<li>Der Lebenszyklus der Hersteller-Distribution erzwingt innerhalb von 24
Monaten eine Entscheidung</li>
<li>Der Fachkräftemangel beginnt, die Betriebsqualität zu beeinträchtigen</li>
<li>Die Kundennachfrage nach verwalteten Datenbanken / S3 / Containern /
GPU-Services übersteigt, was OpenStack nativ abdeckt</li>
<li>Ein Modernisierungsbudget steht über 2–4 Jahre zur Verfügung</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Stabiles, ausgereiftes OpenStack-Deployment mit tiefer Teamexpertise und
ohne Druck auf den Servicekatalog — die Modernisierung kann bis zum Ende
des Herstellerlebenszyklus warten</li>
<li>Sehr große Bestände (&gt;5.000 Nodes), bei denen die Modernisierungskosten im
mehrstelligen Millionenbereich liegen — ein gestaffeltes, mehrjähriges
Programm ist erforderlich</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Kürzlich ausgerolltes OpenStack im ersten Jahr eines Fünfjahresprogramms —
bringen Sie zu Ende, was Sie begonnen haben, und modernisieren Sie am Ende
des Lebenszyklus</li>
<li>OpenStack auf Basis einer Vergabevorgabe der öffentlichen Hand ohne
Spielraum für einen Plattformwechsel</li>
</ul>
<h2 id="aufbau-des-engagements">Aufbau des Engagements</h2>
<ul>
<li><strong>Discovery Call</strong> (30 Min., kostenlos)</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>
(Festpreis, 14 Tage fokussiert oder 28 Tage vollständig) — Workload-Kategorien,
Optionen für die Phasenplanung, Risikomarkierungen</li>
<li><strong>Pilot-Deployment</strong> — Cozystack wird aufgebaut, 50–100
Workloads werden migriert, Abrechnungs- und Betriebsabläufe validiert</li>
<li><strong>Migration in Kohorten</strong> — Workload-Migration in Kohorten; insgesamt
4–12 Monate für ein mittelgroßes Deployment, 12–18 Monate bei komplexen
Provider-Netzwerken</li>
<li><strong>Stilllegung von OpenStack</strong> (parallel zur Kohortenmigration) —
schrittweise, sobald Kohorten abgeschlossen sind</li>
<li><strong>Support-Subskription</strong> (laufend) — Plus- oder Enterprise-Stufe für
Eskalation rund um die Uhr (siehe <a href="https://aenix.io/de/preise/">Preise</a>)</li>
</ul>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/migration/openstack/">OpenStack-Migrations-Hub</a></strong> — kommerzielle
Landingpage</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/openstack-vs-cozystack-modernisierung/">OpenStack vs Cozystack: Modernisierung</a></strong> —
Analyse des Modernisierungspfads</li>
<li><strong><a href="https://aenix.io/de/alternativen/openstack-alternative/">OpenStack-Alternative</a></strong> —
kommerzielle Landingpage mit Fokus auf Alternativen</li>
<li><strong><a href="https://aenix.io/de/produkte/public-cloud-platform/">Produktseite Public Cloud Platform</a></strong> —
häufiges Zielprodukt für OpenStack-Migrationen von Hosting-Anbietern</li>
</ul>
]]></content:encoded></item><item><title>OpenShift vs Cozystack — Vergleich für Plattformentscheidungen auf Basis von KubeVirt</title><link>https://aenix.io/de/blog/2026/05/openshift-vs-cozystack-vergleich-kubevirt/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/openshift-vs-cozystack-vergleich-kubevirt/</guid><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>OpenShift</category><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><category>Cilium</category><category>LINSTOR</category><description>Zwei KubeVirt-basierte Plattformen im Vergleich: gemeinsame Grundlagen, echte Unterschiede, wann OpenShift vorne liegt und was eine Migration bedeutet.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/openshift-vs-cozystack-vergleich-kubevirt.jpg" alt=""></p><p>OpenShift Virtualization (Red Hat) und Cozystack (Ænix / CNCF-Projekt) sind 2026 die beiden ausgereiftesten Plattformen auf Basis von KubeVirt. Sie teilen architektonische Grundlagen, unterscheiden sich aber im kommerziellen Modell, im betrieblichen Footprint und in der Beziehung zum Hersteller.</p>
<h2 id="gemeinsame-grundlagen">Gemeinsame Grundlagen</h2>
<p>Beide Plattformen betreiben KubeVirt für VM-Workloads neben Kubernetes-Containern. Beide übernehmen die Betriebsmuster von Kubernetes (deklarative Konfiguration, GitOps, RBAC, Observability). Beide unterstützen produktive VM-Workloads mit Live-Migration, Snapshots und Mandantentrennung.</p>
<h2 id="wo-sie-sich-unterscheiden">Wo sie sich unterscheiden</h2>
<h3 id="kommerzielles-modell">Kommerzielles Modell</h3>
<p><strong>OpenShift Virtualization:</strong> kommerzielle Red-Hat-Subscription. Preise pro Core oder pro Sockel. Enthalten sind Red-Hat-Support, Zertifizierung und Zugang zum Ökosystem.</p>
<p><strong>Cozystack:</strong> Open Source unter Apache 2.0. Ænix bietet kommerzielle Support-Stufen an; Sie können die Plattform aber auch ohne kommerzielle Beziehung selbst betreiben.</p>
<p>Für Organisationen, deren Beschaffung auf Red Hat standardisiert ist, ist OpenShift administrativ einfacher. Für Organisationen, die Open Source an erste Stelle setzen oder die Wirtschaftlichkeit eines Service-Providers anstreben, passt Cozystack besser.</p>
<h3 id="betrieblicher-footprint">Betrieblicher Footprint</h3>
<p><strong>OpenShift:</strong> ein breiter Funktionsumfang — OpenShift Container Platform plus Virtualization plus Service Mesh plus Pipelines plus weitere Add-ons. Funktional reichhaltig; das Team braucht OpenShift-spezifisches Know-how.</p>
<p><strong>Cozystack:</strong> ein fokussierter Stack — KubeVirt + Cilium + Kube-OVN + LINSTOR + Cozystack Dashboard + Observability. Ein schlankerer betrieblicher Footprint; allgemeines Kubernetes-Betriebswissen lässt sich direkt übertragen.</p>
<h3 id="mandantenfähigkeit">Mandantenfähigkeit</h3>
<p><strong>OpenShift:</strong> namespacebasiert mit dem Project CRD; RBAC und Quotas greifen auf Namespace-Ebene. Funktioniert für Unternehmen mit mehreren Geschäftsbereichen.</p>
<p><strong>Cozystack:</strong> Tenant CRD mit verschachtelten Tenants, abgegrenztem Audit und abrechnungsfreundlichem Modell. Funktioniert für Service-Provider mit vielen Kunden ebenso wie für Unternehmen mit mehreren Geschäftsbereichen.</p>
<h3 id="beziehung-zum-hersteller">Beziehung zum Hersteller</h3>
<p><strong>OpenShift:</strong> Beziehung zu Red Hat / IBM. Die Roadmap wird von den kommerziellen Entscheidungen von Red Hat bestimmt.</p>
<p><strong>Cozystack:</strong> Open Source unter Community-Governance (CNCF-Projekt). Ænix hat Cozystack entwickelt und gehört zu den Maintainern, neben Maintainern aus anderen Unternehmen; das Projekt gehört Ænix nicht. Die Roadmap wird von der Community und den kommerziellen Anwendern geprägt.</p>
<h3 id="integration-ins-ökosystem">Integration ins Ökosystem</h3>
<p><strong>OpenShift:</strong> integriert sich in das breitere Red-Hat-Ökosystem (Ansible, Satellite, Identity Management usw.).</p>
<p><strong>Cozystack:</strong> integriert sich in das breitere CNCF-Ökosystem (Alternativen zum Prometheus-Stack, Argo, Crossplane usw.).</p>
<h2 id="wann-openshift-vorne-liegt">Wann OpenShift vorne liegt</h2>
<ul>
<li>Bestehende Verpflichtungen gegenüber Red Hat / OpenShift</li>
<li>Unternehmensbeschaffung, die auf Red Hat standardisiert ist</li>
<li>Bedarf an einem integrierten Red-Hat-Ökosystem (Ansible Automation Platform usw.)</li>
<li>Beschaffung, die ausdrücklich einen Red-Hat-Vertrag verlangt</li>
</ul>
<h2 id="wann-cozystack-vorne-liegt">Wann Cozystack vorne liegt</h2>
<ul>
<li>Beschaffung nach dem Prinzip Open Source first</li>
<li>Service-Provider-Modell (Cloud für viele Kunden)</li>
<li>Souveränitäts- oder Regulierungsanforderungen, bei denen Open Source zählt</li>
<li>Kostensensibilität im großen Maßstab (keine Subscription pro Core)</li>
<li>Greenfield ohne bestehende Beziehung zu Red Hat</li>
<li>Bedarf an einem schlankeren betrieblichen Footprint als beim vollständigen OpenShift</li>
<li>SLA-gestützter Support direkt von den Maintainern: veröffentlichte Reaktionszeiten, rund um die Uhr in den Stufen Plus und Enterprise (<a href="https://aenix.io/de/preise/">Preise</a>); die AENIX s.r.o. ist nach <a href="https://aenix.io/de/compliance/iso-27001/">ISO/IEC 27001</a> zertifiziert</li>
</ul>
<h2 id="migration-zwischen-beiden">Migration zwischen beiden</h2>
<p>Beide basieren auf KubeVirt, daher ist die Migration auf VM-Ebene unkompliziert (Kompatibilität auf Image-Ebene). Die architektonischen Unterschiede liegen in:</p>
<ul>
<li>Mandantenmodell (Project CRD vs Tenant CRD)</li>
<li>Networking (OVN-Kubernetes, das das abgekündigte OpenShift SDN abgelöst hat, vs Cilium)</li>
<li>Storage (OpenShift Data Foundation / Ceph vs LINSTOR / DRBD)</li>
<li>Betriebswerkzeugen (OpenShift CLI/Console vs Cozystack Dashboard/Standard-kubectl)</li>
</ul>
<p>Realistischer Zeitrahmen für die Migration: 3–9 Monate für ein mittelgroßes Deployment.</p>
<h2 id="wie-sie-sich-entscheiden">Wie Sie sich entscheiden</h2>
<p>Wenn Ihre Situation zu den Stärken von OpenShift passt (Red-Hat-Ökosystem, Unternehmensbeschaffung, breiter Funktionsumfang), wählen Sie OpenShift Virtualization. Wenn Ihre Situation zu den Stärken von Cozystack passt (Open Source, Service-Provider, schlankerer Footprint), wählen Sie Cozystack.</p>
<p>Für eine konkrete Bewertung hilft die Assessment-Phase des jeweiligen Engagements bei der Klärung. Siehe <strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>.</p>
]]></content:encoded></item><item><title>Nutanix vs Cozystack vs VMware — die Wahl der Virtualisierungsplattform 2026</title><link>https://aenix.io/de/blog/2026/05/nutanix-vs-cozystack-vs-vmware-virtualisierungsplattform/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/nutanix-vs-cozystack-vs-vmware-virtualisierungsplattform/</guid><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>Nutanix</category><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><category>Cilium</category><description>Nutanix HCI mit AHV, VMware nach Broadcom und Cozystack im Vergleich: Architektur, Stärken der Plattformen und die Wirtschaftlichkeit von Migrationen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/nutanix-vs-cozystack-vs-vmware-virtualisierungsplattform.jpg" alt=""></p><p>2026 umfasst die realistische Shortlist für produktive Virtualisierungsplattformen (neben anderen) Nutanix AHV, VMware Cloud Foundation und Cozystack. Jede dieser Plattformen steht für eine andere Architekturphilosophie.</p>
<h2 id="architekturphilosophien">Architekturphilosophien</h2>
<p><strong>Nutanix:</strong> herstellergeführte, integrierte HCI-Appliance. Betriebliche Einfachheit und integrierter Support bilden das Kernversprechen.</p>
<p><strong>VMware:</strong> ausgereifter Legacy-Stack mit tiefer Ökosystem-Integration. Vom Hersteller gesteuerte Roadmap; Subscription-getriebene Ökonomie.</p>
<p><strong>Cozystack:</strong> Kubernetes-native Open-Source-Plattform. Vom Kunden kontrollierte Architektur; von der Community gesteuerte Roadmap.</p>
<h2 id="detaillierter-vergleich">Detaillierter Vergleich</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Nutanix AHV</th>
          <th>VMware (VCF)</th>
          <th>Cozystack</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Lizenz</strong></td>
          <td>Subscription</td>
          <td>Nur Subscription</td>
          <td>Apache 2.0</td>
      </tr>
      <tr>
          <td><strong>Open Source</strong></td>
          <td>Nein</td>
          <td>Nein</td>
          <td>Vollständig</td>
      </tr>
      <tr>
          <td><strong>Fundament</strong></td>
          <td>Proprietäres KVM (AHV)</td>
          <td>vSphere/ESXi</td>
          <td>KubeVirt auf Kubernetes</td>
      </tr>
      <tr>
          <td><strong>Mandantenfähigkeit</strong></td>
          <td>Eingeschränkt</td>
          <td>vCloud Director</td>
          <td>Tenant CRD</td>
      </tr>
      <tr>
          <td><strong>Storage</strong></td>
          <td>Verteilt (proprietär)</td>
          <td>vSAN</td>
          <td>LINSTOR (DRBD)</td>
      </tr>
      <tr>
          <td><strong>Netzwerk</strong></td>
          <td>AHV-Networking</td>
          <td>NSX</td>
          <td>Cilium</td>
      </tr>
      <tr>
          <td><strong>Container</strong></td>
          <td>NKP (separat)</td>
          <td>Tanzu (separat)</td>
          <td>Nativ</td>
      </tr>
      <tr>
          <td><strong>Hardware</strong></td>
          <td>Nutanix NX oder zertifizierte OEM-Hardware (Dell, HPE, Lenovo u. a.)</td>
          <td>x86</td>
          <td>Handelsübliches x86</td>
      </tr>
      <tr>
          <td><strong>Am besten für</strong></td>
          <td>HCI-orientierte Unternehmen</td>
          <td>Bestehende VMware-Umgebungen</td>
          <td>Service-Provider + souveräne Cloud</td>
      </tr>
  </tbody>
</table>
<h2 id="wann-welche-plattform-gewinnt">Wann welche Plattform gewinnt</h2>
<h3 id="nutanix-gewinnt">Nutanix gewinnt</h3>
<ul>
<li>Bei bestehender Nutanix-HCI-Investition mit betrieblicher Expertise</li>
<li>Bei klarer Präferenz für eine integrierte Appliance mit kommerziellem Support</li>
<li>Bei einem rein VM-basierten Workload-Portfolio</li>
<li>Bei mittelgroßen Unternehmen mit integrierter Beschaffung</li>
</ul>
<h3 id="vmware-gewinnt">VMware gewinnt</h3>
<ul>
<li>Bei bestehenden VMware-Umgebungen, in denen die Verlängerungskosten noch tragbar sind</li>
<li>Bei tiefer vSphere-Expertise, die sich nur schwer übertragen lässt</li>
<li>Bei bestimmten Funktionen, die es nur bei VMware gibt (einige Nischen im fortgeschrittenen Networking und Storage)</li>
<li>(Wegen der Broadcom-Preispolitik 2026 zunehmend selten)</li>
</ul>
<h3 id="cozystack-gewinnt">Cozystack gewinnt</h3>
<ul>
<li>Beim Modell als Service-Provider oder Multi-Tenant-Cloud-Builder</li>
<li>Bei Anforderungen an Souveränität oder durch die Aufsicht</li>
<li>Bei einer Präferenz für Open-Source-Beschaffung</li>
<li>Bei gemischten VM- und Container-Workloads auf einer Plattform</li>
<li>Bei KI/GPU im großen Maßstab mit Kubernetes-nativen Werkzeugen</li>
</ul>
<h2 id="wirtschaftlichkeit-der-migration">Wirtschaftlichkeit der Migration</h2>
<p>Ein Wechsel zwischen diesen Plattformen ist nicht umsonst. Realistische Aufwandsschätzungen:</p>
<ul>
<li><strong>VMware → Cozystack:</strong> rund 8–12 Monate für einen Bestand von ~100 VMs und 18–24 Monate für ~1.000 VMs, einschließlich Planung und Migrationswellen; Assessment (14 oder 28 Tage) + Aufbau der Zielplattform + Kohortenmigration. Typischerweise ab dem zweiten Jahr wirtschaftlich positiv.</li>
<li><strong>VMware → Nutanix:</strong> ähnlicher Zeitrahmen; nutzt das Werkzeug Nutanix Move.</li>
<li><strong>Nutanix → Cozystack:</strong> Migration des gesamten Bestands typischerweise 9–18 Monate, je nach Umfang; die Kompatibilität der KVM-Images hilft.</li>
<li><strong>Cozystack → VMware/Nutanix:</strong> 2026 selten (Rückmigration).</li>
</ul>
<h2 id="so-treffen-sie-die-entscheidung">So treffen Sie die Entscheidung</h2>
<p>Der Entscheidungsbaum:</p>
<ol>
<li><strong>Bestehende Plattform mit tiefer Expertise, und die Wirtschaftlichkeit stimmt noch?</strong> → Bleiben.</li>
<li><strong>Multi-Tenant- oder Service-Provider-Modell?</strong> → Cozystack.</li>
<li><strong>Souveränität / Open-Source-first-Beschaffung?</strong> → Cozystack.</li>
<li><strong>Präferenz für HCI-Appliances + Nutanix-Beziehung?</strong> → Nutanix.</li>
<li><strong>VMware-Umgebung ohne Anlass zum Wechsel?</strong> → VMware (mit Blick auf die nächste Verlängerung).</li>
<li><strong>Greenfield + Team mit Kubernetes-Erfahrung?</strong> → Cozystack.</li>
</ol>
]]></content:encoded></item><item><title>Industrie-4.0-Plattform — Cloud- und Edge-Architektur für die Fertigung 2026</title><link>https://aenix.io/de/blog/2026/05/industrie-4-0-plattform-cloud-edge-fertigung/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/industrie-4-0-plattform-cloud-edge-fertigung/</guid><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>NIS2</category><category>Cozystack</category><category>Sovereignty</category><category>AI and ML</category><category>Compliance</category><description>Industrie-4.0-Architektur 2026: Muster von der Edge bis zum Core, Souveränität für Industrie-IP und die NIS2-Pflichten, unter die Hersteller jetzt fallen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/industrie-4-0-plattform-cloud-edge-fertigung.jpg" alt=""></p><h2 id="was-industrie-40-im-jahr-2026-tatsächlich-bedeutet">Was Industrie 4.0 im Jahr 2026 tatsächlich bedeutet</h2>
<p>Der Begriff ist mit viel Marketing aufgeladen. Praktisch bedeutet Fertigung nach Industrie 4.0:</p>
<ul>
<li>IoT-Instrumentierung in den Fertigungshallen</li>
<li>Echtzeit-Datenerfassung an den Maschinen</li>
<li>KI-gestützte Qualitätskontrolle und Predictive Maintenance</li>
<li>Digitale Zwillinge von Produktionslinien</li>
<li>Systemübergreifende Integration der Lieferkette</li>
<li>OT/IT-Konvergenz</li>
</ul>
<p>All das erfordert Infrastruktur — typischerweise eine Mischung aus Edge Compute (nah an den Maschinen), einer regionalen bzw. zentralen Cloud (für Analytics, ML und Integration) und der Anbindung an bestehende Unternehmenssysteme.</p>
<h2 id="architekturmuster">Architekturmuster</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">HQ Cloud (Cozystack)
</span></span><span class="line"><span class="cl">   ├── Analytics platform
</span></span><span class="line"><span class="cl">   ├── ML training
</span></span><span class="line"><span class="cl">   ├── Enterprise integration
</span></span><span class="line"><span class="cl">   └── Data warehouse
</span></span><span class="line"><span class="cl">        ↓ (data flow)
</span></span><span class="line"><span class="cl">Regional sites (Cozystack)
</span></span><span class="line"><span class="cl">   ├── Regional aggregation
</span></span><span class="line"><span class="cl">   ├── Production planning
</span></span><span class="line"><span class="cl">   └── Quality systems
</span></span><span class="line"><span class="cl">        ↓
</span></span><span class="line"><span class="cl">Production-floor edge (Cozystack)
</span></span><span class="line"><span class="cl">   ├── Real-time control
</span></span><span class="line"><span class="cl">   ├── IoT data ingestion
</span></span><span class="line"><span class="cl">   ├── Local AI inference
</span></span><span class="line"><span class="cl">   └── OT/IT interface
</span></span></code></pre></div><p>Cozystack läuft auf allen drei Ebenen mit einem einheitlichen Betriebsmodell.</p>
<h2 id="souveränität-für-industrie-ip">Souveränität für Industrie-IP</h2>
<p>Industrie-IP — Konstruktionsdaten, Rezepturen, Prozessspezifikationen — stellt höhere Anforderungen an die Souveränität als typische Unternehmensdaten. Die architektonische Antwort ist eine Air-Gap-fähige Plattform mit optionaler Volume-Verschlüsselung, deren Passphrase das Unternehmen selbst verwaltet.</p>
<h2 id="nis2-compliance">NIS2-Compliance</h2>
<p>Die Herstellung kritischer Produkte (Medizinprodukte, Computer, elektronische Geräte, Maschinen, Kraftfahrzeuge) fällt in den Anwendungsbereich von NIS2. Die architektonischen Folgen sind dieselben wie bei NIS2 allgemein — siehe <strong><a href="https://aenix.io/de/loesungen/nis2-compliance/">NIS2-Compliance</a></strong>.</p>
]]></content:encoded></item><item><title>Ein Cloud-Produkt für Kunden starten — Playbook für Hosting-Anbieter, Telcos und regionale Betreiber</title><link>https://aenix.io/de/blog/2026/05/cloud-produkt-starten-playbook-hosting-anbieter/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/cloud-produkt-starten-playbook-hosting-anbieter/</guid><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>Kubernetes</category><category>Sovereignty</category><category>AI and ML</category><category>Multi-tenancy</category><category>Hosting</category><description>Die sechs Schichten eines Cloud-Produkts für Endkunden, die Architekturentscheidungen einer Public Cloud und woran der Markteintritt kommerziell scheitert.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cloud-produkt-starten-playbook-hosting-anbieter.jpg" alt=""></p><p>Regionale und spezialisierte Clouds erleben 2026 einen Aufschwung. Die Ökonomie der Hyperscaler, der Druck in Richtung Souveränität und die Marktdynamik nach der Broadcom-Übernahme haben Raum für Cloud-Produkte jenseits der Hyperscaler geschaffen, deren Start vor fünf Jahren noch keinen Sinn ergeben hätte. Sichtbare Beispiele sind souveräne Cloud-Produkte regionaler Anbieter in der EU, in Zentralasien und im MENA-Raum. Viele weitere befinden sich noch im Stealth-Modus oder in einem frühen Stadium.</p>
<h2 id="warum-gerade-jetzt">Warum gerade jetzt</h2>
<p>Drei voneinander unabhängige Entwicklungen begünstigen den Start neuer Cloud-Produkte:</p>
<p><strong>Die Hyperscaler-Ökonomie trägt für manche Workloads nicht mehr.</strong> Dauerhafte Inference, Workloads mit hohem Egress und regulierte Workloads werden auf Hyperscalern im Vergleich zu dedizierter Infrastruktur immer teurer. Eine regionale Cloud, die genau diese Workloads bedient, hat Vorteile bei den Stückkosten.</p>
<p><strong>Souveränität als Wettbewerbsvorteil.</strong> EU-Mitgliedstaaten, Kasachstan und mehrere Rechtsräume im APAC-Raum haben ausdrückliche Vorgaben für souveräne Clouds. Regionale Anbieter, die diese Vorgaben erfüllen, verfügen über einen regulatorischen Burggraben, zu dem Hyperscaler keinen Zugang haben.</p>
<p><strong>Umbruch am Virtualisierungsmarkt nach Broadcom.</strong> Workloads, die im Zuge des VMware-Ausstiegs umziehen, müssen irgendwo landen; regionale Anbieter können einen Teil davon aufnehmen, sofern sie das richtige Produkt liefern.</p>
<h2 id="die-sechs-schichten-eines-cloud-produkts">Die sechs Schichten eines Cloud-Produkts</h2>
<p>Ein funktionierendes Cloud-Produkt für Endkunden besteht aus sechs Schichten, und jede davon erfordert Engineering:</p>
<h3 id="1-hardware">1. Hardware</h3>
<p>Compute-Server, Storage, Netzwerk-Fabric, Rechenzentrum / Colocation. Dimensioniert für die erste Kundenkohorte plus Reserven für Wachstum.</p>
<h3 id="2-plattform">2. Plattform</h3>
<p>Eine mandantenfähige, Kubernetes-native Plattform mit KubeVirt für VMs, Cilium und Kube-OVN für das Networking sowie LINSTOR (per DRBD replizierter Block Storage) für Storage. Cozystack ist die Open-Source-Standardlösung für dieses Muster.</p>
<h3 id="3-servicekatalog">3. Servicekatalog</h3>
<p>Was Kunden selbst bereitstellen können: VMs, K8s-Cluster, verwaltete Datenbanken (PostgreSQL, MariaDB, MongoDB, Redis, Valkey, Kafka, ClickHouse, OpenSearch usw.), S3-Buckets, GPU-Instanzen, Netzwerk-Grundbausteine.</p>
<h3 id="4-kundenportal">4. Kundenportal</h3>
<p>Self-Service-Oberfläche (Cozystack Dashboard oder eine Eigenentwicklung). Katalog durchsuchen, Ressourcen bereitstellen, Monitoring, Transparenz über die Abrechnung.</p>
<h3 id="5-abrechnung">5. Abrechnung</h3>
<p>Produktionsreife WHMCS-Integration in zwei Modi — von Ænix als <a href="https://aenix.io/de/produkte/whmcs-integration/">WHMCS-Integration</a> ausgeliefert und nicht als Teil des Open-Source-Projekts Cozystack. Individuelle Abrechnungslösungen für bestimmte Märkte.</p>
<h3 id="6-betrieb">6. Betrieb</h3>
<p>NOC rund um die Uhr, Kundensupport, SLA-Management, Observability pro Tenant, Incident Response.</p>
<h2 id="architekturentscheidungen-die-für-public-cloud-produkte-spezifisch-sind">Architekturentscheidungen, die für Public-Cloud-Produkte spezifisch sind</h2>
<p>Ein Public-Cloud-Produkt unterscheidet sich architektonisch in mehreren Punkten von einer internen Plattform:</p>
<p><strong>Die Mandantentrennung muss strikt sein.</strong> Kunden vertrauen einander nicht, und regulatorische Audits finden tatsächlich statt. Das Tenant-CRD-Muster mit starker Isolation ist notwendig, nicht optional.</p>
<p><strong>Der Self-Service muss ausgereift sein.</strong> Interne Plattformen können „Fragen Sie das Plattform-Team“ als Notausgang haben. Produkte für Endkunden können das nicht.</p>
<p><strong>Die Abrechnung muss vom ersten Tag an stimmen.</strong> Kunden werden die erste Rechnung anfechten; das System muss dieses Gespräch tragen können.</p>
<p><strong>Observability für Kunden, nicht nur für den Betrieb.</strong> Kunden wollen ihre eigenen Metriken sehen, nicht nur SLA-Daten.</p>
<p><strong>Die Compliance-Ausrichtung ist das Produkt.</strong> Souveränität, Datenresidenz und Audit-Fähigkeit sind Differenzierungsmerkmale, keine nachträglichen Ergänzungen.</p>
<h2 id="reihenfolge-beim-markteintritt">Reihenfolge beim Markteintritt</h2>
<p>Starten Sie in Kohorten:</p>
<ol>
<li><strong>Beta mit 3–5 wohlgesonnenen Kunden</strong> — beheben Sie die Ecken und Kanten, bevor zahlende Kunden sie zu sehen bekommen.</li>
<li><strong>Eingeschränkte GA mit 10–50 Kunden</strong> — lernen Sie die Muster bei Abrechnung und Support im kleinen Maßstab kennen.</li>
<li><strong>General Availability</strong> — Öffnung für den breiten Markt.</li>
<li><strong>Spezialisierte Erweiterung</strong> — ergänzen Sie gezielte Services (weitere GPU-Klassen, AI-Services usw.) auf Basis der beobachteten Nachfrage.</li>
</ol>
<p>Zeitrahmen: Die Plattform selbst ist mit dem produktisierten Installer wenige Wochen nach Bereitstellung der Hardware live. Wie schnell danach die General Availability folgt, bestimmen Beta, eingeschränkte GA und Ihre Bereitschaft in Vertrieb und Betrieb. Programme im Betreibermaßstab mit mehreren Regionen rechnen mit 3–6 Monaten Pilot und danach 9–18 Monaten bis zum vollen Multi-Region-Betrieb.</p>
<h2 id="woran-der-markteintritt-scheitert">Woran der Markteintritt scheitert</h2>
<h3 id="stolperstein-1-unzureichend-ausgebaute-mandantenfähigkeit">Stolperstein 1: unzureichend ausgebaute Mandantenfähigkeit</h3>
<p>„Die richtige Isolation bauen wir in v2 ein.“ Kunde Nr. 1 findet die Lücke; von dem Reputationsschaden erholt man sich nur schwer.</p>
<h3 id="stolperstein-2-abrechnung-als-nachgedanke">Stolperstein 2: Abrechnung als Nachgedanke</h3>
<p>Die Abrechnungsintegration kommt im letzten Monat vor dem Launch. Sie funktioniert nicht, Kunden zahlen nicht, und das Eintreiben der Umsätze wird zum Projekt über mehrere Quartale.</p>
<h3 id="stolperstein-3-zu-geringe-investition-in-den-betrieb">Stolperstein 3: zu geringe Investition in den Betrieb</h3>
<p>Die Plattform steht, das Betriebsteam ist für 50 Kunden ausgelegt — und im ersten Quartal unterschreiben 200. Die Servicequalität bricht ein.</p>
<h3 id="stolperstein-4-hyperscaler-architektur-eins-zu-eins-kopieren">Stolperstein 4: Hyperscaler-Architektur eins zu eins kopieren</h3>
<p>Für Hyperscaler-Maßstab entworfen, für die tatsächliche Kundenzahl überdimensioniert. Die betriebliche Komplexität übersteigt den Umsatz.</p>
<h3 id="stolperstein-5-austauschbares-standardangebot">Stolperstein 5: austauschbares Standardangebot</h3>
<p>Ein generisches Cloud-Produkt ohne Abgrenzung zum Hyperscaler. Kunden greifen dann standardmäßig zu AWS / Azure / GCP. Spezialisierung, Souveränität und Regionalität zählen als Unterscheidungsmerkmal.</p>
<h2 id="das-ænix-engagement">Das Ænix-Engagement</h2>
<p>Ænix hat Cloud-Produkte für Endkunden durchgängig auf Cozystack aufgebaut, für Hosting-Anbieter und regionale Cloud-Betreiber. Aufbau des Engagements:</p>
<ul>
<li><strong>Platform Readiness Assessment</strong> (14 oder 28 Tage, Festpreis) — inklusive Produktreife</li>
<li><strong>Aufbau</strong> — Plattform über den Installer in Wochen live; danach Portal, Abrechnung, Betriebsabläufe und Onboarding der ersten Kohorte (im Betreibermaßstab: 3–6 Monate Pilot, dann 9–18 Monate bis zum vollen Multi-Region-Betrieb)</li>
<li><strong>Phase 3 (optional)</strong> — Managed Services während der Hochlaufphase</li>
</ul>
<p>Details finden Sie auf der <strong><a href="https://aenix.io/de/dienstleistungen/public-cloud-builder/">Seite zu unseren Public-Cloud-Builder-Services</a></strong>.</p>
]]></content:encoded></item><item><title>Wirtschaftlichkeit der Public Cloud Platform — wann sich ein eigenes Cloud-Produkt für Hosting-Anbieter rechnet</title><link>https://aenix.io/de/blog/2026/05/public-cloud-platform-wirtschaftlichkeit-hosting-anbieter/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/public-cloud-platform-wirtschaftlichkeit-hosting-anbieter/</guid><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Hosting</category><category>Cozystack</category><category>Multi-tenancy</category><category>Platform Engineering</category><category>Cloud</category><description>Unit Economics der Ænix Public Cloud Platform für Hosting-Anbieter: ARPU, Infrastrukturkosten pro Tenant, Kapazität des Plattformteams, Amortisation, Grenzen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/public-cloud-platform-wirtschaftlichkeit-hosting-anbieter.jpg" alt=""></p><p>Die meisten Diskussionen bei Hosting-Anbietern zur Frage „Sollen wir
ein eigenes Cloud-Produkt bauen?“ enden bei der Technologie. Die
schwierigere Frage sind die Unit Economics: Was kostet ein Tenant, was
ist ein realistischer ARPU, wie viele Tenants braucht es bis zum
Break-even, und wo versagt das Modell?</p>
<p>Dieser Artikel ist die Arbeitsfassung dieser Diskussion. Er setzt
voraus, dass die Technologieentscheidung gefallen ist (die
Cozystack-basierte Ænix Public Cloud Platform), und konzentriert sich
darauf, ob die Wirtschaftlichkeit zu <em>Ihrem</em> Hosting-Geschäft passt —
nicht zu einem abstrakten.</p>
<h2 id="was-die-public-cloud-platform-tatsächlich-liefert">Was die Public Cloud Platform tatsächlich liefert</h2>
<p>Vor der Wirtschaftlichkeit der Umfang. Die Public Cloud Platform ist ein
komplettes Public-Cloud-Produkt für Hosting-Anbieter, das Ænix an
Hosting-Anbieter, MSPs, regionale Clouds sowie kleine und mittlere
Rechenzentren verkauft. Sie umfasst:</p>
<ul>
<li><strong>Eine mandantenfähige Cozystack-Plattform</strong> auf Bare Metal unter
Kontrolle des Kunden (KubeVirt + Cilium + Kube-OVN + LINSTOR +
Tenant CRD).</li>
<li><strong>Cozystack Dashboard</strong> — ein Self-Service-Portal für Ihre Kunden, das
sich an Ihre Hosting-Marke anpassen lässt.</li>
<li><strong>WHMCS-Integration</strong> — die Abrechnung läuft über das
Kundenverwaltungssystem, das die meisten Hosting-Anbieter ohnehin
betreiben.</li>
<li><strong>Servicekatalog</strong> — VMs, Tenant-Kubernetes-Cluster,
Managed-Datenbanken (PostgreSQL, MariaDB, MongoDB, Redis, Valkey,
Kafka, ClickHouse usw.), S3-kompatibler Object Storage, GPU-Dienste.
Pro Provider kuratierbar.</li>
<li><strong>Sperren / Suspendieren von Tenants</strong> — betriebliche Hooks für
Zahlungsausfälle und die Durchsetzung von Richtlinien.</li>
<li><strong>Migrations-Tooling</strong> — produktisierte Muster für die Quellen VMware,
OpenStack, Virtuozzo und Proxmox.</li>
</ul>
<p>Was sie <em>nicht</em> ist: ein Hyperscaler. Sie ist ein souveränes,
mandantenfähiges Cloud-Produkt für Hosting-Anbieter, die über regionale
Präsenz, Souveränität und Preisflexibilität konkurrieren wollen — nicht
über die Katalogtiefe eines Hyperscalers.</p>
<h2 id="preismodell">Preismodell</h2>
<p>Subskriptionen der Public Cloud Platform nutzen die veröffentlichten
Support-Stufen, berechnet pro 10 physische Nodes und Monat bei
jährlicher Abrechnung: <strong>Basic 1.250 $</strong>, <strong>Standard 3.000 $</strong>,
<strong>Plus 5.500 $</strong>; Enterprise wird individuell angeboten. Höhere Stufen
bringen kürzere Reaktionszeiten, unbegrenzte Incidents, Support rund um
die Uhr (Plus und Enterprise) und einen breiteren Supportumfang — die
vollständige Übersicht steht auf der <a href="https://aenix.io/de/preise/">Preisseite</a>. Jede Support-Stufe enthält die proprietären kommerziellen Ænix-Module (Billing-System und WHMCS-Integration). Ænix rechnet nicht pro VM, pro CPU oder pro GB
ab — die Cozystack-Plattform selbst ist unter Apache 2.0 kostenlos;
bezahlt werden Projektarbeit, Support und betriebliche Absicherung.</p>
<p>Für einen typischen mittelgroßen Hosting-Anbieter mit 30–100 Nodes im
Kundenbetrieb sind das zum Listenpreis 3.750–12.500 $/Monat in der
Basic-Stufe oder 9.000–30.000 $/Monat in der Standard-Stufe. Vergleichen
Sie das mit den wiederkehrenden Lizenz- und Subskriptionskosten, die Sie
heute an VMware oder an einen Anbieter von OpenStack-Distributionen zahlen.</p>
<h2 id="unit-economics--die-sicht-pro-tenant">Unit Economics — die Sicht pro Tenant</h2>
<p>Die Frage, die jeder CFO eines Hosting-Anbieters stellt: <em>Was kostet es
uns, einen Tenant zu bedienen, und was können wir realistisch dafür
verlangen?</em></p>
<h3 id="kosten-pro-tenant">Kosten pro Tenant</h3>
<p>Die Infrastrukturkosten pro Tenant werden von Compute, Storage und
Bandbreite darunter bestimmt, nicht von Cozystack selbst. Der Overhead
von Cozystack liegt bei ~5–10 % der Node-Kapazität (typischer Overhead
einer Kubernetes-Plattform, für die Produktion gut vertretbar). Für einen
Tenant mit ungefähr folgendem Verbrauch:</p>
<ul>
<li>2 vCPU</li>
<li>4 GB RAM</li>
<li>50 GB Blockspeicher (3-fach repliziert)</li>
<li>100 GB Egress pro Monat</li>
</ul>
<p>liegen die direkten Infrastrukturkosten (abgeschriebene Hardware +
Colocation + Bandbreite) nach europäischem Preisniveau 2026 typischerweise
bei 15–30 €/Monat. Die anteiligen Kosten der Cozystack-Plattform (das
Gehalt des Plattformteams, verteilt auf alle Tenants) kommen bei einem
mittelgroßen Provider mit 500 Tenants mit weiteren 5–10 € hinzu.</p>
<p>Damit liegen die <strong>Gesamtkosten pro typischem Tenant bei 20–40 €/Monat</strong>
am unteren Ende des Ressourcenverbrauchs.</p>
<h3 id="was-sie-verlangen-können">Was Sie verlangen können</h3>
<p>Der ARPU von Hosting-Anbietern für ein vergleichbares Ressourcenprofil
liegt 2026 in EU-Märkten typischerweise bei 40–80 €/Monat. Höher in der
DACH-Region und in Westeuropa, niedriger in Mittel- und Osteuropa sowie
in Zentralasien. Mit Managed Services (Managed PostgreSQL, Managed S3,
GPU-Zugang) steigt der ARPU auf 80–200+ €/Monat pro Tenant.</p>
<p>Damit liegt die Marge am unteren Ende bei etwa <strong>dem 2- bis 3-Fachen der
Kosten</strong>, bei Tenants mit vielen Managed Services bei <strong>dem 4- bis
6-Fachen</strong>. Keine Hyperscaler-Margen, aber auch keine Margen eines
VMware-Resellers. Eher klassische Hosting-Margen in der Realität von
2026 nach Broadcom.</p>
<h2 id="break-even-rechnung">Break-even-Rechnung</h2>
<p>Die andere Frage des CFO: <em>Wie viele Kunden brauchen wir, bis wir Geld
verdienen?</em></p>
<p>Die Fixkosten eines mittelgroßen Hosting-Anbieters auf der Public Cloud
Platform:</p>
<table>
  <thead>
      <tr>
          <th>Posten</th>
          <th>Monatlich</th>
          <th>Jährlich</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Ænix-Support (Standard-Stufe, 50 Nodes = 5 × 3.000 $)</td>
          <td>15 Tsd. $</td>
          <td>180 Tsd. $</td>
      </tr>
      <tr>
          <td>Platform-Engineering-Team (3–5 VZÄ)</td>
          <td>20–35 Tsd. €</td>
          <td>240–420 Tsd. €</td>
      </tr>
      <tr>
          <td>Abschreibung der Hardware (50 Nodes)</td>
          <td>5–8 Tsd. €</td>
          <td>60–100 Tsd. €</td>
      </tr>
      <tr>
          <td>Colocation / Strom / Bandbreite</td>
          <td>4–7 Tsd. €</td>
          <td>50–85 Tsd. €</td>
      </tr>
      <tr>
          <td>Kundensupport-Team (2–4 VZÄ für die Cloud)</td>
          <td>10–20 Tsd. €</td>
          <td>120–240 Tsd. €</td>
      </tr>
      <tr>
          <td>Marketing / Vertrieb</td>
          <td>5–15 Tsd. €</td>
          <td>60–180 Tsd. €</td>
      </tr>
  </tbody>
</table>
<p><strong>Fixkosten gesamt pro Monat: 44–85 Tsd. € plus 15 Tsd. $ für den Ænix-Support.</strong></p>
<p>Die Tabelle rechnet mit einem vollständigen eigenen Team für Produkt,
Plattform und Kundensupport. Der reine Plattformbetrieb ist kleiner: Der
<a href="https://aenix.io/isp-calculator/">ISP-Rechner</a> setzt dafür etwa 1,3 Vollzeit-Engineers
bei 10 Nodes und etwa 2,6 bei 40 Nodes an.</p>
<p>Bei 25–50 €/Monat Marge pro Tenant (40–80 € ARPU nach 15–30 € direkten
Infrastrukturkosten) liegt der Break-even je nach ARPU-Mix und Gehaltsniveau
bei <strong>etwa 1.200–4.000 zahlenden Tenants</strong>. Das ist der Fall eines
vollständigen Programms mit eigenem Team; ein Start mit 10 Nodes in der
Basic-Stufe und vorhandenem Personal erreicht den Break-even deutlich
früher — rechnen Sie Ihre eigenen Zahlen im <a href="https://aenix.io/isp-calculator/">ISP-Rechner</a> durch.</p>
<p>Für Provider, die heute ~500 Kunden auf Legacy-Infrastruktur betreiben
und den Wechsel prüfen, ist das entscheidend: Sie brauchen einen
glaubwürdigen Weg, die Zahl der Tenants innerhalb von 18–24 Monaten
mindestens zu verdoppeln, damit die Rechnung tatsächlich aufgeht. Ohne Wachstum ist
die Public Cloud Platform eine (moderate) Kostensenkung, aber keine
Transformation.</p>
<p>Für Provider mit weniger als ~300 Kunden ist ein vollständiges Programm
mit eigenem Plattformteam von 3–5 Personen oft <em>verfrüht</em> — diese
Fixkosten erdrücken den Deckungsbeitrag. Ein kleinerer Start (10 Nodes in
der Basic-Stufe, ein schmaler Katalog, vorhandenes Personal) ist meist der
bessere erste Schritt. Das sagen wir im Discovery Call offen, statt ein
größeres Projekt voranzutreiben.</p>
<h2 id="wo-das-modell-versagt">Wo das Modell versagt</h2>
<p>Drei Fehlermuster wiederholen sich:</p>
<h3 id="1-zu-geringe-investitionen-in-das-kundenportal">1. Zu geringe Investitionen in das Kundenportal</h3>
<p>Hosting-Anbieter konkurrieren traditionell über Preis und
Zuverlässigkeit. Das Cozystack Dashboard ist ab Werk funktional, aber
generisch; Differenzierung entsteht durch Feinschliff (UX-Abläufe, die
dazu passen, wie <em>Ihre</em> Kunden bestellen, konfigurieren und bezahlen).
Provider, die das Portal als „gut genug“ behandeln, verlieren Conversion
an Provider, die darin investieren.</p>
<p>Das Ænix-Projekt umfasst die Anpassung des Cozystack Dashboards an Ihre
Marke; tiefere UX-Arbeit ist in der Regel eine separate Phase 2.</p>
<h3 id="2-servicekatalog-passt-nicht-zum-kundenstamm">2. Servicekatalog passt nicht zum Kundenstamm</h3>
<p>Cozystack bietet 20+ Managed Services; nicht alle passen zum
Kundenstamm jedes Providers. Wer alle anbietet, ohne sie betrieblich
abzusichern, erlebt Kunden, die Kafka oder ClickHouse bestellen und
feststellen, dass der Provider sie nicht wirklich unterstützen kann.
Kuratieren Sie den Katalog auf das, was Sie mit dem versprochenen SLA
tatsächlich betreiben können. Die Einführung der Dienste in Kohorten ist
das Standardvorgehen.</p>
<h3 id="3-ein-betriebsteam-das-für-das-wachstum-unterbesetzt-ist">3. Ein Betriebsteam, das für das Wachstum unterbesetzt ist</h3>
<p>Das größte einzelne Fehlermuster in unserer Pipeline: Die Public Cloud
Platform ist ausgerollt, startet erfolgreich, gewinnt im ersten Quartal
200 Kunden — und dann skaliert das Betriebsteam mit 4 Personen, das bei
50 Kunden funktioniert hat, nicht mehr. Die Reaktionszeiten im
Kundensupport verschlechtern sich, SLA-Verletzungen häufen sich, die
Abwanderung steigt.</p>
<p>Planen Sie die Größe des Betriebsteams für die Kundenzahl in 18 Monaten,
nicht für die heutige. Stellen Sie vorausschauend ein.</p>
<h2 id="die-public-cloud-platform-im-vergleich-zu-den-alternativen-für-hosting-anbieter">Die Public Cloud Platform im Vergleich zu den Alternativen für Hosting-Anbieter</h2>
<p><strong>Im Vergleich zu VMware Cloud Director (vCD):</strong></p>
<p>vCD ist der historisch etablierte Platzhirsch bei Hosting-Anbietern.
Nach Broadcom hat die Abo-Preisgestaltung die Rechnung verändert —
Steigerungen um das 2- bis 5-Fache bei der Verlängerung, verpflichtende
VCF-Bündelung, Ende der Dauerlizenzen. Für die meisten Provider, die
heute vCD betreiben, ist der Verlängerungszyklus der Auslöser. Die Ænix
Public Cloud Platform ist wenige Wochen nach Bereitstellung der Hardware
live; der Umzug eines bestehenden vCD-Bestands ist ein eigenes
Migrationsprojekt, dessen Umfang das Assessment je nach Bestand festlegt.</p>
<p><strong>Im Vergleich zu OpenStack:</strong></p>
<p>OpenStack bleibt eine valide Option für Provider mit tiefer
OpenStack-Expertise und großen Deployments (&gt;500 Nodes), bei denen sich
die betriebliche Komplexität amortisiert. Für mittelgroße Provider
übersteigt der betriebliche Footprint von OpenStack (50+ Dienste, eigene
Upgrade-Lebenszyklen pro Komponente), was das Team stemmen kann. Die
Public Cloud Platform hat eine deutlich kleinere Betriebsfläche.</p>
<p><strong>Im Vergleich zum Eigenbau auf Vanilla Kubernetes + KubeVirt + Helm:</strong></p>
<p>Das ist die glaubwürdige Alternative für Provider mit starker
Platform-Engineering-Kapazität. Der Preis: 12–24 Monate Bauzeit plus
laufende Wartung gegenüber einem schlüsselfertigen Deployment. Wir haben
beides funktionieren sehen; der Eigenbau ist die richtige Wahl, wenn Sie
ein Plattformteam mit 10+ Engineers haben und die Komponenten Ihren
konkreten betrieblichen Vorlieben entsprechen. Für den typischen
mittelgroßen Provider mit einem Plattformteam von 3–5 Engineers gewinnt
die Public Cloud Platform bei Time-to-Market und betrieblicher
Planbarkeit.</p>
<p><strong>Im Vergleich zu einem hyperscaler-verwalteten Cloud-Produkt (White Label):</strong></p>
<p>Hyperscaler (AWS, Azure, GCP) bieten Hosting-Partnern mitunter
White-Label- oder Co-Branding-Modelle für Cloud-Angebote an. Der Preis:
geringere betriebliche Komplexität für den Provider, aber in der Regel
eine niedrigere Marge pro Kunde und eine schwächere
Souveränitätspositionierung (der Provider bleibt vom Hyperscaler
abhängig, was europäische Kunden zunehmend als strukturelles Risiko
sehen).</p>
<h2 id="wann-die-public-cloud-platform-die-richtige-antwort-ist">Wann die Public Cloud Platform die richtige Antwort ist</h2>
<p>Sie passt, wenn mindestens drei der folgenden Punkte zutreffen:</p>
<ol>
<li><strong>Sie betreiben heute Bare Metal oder einen kommerziellen Hypervisor
mit wiederkehrendem Lizenzdruck</strong> — VMware, OpenStack, Virtuozzo oder
eine kommerzielle KVM-Distribution.</li>
<li><strong>Sie haben direkte Kundenbeziehungen, die Sie monetarisieren
können</strong> — Sie sind nicht nur Wiederverkäufer der Cloud eines anderen.</li>
<li><strong>Sie haben ein Plattformteam von 3–5 Engineers oder können es
aufbauen</strong> — Cozystack braucht klare betriebliche Verantwortung.</li>
<li><strong>Sie zielen auf regionale, regulierte oder souveränitätssensible
Kunden</strong> — bei denen eine europäische, EU-basierte Positionierung
zählt.</li>
<li><strong>Sie haben heute 300+ Kunden oder einen glaubwürdigen Wachstumspfad
zu 1.000+</strong> — damit sich die Fixkosten amortisieren.</li>
<li><strong>Sie sind bereit, in den Feinschliff des Kundenportals zu
investieren</strong> — statt das Cozystack Dashboard als „gut genug“ zu
behandeln.</li>
</ol>
<p>Weniger als drei: Meist ist eine andere Antwort besser — auf der
bestehenden Infrastruktur bleiben und die Kosten optimieren, als Kanal
mit einem größeren souveränen Provider zusammenarbeiten oder als Weg
mit geringerer Marge ein hyperscaler-verwaltetes Cloud-Produkt wählen.</p>
<h2 id="ablauf-der-zusammenarbeit">Ablauf der Zusammenarbeit</h2>
<p>Für Provider, zu denen die Public Cloud Platform passt:</p>
<ul>
<li><strong>Discovery Call</strong> (30 Min., kostenlos)</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>
(Festpreis, 14 Tage fokussiert oder 28 Tage vollständig) — Inventar des
aktuellen Bestands, Zielarchitektur, Migrationsplan</li>
<li><strong>Plattform live und Pilotkohorte</strong> — die Plattform ist mit dem
produktisierten Installer in wenigen Wochen auf Ihrer Hardware live;
Migration von 5–10 wohlgesonnenen Kunden, Validierung der Abrechnung</li>
<li><strong>Limited GA</strong> (2–4 Monate) — 50–100 Kunden, stabilisierte
Betriebsabläufe</li>
<li><strong>General Availability</strong> — Start am offenen Markt</li>
<li><strong>Support-Subskription</strong> (fortlaufend) — eine der <a href="https://aenix.io/de/preise/">veröffentlichten
Stufen</a>; Plus oder Enterprise für Abdeckung rund um die Uhr</li>
</ul>
<p>Wie lange der kommerzielle Start nach dem Go-live der Plattform dauert,
hängt vom Migrationsumfang und der Bereitschaft des Teams ab. Programme
im nationalen oder Betreibermaßstab mit mehreren Regionen rechnen mit
3–6 Monaten Pilot und danach 9–18 Monaten bis zum vollen
Multi-Region-Betrieb.</p>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/produkte/public-cloud-platform/">Landingpage Public Cloud Platform</a></strong> —
Funktionsübersicht, Preisblock, FAQ</li>
<li><strong><a href="https://aenix.io/de/branchen/hosting-anbieter/">Branchenseite Hosting-Anbieter</a></strong> —
Positionierung speziell für Hosting-Anbieter</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/white-label-cloud/">White-Label-Cloud-Leistungen</a></strong> —
für Erweiterungen des Modells durch MSPs und Channel-Partner</li>
</ul>
]]></content:encoded></item><item><title>Internal Developer Portal vs. Internal Developer Platform — und der Platz von Backstage im Jahr 2026</title><link>https://aenix.io/de/blog/2026/05/internal-developer-portal-vs-plattform/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/internal-developer-portal-vs-plattform/</guid><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Backstage</category><category>Kubernetes</category><category>Platform Engineering</category><category>Compliance</category><category>Observability</category><description>Portal und Plattform sind nicht dasselbe. Wo Backstage wirklich passt, welche Alternativen es gibt und wie Sie klären, ob Sie überhaupt ein Portal brauchen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/internal-developer-portal-vs-plattform.jpg" alt=""></p><p>Das Kürzel „IDP“ ist mehrfach belegt. Es steht für beides:</p>
<ul>
<li><strong>Internal Developer Platform</strong> — den zugrunde liegenden Capability-Stack (Kubernetes, IaC, Observability, Golden Paths).</li>
<li><strong>Internal Developer Portal</strong> — die UI-/Katalogebene (Backstage, Port, Eigenbau).</li>
</ul>
<p>Die meisten Diskussionen werfen beides durcheinander. Die eigentliche Frage — „Brauchen wir Backstage?“ — hat unterschiedliche Antworten, je nachdem, von welcher IDP die Rede ist.</p>
<h2 id="plattform-vs-portal">Plattform vs. Portal</h2>
<p>Eine Plattform ohne Portal funktioniert trotzdem. Ein Portal ohne Plattform ist Tapete.</p>
<p>Die <strong>Plattform</strong> beantwortet: „Welche Fähigkeiten können Produktteams per Self-Service nutzen?“</p>
<ul>
<li>Bereitstellung von Umgebungen</li>
<li>Anwendungs-Deployment</li>
<li>Bereitstellung von Datenbanken, Queues und Caches</li>
<li>Onboarding in die Observability</li>
<li>Secrets, Identity, Netzwerkzugang</li>
</ul>
<p>Das <strong>Portal</strong> beantwortet: „Wie finden Produktteams diese Fähigkeiten und wie greifen sie darauf zu?“</p>
<ul>
<li>Servicekatalog</li>
<li>Einstiegspunkt in die Dokumentation</li>
<li>Self-Service-Formulare und -Aktionen</li>
<li>Kosten- und SLO-Dashboards pro Service</li>
</ul>
<p>Ohne Plattform funktioniert Self-Service nicht. Das Portal wird für die Auffindbarkeit gebraucht, sobald die Zahl der Services über das hinauswächst, was Teams im Kopf behalten können.</p>
<h2 id="wann-sie-ein-portal-brauchen">Wann Sie ein Portal brauchen</h2>
<p>Ein Portal wird wertvoll, wenn:</p>
<ul>
<li><strong>die Zahl der Services groß ist</strong> — 50+ Services, bei denen Engineers den Überblick verlieren.</li>
<li><strong>das Team groß ist</strong> — viele Engineers, von denen sich viele auf der Plattform noch nicht sicher bewegen.</li>
<li><strong>teamübergreifende Service-Discovery real ist</strong> — Engineers aus Team A nutzen Services von Team B.</li>
<li><strong>Compliance oder Audit einen Servicekatalog verlangen</strong> — ein Serviceinventar, das der Aufsicht standhält.</li>
</ul>
<p>Trifft nichts davon zu (kleine Organisation, wenige Services, routiniertes Plattformteam), verursacht ein Portal Wartungsaufwand ohne nennenswerten Nutzen.</p>
<h2 id="portal-optionen-im-vergleich">Portal-Optionen im Vergleich</h2>
<h3 id="backstage-cncf-incubating">Backstage (CNCF Incubating)</h3>
<p><strong>Was:</strong> Open-Source-Servicekatalog plus Plugin-Ökosystem. Ursprünglich von Spotify entwickelt, heute bei der CNCF.</p>
<p><strong>Stärken:</strong> Ausgereift, breites Plugin-Ökosystem, anpassbar, starke Community.</p>
<p><strong>Schwächen:</strong> Die Betriebskosten sind real — Backstage zu betreiben heißt, Plugins zu pflegen, interne Tools anzubinden und mit dem Release-Rhythmus von Backstage Schritt zu halten. Viele Anwender unterschätzen das.</p>
<p><strong>Am besten für:</strong> Mittlere bis große Engineering-Organisationen (200+ Engineers) mit genug Kapazität im Plattformteam, um Backstage als Produkt zu pflegen.</p>
<h3 id="port-portio">Port (port.io)</h3>
<p><strong>Was:</strong> SaaS-Internal-Developer-Portal.</p>
<p><strong>Stärken:</strong> Kein Selbstbetrieb; schneller ausgerollt als Backstage; mit klaren Vorgaben.</p>
<p><strong>Schwächen:</strong> Abhängigkeit von SaaS (mit Folgen für die Souveränität); weniger anpassbar als Backstage.</p>
<p><strong>Am besten für:</strong> Mittelgroße Organisationen, die SaaS nutzen wollen und sich die Betriebskosten von Backstage sparen möchten.</p>
<h3 id="cortex--compass--eigenbauvarianten">Cortex / Compass / Eigenbauvarianten</h3>
<p>Verwandte Optionen mit anderen Abwägungen. Cortex konzentriert sich auf Engineering-Effektivität; Compass ist Atlassian-nativ; Eigenbau heißt „selbst bauen“.</p>
<h3 id="kein-portal">Kein Portal</h3>
<p><strong>Was:</strong> IaC-Repository plus Markdown-Dokumentation plus GitOps-Schnittstelle.</p>
<p><strong>Stärken:</strong> Keine Betriebskosten über Git hinaus. Kein portalspezifischer Wartungsaufwand.</p>
<p><strong>Schwächen:</strong> Die Auffindbarkeit skaliert ab 30–50 Services schlecht.</p>
<p><strong>Am besten für:</strong> Kleinere Organisationen (unter ~100 Engineers), in denen die Kosten eines Portals seinen Nutzen übersteigen würden.</p>
<h2 id="wo-backstage-tatsächlich-am-besten-passt">Wo Backstage tatsächlich am besten passt</h2>
<p>Backstage funktioniert gut, wenn:</p>
<ul>
<li>es 200+ Engineers und 100+ Services gibt</li>
<li>das Plattformteam 5+ Engineers hat, die Zeit für die Pflege aufbringen können</li>
<li>das Plugin-Ökosystem zu Ihrem Tooling passt</li>
<li>Anpassbarkeit eine Priorität ist (Sie werden Plugins schreiben oder erweitern)</li>
</ul>
<p>Trifft das nicht zu, übersteigen die Betriebskosten den Nutzen, und eine leichtgewichtigere Option passt besser.</p>
<h2 id="cnoe--die-open-source-referenz-für-platform-engineering">CNOE — die Open-Source-Referenz für Platform Engineering</h2>
<p>Die Brancheninitiative CNOE (Cloud Native Operational Excellence) verdient Erwähnung. Es ist eine Referenzarchitektur mit klaren Vorgaben, die Backstage, Argo CD, Crossplane, External Secrets und weitere CNCF-Tools zu einem stimmigen Plattformmuster verbindet. Für Organisationen, die eine „Plattform aus der Box“ aus CNCF-Projekten wollen, ist CNOE der strukturierte Ausgangspunkt.</p>
<p>CNOE ergänzt Cozystack: CNOE konzentriert sich auf das Developer Portal und die Tooling-Ebene; Cozystack auf die darunterliegende mandantenfähige, Kubernetes-native Plattform mit Virtualisierung. Beide können nebeneinander bestehen.</p>
<h2 id="wie-sie-entscheiden">Wie Sie entscheiden</h2>
<p>Ein praktischer Entscheidungsbaum:</p>
<ol>
<li><strong>Haben Sie darunter eine funktionierende Plattform?</strong> Wenn nein, bauen Sie zuerst diese. Die Adoption eines Portals setzt voraus, dass es eine Plattform gibt.</li>
<li><strong>Mehr als 50 Services? Mehr als 100 Engineers?</strong> Wenn ja, hilft ein Portal. Wenn nein, ist ein Portal Over-Engineering.</li>
<li><strong>Sind die Betriebskosten von Backstage realistisch tragbar?</strong> Wenn ja (großes Team, Plugin-freundliche Kultur), Backstage. Wenn nein, Port oder Cortex.</li>
<li><strong>Ist SaaS akzeptabel?</strong> Wenn ja, Port oder Cortex. Wenn nein, Backstage oder Eigenbau.</li>
<li><strong>Werden Sie tatsächlich anpassen?</strong> Wenn ja, Backstage. Wenn nein, Port.</li>
</ol>
<p>Die Entscheidung ist kleiner, als Hersteller sie darstellen. Die größere Architekturentscheidung ist die Plattform darunter.</p>
]]></content:encoded></item><item><title>Developer Self-Service — was Reibungsverluste in der Entwicklung kosten und was eine Internal Developer Platform tatsächlich einbringt</title><link>https://aenix.io/de/blog/2026/05/developer-self-service-oekonomie-entwicklungsgeschwindigkeit/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/developer-self-service-oekonomie-entwicklungsgeschwindigkeit/</guid><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Platform Engineering</category><category>Cozystack</category><category>DevOps</category><category>Multi-tenancy</category><description>Kosten der Wartezeit auf Umgebungen, Golden-Path-Abdeckung, Plattformteam-Größe und warum sich eine IDP ab 200 Engineers binnen 12 Monaten amortisiert.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/developer-self-service-oekonomie-entwicklungsgeschwindigkeit.jpg" alt=""></p><p>Die Diskussion „Sollen wir in ein Plattformteam investieren?“ bleibt
meist an einer von zwei Stellen hängen: Entweder sieht der CFO den
wirtschaftlichen Fall nicht („Wir bezahlen doch schon DevOps-Engineers,
warum noch mehr Stellen?“), oder die Engineering-Organisation hat
einmal Backstage als Plattform ausprobiert, fand es oberflächlich und
hat das Vertrauen in die ganze Kategorie verloren.</p>
<p>Dieser Artikel geht beides durch. Wie sehen die Kosten der
Reibungsverluste in der Entwicklung in Zahlen tatsächlich aus? Was
liefert eine IDP, die <em>funktioniert</em>? Und was übernimmt die
Developer-Self-Service-Schicht der Ænix Private Cloud Platform, das Sie
sonst selbst bauen müssten?</p>
<h2 id="was-reibungsverluste-in-der-entwicklung-kosten">Was Reibungsverluste in der Entwicklung kosten</h2>
<p>Der beständigste Befund aus unseren Platform-Readiness-Assessments in
Organisationen ab 200 Engineers lautet: <strong>Die Bereitstellung einer
Umgebung dauert 2–6 Wochen für etwas, das eine Self-Service-Aktion von
30 Minuten sein sollte.</strong></p>
<p>Wohin geht die Zeit? Typischerweise:</p>
<ul>
<li>IAM: ein Ticket an das Security-Team, 2–5 Tage</li>
<li>Netzwerkanbindung: ein Ticket an das Network Engineering, 3–7 Tage</li>
<li>Onboarding in die Observability: ad hoc, oft erst spät als fehlend
bemerkt</li>
<li>Compliance-Review: 1–3 Tage, bei regulierten Daten manchmal länger</li>
<li>Freigabekette: 2–4 Tage, in Matrixorganisationen gelegentlich länger</li>
</ul>
<p>Jeder Schritt erfordert eine Übergabe, das heißt Kontextverlust, das
heißt erneute Abstimmung, das heißt mehr Zeit. Die einzelnen Schritte
sind klein; die kumulierte Reibung ist groß.</p>
<p>Bei 5 % der Engineering-Produktivität (grobe Schätzung aus unseren
Projekten in der Größenordnung von 200 Engineers und 2–6 Wochen bis
zur Umgebung) kosten die Reibungsverluste eine Organisation mit 200
Engineers <strong>rund 10 Engineers an verlorenem Durchsatz pro Jahr</strong> —
etwa 1,5–2 Mio. € bei voll belasteten Kostensätzen. Wer die
Bereitstellung von Umgebungen auf Stunden verkürzt, holt den Großteil
davon zurück.</p>
<p>Die Investition in eine Internal Developer Platform, die diese
Verkürzung leistet, amortisiert sich bei Organisationen dieser Größe
typischerweise innerhalb von 12 Monaten.</p>
<h2 id="was-eine-plattform-die-funktioniert-tatsächlich-liefert">Was eine „Plattform, die funktioniert“ tatsächlich liefert</h2>
<p>Für eine glaubwürdige IDP zählen fünf Merkmale mehr als die Wahl der
Tools:</p>
<h3 id="1-schneller-als-die-alternative-per-ticket">1. Schneller als die Alternative per Ticket</h3>
<p>Dauert der Self-Service 2 Tage und ein Ticket 3 Tage, nehmen Teams das
Ticket — Warten ist bequemer als Lernen. Die Plattform muss deutlich
schneller sein, damit die Adoption kippt.</p>
<h3 id="2-verlässlich-genug-um-ihm-zu-vertrauen">2. Verlässlich genug, um ihm zu vertrauen</h3>
<p>Der Self-Service-Pfad funktioniert für den dokumentierten
Anwendungsfall beim ersten Mal und jedes Mal. Bricht er in einem von
zehn Fällen, verlieren Teams das Vertrauen. Die Adoption stockt.</p>
<h3 id="3-auf-höchstens-einer-seite-dokumentiert">3. Auf höchstens einer Seite dokumentiert</h3>
<p>Ist die Dokumentation länger als eine Seite, ist die Architektur zu
komplex. Echte Golden Paths sind von vornherein einfach.</p>
<h3 id="4-im-besitz-eines-echten-teams">4. Im Besitz eines echten Teams</h3>
<p>Ein Team pflegt den Pfad, fängt Sonderfälle auf und liefert
Verbesserungen aus. Ohne klare Verantwortung verfallen Pfade. Die
Platform-Engineering-Funktion muss eine Funktion sein, kein Hobby.</p>
<h3 id="5-mit-ausweichmöglichkeiten">5. Mit Ausweichmöglichkeiten</h3>
<p>Produktteams können abweichen, wenn ihr Fall besonders ist. Die
Ausweichmöglichkeit ist ein echtes Gespräch mit dem Plattformteam,
nicht „Nutzen Sie den Pfad oder scheitern Sie“.</p>
<h2 id="was-developer-self-service-mitbringt">Was Developer Self-Service mitbringt</h2>
<p>Die Developer-Self-Service-Schicht der Ænix Private Cloud Platform
macht diese Merkmale auf dem Fundament von Cozystack zum Produkt.
Konkret:</p>
<h3 id="eine-mandantenfähige-cozystack-plattform-mit-tenant-crd">Eine mandantenfähige Cozystack-Plattform mit Tenant CRD</h3>
<p>Jedes Produktteam bekommt einen Tenant — ein Kubernetes-natives Objekt
mit eigenem Namespace, eigener Quota, eigenem RBAC und eigenem
Observability-Bereich. Isolation pro Tenant ohne den Overhead eines
Clusters pro Team. Verschachtelte Tenants bilden Hierarchien von
Geschäftsbereichen ab.</p>
<p>Damit löst sich das Trilemma „Weiche Mandantenfähigkeit ist zu
durchlässig, ein Cluster pro Team ist im Betrieb zu teuer“ ohne
Kompromiss.</p>
<h3 id="ein-cozystack-dashboard-das-von-den-golden-paths-her-gedacht-ist">Ein Cozystack Dashboard, das von den Golden Paths her gedacht ist</h3>
<p>Das Cozystack Dashboard in Developer Self-Service bietet klar
vorgegebene Pfade für die 5–10 häufigsten Bedürfnisse von
Produktteams: Bereitstellung von Umgebungen, Anwendungs-Deployment,
Bereitstellung von Managed-Datenbanken, Onboarding in die
Observability, Secrets-Management. Jeder Pfad ist in Minuten
abgeschlossen.</p>
<p>Kuratiert, nicht erschöpfend — das, was Ihr Plattformteam tatsächlich
mit Support absichern kann, nicht jede Fähigkeit von Cozystack.</p>
<h3 id="gitops-automatisierung">GitOps-Automatisierung</h3>
<p>Argo CD und Argo Workflows sind in die Plattform vorintegriert.
GitLab-Integration für das in Unternehmen verbreitetste SCM.
Produktteams committen IaC, die Plattform reagiert. Kein
Herumklicken für Änderungen an der Produktion.</p>
<h3 id="vorgefertigte-service-templates">Vorgefertigte Service-Templates</h3>
<p>Standard-Service-Templates (HTTP-API, Batch-Worker, geplanter Job) mit
eingebauter Observability, Deployment und Alerting. Ein neuer Dienst
ist eine Instanz eines Templates. Die Zeit bis zum ersten
Produktions-Deployment beträgt Stunden, nicht Wochen.</p>
<h3 id="interne-produktmanagement-disziplin-eingebaut">Interne Produktmanagement-Disziplin eingebaut</h3>
<p>Das Plattformteam wird als Funktion behandelt, deren Kunden die
Produktteams sind. Ein Developer-Self-Service-Projekt umfasst eine
RACI-Matrix für das Plattformteam, interne NPS-Kennzahlen, Vorlagen
für Abkündigungsrichtlinien und Muster für das Roadmap-Management.
Gerade diese Disziplin ist oft das fehlende Stück.</p>
<h2 id="was-in-der-verantwortung-des-kunden-bleibt">Was in der Verantwortung des Kunden bleibt</h2>
<p>Developer Self-Service ist das Plattformsubstrat plus die betriebliche
Disziplin. Einiges bleibt bei Ihnen:</p>
<ul>
<li><strong>Die Definition Ihrer konkreten Golden Paths</strong> — welche 5–10 Sie
zuerst bauen, hängt davon ab, was Ihre Produktteams tatsächlich am
häufigsten anfragen.</li>
<li><strong>Die Größe des Platform-Engineering-Teams</strong> — das typische reife
Verhältnis ist 1 Platform Engineer pro 10–20 Produkt-Engineers; wir
empfehlen, vor dem Bedarf einzustellen.</li>
<li><strong>Die Adoption</strong> — eine großartige Plattform, die niemand nutzt, ist
versenktes Kapital. Produktmanagement-Praktiken im Plattformteam
(Interviews mit Produktteams, Messung der Adoption pro Pfad,
Einstellen ungenutzter Pfade) müssen gelebt werden.</li>
</ul>
<p>Das Projektmodell von Ænix unterstützt alle drei Punkte, ersetzt aber
nicht die Verantwortung des Kunden. Plattformen, für die der Kunde
organisatorisch keine Verantwortung übernimmt, überdauern das Projekt
nicht.</p>
<h2 id="der-wirtschaftliche-fall-im-vergleich-zu-den-alternativen">Der wirtschaftliche Fall im Vergleich zu den Alternativen</h2>
<h3 id="im-vergleich-zu-reinem-devops">Im Vergleich zu reinem DevOps</h3>
<p>DevOps ohne eigenes Platform Engineering skaliert linear mit der Zahl
der Teams — jedes Produktteam löst Infrastruktur, Observability,
Identity und Release Engineering für sich. Ab etwa 50 Engineers frisst
die Doppelarbeit die Einsparungen auf. Ab etwa 200 Engineers wird sie
zur betrieblichen Bremse.</p>
<p>Developer Self-Service verändert das Modell: Platform Engineering wächst
sublinear mit der Zahl der Teams. Das 21. Produktteam bringt nicht den
Plattform-Overhead eines 21. Teams mit — die bestehende Plattform nimmt
es auf.</p>
<h3 id="im-vergleich-zum-eigenbau-auf-vanilla-kubernetes-plus-backstage">Im Vergleich zum Eigenbau auf Vanilla Kubernetes plus Backstage</h3>
<p>Für Organisationen mit starker Platform-Engineering-Kapazität und
klaren architektonischen Vorstellungen ist das eine glaubwürdige
Alternative. Der Preis: 12–24 Monate Bauzeit, bis die Plattform für
Produktteams „produktionsreif“ ist, plus laufender Wartungsaufwand für
die Plattformkomponenten.</p>
<p>Developer Self-Service auf der Ænix Private Cloud Platform liefert das Plattformsubstrat in 3–6 Monaten,
mit laufendem Support durch Ænix. Für Organisationen, die nicht für
einen Aufbau über 12–24 Monate besetzt sind, entscheidet das darüber,
ob Platform Engineering in diesem Jahr stattfindet oder 2028.</p>
<h3 id="im-vergleich-zum-backstage-als-plattform-antipattern">Im Vergleich zum Backstage-als-Plattform-Antipattern</h3>
<p>Backstage ist ein Portal, keine Plattform. Wer Backstage kauft, bevor
die zugrunde liegenden Fähigkeiten als Self-Service verfügbar sind,
bekommt einen schönen Katalog über demselben betrieblichen Chaos. Die
Adoption stockt.</p>
<p>Das Cozystack Dashboard von Developer Self-Service lässt sich durch
Backstage ersetzen oder ergänzen, wenn der Kunde das bevorzugt — aber
die zugrunde liegenden Fähigkeiten (Bereitstellung von Umgebungen,
Observability, Secrets, Identity) sind Self-Service, weil die Plattform
es ist, und nicht, weil das Portal es vorgibt.</p>
<h3 id="im-vergleich-zu-hyperscaler-verwaltetem-kubernetes-eks--aks--gke">Im Vergleich zu hyperscaler-verwaltetem Kubernetes (EKS / AKS / GKE)</h3>
<p>Von Hyperscalern verwaltetes Kubernetes ist im Betrieb einfacher als
selbst verwaltete Cluster. Der Preis: Vendor-Lock-in (die Control Plane
gehört dem Anbieter; Sie können sie anderswo nicht exakt nachbilden),
eine Kostendecke (Hyperscaler-Ökonomie bei dauerhaften Workloads) und
Folgen für die Souveränität.</p>
<p>Developer Self-Service passt, wenn die Abwägungen bei Kosten oder
Souveränität den betrieblichen Aufwand des Selbstbetriebs rechtfertigen.
Für Unternehmen in einer frühen Phase ohne Souveränitätsdruck ist
hyperscaler-verwaltetes Kubernetes nach wie vor die richtige Wahl.</p>
<h2 id="wann-developer-self-service-die-richtige-antwort-ist">Wann Developer Self-Service die richtige Antwort ist</h2>
<p>Gute Passung:</p>
<ul>
<li>200+ Engineers in 5+ Produktteams</li>
<li>Die Bereitstellung einer Umgebung dauert heute 2–6 Wochen; Ziel sind
Stunden</li>
<li>Das bestehende Plattformteam ertrinkt in Tickets, statt Pfade zu
bauen</li>
<li>Mandantenisolation ist wichtig (regulierte Daten, Trennung von
Geschäftsbereichen oder Service-Provider-Modell)</li>
<li>Die Investition in Platform Engineering wird von der
Engineering-Leitung getragen</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>100–200 Engineers mit wachsenden Plattformproblemen, aber begrenztem
Budget; mit Cozystack Enterprise Support starten und mit dem Team in
die Ænix Private Cloud Platform hineinwachsen</li>
<li>Eine starke bestehende Eigenentwicklung mit konkreten Lücken — ein
Teilprojekt passt hier eventuell besser als vollständiges Developer
Self-Service</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Weniger als 50 Engineers, ein einziges Produktteam; hier ist reines
DevOps richtig</li>
<li>Hyperscaler-verwaltetes Kubernetes erfüllt alle Anforderungen;
Souveränität spielt keine Rolle</li>
</ul>
<h2 id="ablauf-der-zusammenarbeit">Ablauf der Zusammenarbeit</h2>
<ul>
<li><strong>Discovery Call</strong> (30 Min., kostenlos) — Prüfung der Passung</li>
<li><strong>Platform Readiness Assessment</strong> (14 oder 28 Tage, Schwerpunkt auf
dem IDP-Arbeitspaket) — heutige Zeit bis zur Umgebung, Reifegrad,
empfohlene Golden Paths</li>
<li><strong>Pilot-Deployment</strong> (3–6 Monate) — Cozystack-Plattform plus 3–5
Golden Paths plus Onboarding von 2–3 Pilot-Produktteams</li>
<li><strong>Vollständiger Aufbau von Developer Self-Service</strong> (3–12 Monate je nach Umfang) —
die Plattform wird auf die gesamte Engineering-Organisation
ausgeweitet, alle geplanten Golden Paths sind ausgeliefert</li>
<li><strong>Managed Retainer</strong> (optional, fortlaufend) — Support der Plus- oder
Enterprise-Stufe unter SLA (siehe <a href="https://aenix.io/de/preise/">Preise</a>)</li>
</ul>
<p>Projektumfang: Projekt plus Managed Retainer, Angebot pro
Ausschreibung (RFP).</p>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/produkte/private-cloud-platform/">Ænix Private Cloud Platform mit Developer Self-Service</a></strong> —
Funktionsübersicht, produktspezifisches FAQ</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/internal-developer-platform/">Leistungen rund um die Internal Developer Platform</a></strong> —
Details zum Projekt</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-engineering/">Leistungen für Platform Engineering</a></strong> —
breiterer Umfang</li>
<li><strong><a href="https://aenix.io/de/loesungen/developer-self-service/">Lösungen für Developer Self-Service</a></strong> —
die Landingpage aus Sicht des Einkäufers</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/internal-developer-platform-beispiele-ohne-backstage/">Internal Developer Platform Beispiele — 6 Muster</a></strong> —
die sechs IDP-Muster aus der Produktion</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/internal-developer-portal-vs-plattform/">Internal Developer Portal vs. Plattform</a></strong> —
der Platz von Backstage im Jahr 2026</li>
</ul>
]]></content:encoded></item><item><title>Ænix Billing — minutengenaue Verbrauchsabrechnung für Managed PostgreSQL, Redis, Kafka und ClickHouse auf Cozystack</title><link>https://aenix.io/de/blog/2026/05/aenix-billing-pay-per-minute-managed-services-cozystack/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/aenix-billing-pay-per-minute-managed-services-cozystack/</guid><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><dc:creator>Timur Tukaev</dc:creator><category>Cozystack</category><category>Kubernetes</category><category>Multi-tenancy</category><category>Platform Engineering</category><category>Billing</category><description>Ænix Billing rechnet Managed Postgres, Redis, Kafka und ClickHouse auf Cozystack minutengenau nach CPU, Memory und Speicher ab — Kubernetes-native API.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/aenix-billing-pay-per-minute-managed-services-cozystack.jpg" alt="Ænix Billing — minutengenaue Verbrauchsabrechnung für Managed PostgreSQL, Redis, Kafka und ClickHouse auf Cozystack" width="1200" height="630" loading="lazy" decoding="async"></p>
<p><strong>Sie liefern einem Tenant einen Managed-Postgres- oder ClickHouse-Cluster in zwei Minuten aus. Jetzt müssen Sie abrechnen — minutengenau, aufgeschlüsselt nach CPU, Memory und Speicher, cent-genau abstimmbar. AWS RDS kann das. GCP kann das. Auf eigener Hardware? Bisher: ein eigenes Prometheus-Skript, ein monatlicher Tabellen-Export und ein Vertriebsgespräch, das erklärt, „warum die Zahl so groß ist“. Ænix Billing schließt diese Lücke.</strong></p>
<h2 id="was-ænix-billing-ist">Was Ænix Billing ist</h2>
<p>Ein nativer Kubernetes-Extension-API-Server, der die <code>billing.aenix.io/v1alpha1</code>-API bereitstellt. Sie fragen ihn genauso ab wie die reguläre Kubernetes-API — mit <code>kubectl</code>, kubeconfig-RBAC, Ihrem bestehenden Tooling — und erhalten einen strukturierten <code>UsageReport</code> für jeden Tenant, jeden Workload, jedes Zeitfenster.</p>
<p>Unter der Haube:</p>
<ul>
<li><strong>Cozystack Workload CRD</strong> — jeder Managed-Service (Postgres Primary, Redis Sentinel, ClickHouse Shard, KubeVirt-VM, Kubernetes-Worker, S3-Bucket) ist ein <code>Workload</code>-Objekt.</li>
<li><strong>Billing-Controller</strong> — wandelt <code>Workload</code>-State in Prometheus-Metriken um: operative Lebensdauer, Owner-Tenant, Kind/Typ, Ressourcenreservierungen.</li>
<li><strong>VictoriaMetrics</strong> — speichert Metriken mit Stream-Aggregation. (Ænix und Cozystack standardisieren auf VictoriaMetrics + VictoriaLogs, nicht Prometheus/Loki.)</li>
<li><strong>Billing-API-Server</strong> — bedient die API und berechnet das bestimmte Integral der Reservierungen über das angefragte Zeitfenster.</li>
</ul>
<p>Die Form: ein schlanker Extension-API-Server, ein kleiner Controller, Ihr bestehender Metrics-Store. Keine neue Abhängigkeit zu betreiben. Ihr Plattform-Team betreibt all diese Komponenten bereits.</p>
<h2 id="was-abgerechnet-wird">Was abgerechnet wird</h2>
<p>Jeder Consumer (ein einzelner Postgres-Pod, eine Redis-Instanz, eine ClickHouse-Replica) wird gemeldet mit:</p>
<ul>
<li><code>vCPUHours</code> oder <code>CPUHours</code> — umschaltbar, je nachdem ob Sie physische oder virtualisierte CPU abrechnen</li>
<li><code>MemoryGiBHours</code> (oder dezimal <code>MemoryGBHours</code>)</li>
<li><code>EphemeralStorageGiBHours</code></li>
<li><code>PersistentVolumeGBHours</code> — aufgeschlüsselt nach Storage-Class (NVMe vs HDD vs repliziert)</li>
<li><code>IPAddressHours</code> — abgeleitet aus MetalLB-IP-Pool-Labels</li>
<li><code>LifetimeHours</code> — reine Laufzeit, unabhängig von Reservierungen</li>
<li><code>S3StorageGBHours</code> und <code>S3PhysicalStorageGBHours</code> — für Object-Storage-Tenants</li>
</ul>
<p><code>Workload</code>-Metadaten reisen mit dem Report mit — <code>kind: postgres</code>, <code>type: master</code> vs. <code>replica</code>, der Owner-Tenant, eigene Cozystack-Labels — sodass Preisregeln so feingranular sein können wie Sie wollen. Replicas zum halben Preis von Primaries abrechnen. NVMe-Volumes 3× HDD-Volumes. Einem strategischen Tenant 20 % Rabatt geben. Die Daten sind da; die Policy ist Ihre.</p>
<h2 id="wie-sie-abfragen">Wie Sie abfragen</h2>
<p>Ein <code>UsageReport</code> ist ein Kubernetes-Objekt. Sie bauen die Anfrage wie jede andere CRD:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">billing.aenix.io/v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">UsageReport</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">query</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">tenant</span><span class="p">:</span><span class="w"> </span><span class="l">tenant-acme</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">includeSubTenants</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">startTimestamp</span><span class="p">:</span><span class="w"> </span><span class="ld">2026-04-01T00:00:00Z</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">endTimestamp</span><span class="p">:</span><span class="w">   </span><span class="ld">2026-05-01T00:00:00Z</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl create -f report.yaml -o yaml
</span></span></code></pre></div><p>Sie erhalten dasselbe Objekt zurück mit befülltem <code>report.consumers[]</code> — ein Eintrag pro Postgres-Replica, Redis-Pod, ClickHouse-Shard, K8s-Worker — jeder mit eigener Verbrauchsaufschlüsselung.</p>
<ul>
<li><code>includeSubTenants: true</code> zieht rekursiv jeden verschachtelten Tenant</li>
<li><code>excludeTenants:</code> filtert interne Namespaces heraus</li>
<li><code>workload: postgres-myapp-1</code> schränkt auf einen einzelnen Cluster ein</li>
<li>Zeitfenster auf einen Abrechnungsmonat, einen einzelnen Tag oder die Lebensdauer eines Tenants — die API akzeptiert jedes RFC3339-Intervall</li>
</ul>
<p>Derselbe <code>kubectl get</code>-Mechanismus, der eine Pod-Liste zieht, zieht jetzt Tenant-Rechnungspositionen. RBAC funktioniert genauso — das Billing-Team bekommt eine kubeconfig, die auf die Billing-API beschränkt ist; mehr nicht.</p>
<h2 id="warum-das-für-hosting-provider-relevant-ist">Warum das für Hosting-Provider relevant ist</h2>
<p>Sie hosten bereits Managed Postgres, Redis, Kafka, ClickHouse, S3 und Kubernetes über Cozystack. Mit Ænix Billing bekommen Sie das fehlende Stück — präzise Buchhaltung pro Tenant, pro Workload, pro Ressource, die direkt in Ihre Rechnungsstellung einfließt. Keine Tabellen. Keine quartalsweise Abstimmung. Keine „warum ist meine Rechnung so hoch“-Diskussionen mit Kunden.</p>
<p>Drei Dinge ändern sich für das Operations-Team:</p>
<ol>
<li><strong>Billing ist kein separates System mehr.</strong> Dieselbe API wie der Rest der Plattform. Dasselbe RBAC. Dasselbe kubectl. Nichts Neues zu lernen oder zu betreiben.</li>
<li><strong>Reklamationen sinken.</strong> Die Rechnungspositionen mappen 1:1 auf die Ressourcen, die Cozystack tatsächlich geschedult hat. Der Kunde kann dieselbe Abfrage laufen lassen, dieselben Zahlen sehen, cent-genau abstimmen.</li>
<li><strong>Preisexperimente sind günstig.</strong> Sie wollen A/B-testen, eine bestimmte Service-Klasse nach <code>MemoryGiBHours</code> statt <code>vCPUHours</code> abzurechnen? Nicht den Billing-Pipeline-Code ändern — die Policy ändern, die denselben Report konsumiert.</li>
</ol>
<h2 id="wie-es-sich-von-aws-rds--gcp-abrechnung-unterscheidet">Wie es sich von AWS RDS / GCP-Abrechnung unterscheidet</h2>
<p>AWS RDS und Cloud SQL rechnen minutengenau gegen eine Managed-Service-Preisliste ab — der Provider besitzt die Preisliste und der Kunde akzeptiert die Rechnungspositionen als verbindlich. <strong>Sie sind dieser Provider</strong> auf Cozystack. Ænix Billing liefert dieselbe Minutengenauigkeit, mit Preismodell und Ressourcen-Taxonomie unter Ihrer Kontrolle. Die Daten liegen offen, die Policy gehört Ihnen.</p>
<p>Für Hosting-Provider auf Bare Metal — Hetzner, OVH, regionale Rechenzentren, Sovereign-Cloud-Betreiber — ist das der Unterschied zwischen „mit Hyperscalern auf Funktion konkurrieren“ und „mit Hyperscalern nur auf Preis konkurrieren“. Die Funktion war bisher die Lücke.</p>
<h2 id="distribution">Distribution</h2>
<p>Ænix Billing ist ein proprietäres Ænix-Modul und wird zusammen mit Cozystack als Teil der kommerziellen Ænix-Plattformen ausgeliefert. Die Cozystack-Plattform bleibt Apache-2.0 und CNCF-gesteuert. Für Ænix-Kunden ist die Billing-Schicht Bestandteil der Subskription.</p>
<p>Wenn Sie ein Hosting-Geschäft oder eine Private Cloud auf Cozystack betreiben und Billing out of the box wollen, <a href="https://aenix.io/de/kontakt/">vereinbaren Sie einen Discovery-Call</a> — wir besprechen Scope, Pricing und Rollout.</p>
<h2 id="community">Community</h2>
<ul>
<li><strong>Cozystack</strong> — <a href="https://cozystack.io">cozystack.io</a></li>
<li><strong>GitHub</strong> — <a href="https://github.com/cozystack">github.com/cozystack</a></li>
<li><strong>Telegram</strong> — <a href="https://t.me/cozystack">t.me/cozystack</a></li>
<li><strong>Kubernetes Slack</strong> — <a href="https://kubernetes.slack.com/archives/C06L3CPRVN1">#cozystack</a> (Einladung nötig? <a href="https://slack.kubernetes.io">slack.kubernetes.io</a>)</li>
<li><strong>Community-Meetings</strong> — <a href="https://cozystack.io/community/">Kalender</a></li>
</ul>
]]></content:encoded></item><item><title>Enterprise Platform Engineering — Organisationsdesign, Personalbedarf und Fehlermuster ab 1.000 Engineers</title><link>https://aenix.io/de/blog/2026/05/enterprise-platform-engineering-organisationsdesign/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/enterprise-platform-engineering-organisationsdesign/</guid><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Platform Engineering</category><category>Cozystack</category><category>Multi-tenancy</category><category>DevOps</category><description>Organisationsdesign, Personalrechnung, Governance und wiederkehrende Fehlermuster beim Aufbau von Platform Engineering in Organisationen ab 1.000 Engineers.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/enterprise-platform-engineering-organisationsdesign.jpg" alt=""></p><p>Platform Engineering bei 200–500 Engineers ist vor allem eine Frage
von „gut machen“ — Golden Paths definieren, den Capability-Stack der
IDP aufbauen, ein Plattformteam einstellen, ausliefern. Platform
Engineering ab 1.000 Engineers ist ein anderes Problem: Governance
über Geschäftsbereiche hinweg, Konsistenz ohne Starrheit,
betriebliche Koordination über mehrere Regionen, Change-Management auf
dem Niveau, das die Aufsicht erwartet, und die politische Dynamik
geschäftsbereichsübergreifender Infrastrukturentscheidungen.</p>
<h2 id="was-sich-ab-1000-engineers-ändert">Was sich ab 1.000 Engineers ändert</h2>
<p>Drei strukturelle Verschiebungen:</p>
<h3 id="1-mehrere-platform-engineering-teams">1. Mehrere Platform-Engineering-Teams</h3>
<p>Ein einzelnes Plattformteam skaliert bis etwa 50–100 Produktteams
oder 500–1.000 Produkt-Engineers. Darüber zerfällt die
Plattformfunktion — nach Domäne (Datenplattform, ML-Plattform,
Infrastrukturplattform), nach Geschäftsbereich (Consumer Cloud,
Enterprise Cloud, interne IT) oder nach Geografie (regionale
Plattformteams unter regulatorischen Vorgaben).</p>
<p>Die Koordination mehrerer Plattformteams wird zu einer eigenen
Disziplin — Governance einer Plattform aus Plattformen, gemeinsame
Standards, Eskalationswege für plattformübergreifende Entscheidungen.</p>
<h3 id="2-der-governance-aufwand-wird-erheblich">2. Der Governance-Aufwand wird erheblich</h3>
<p>Architekturentscheidungen betreffen Tausende Engineers und Millionen
Euro an wiederkehrenden Kosten. Entscheidungen können nicht ad hoc
fallen; sie brauchen Governance — Architecture Review Boards,
Prozesse für das Technologie-Radar, Abkündigungsrichtlinien, die
Übergangsfenster von 2–3 Jahren respektieren, und eine Abstimmung
über die Geschäftsbereiche hinweg.</p>
<p>Bei 200 Engineers funktioniert „Das Plattformteam entscheidet“. Ab
1.000 Engineers erzeugt „Das Plattformteam entscheidet allein“ einen
politischen Gegenwind, der die Adoption stärker bremst, als die
Entscheidung Zeit spart.</p>
<h3 id="3-change-management-auf-aufsichtsniveau">3. Change-Management auf Aufsichtsniveau</h3>
<p>Für regulierte Unternehmen (Banken, Versicherer, öffentlicher Sektor,
Telekommunikation, Energie, Gesundheitswesen) laufen Plattformen im
Enterprise-Maßstab unter einem prüfungsfesten Change-Management.
Produktionsänderungen durchlaufen eine dokumentierte Freigabe, sind
aus Artefakten reproduzierbar und erzeugen Nachweise, die die Aufsicht
verwerten kann.</p>
<p>Die Plattform selbst wird zu einem aufsichtsrelevanten Objekt — die
Kontrollen nach DORA Artikel 6 leben im Code der Plattform.</p>
<h2 id="muster-für-das-organisationsdesign">Muster für das Organisationsdesign</h2>
<p>Drei Muster, die wir im Enterprise-Maßstab sehen:</p>
<h3 id="muster-a-an-domänen-ausgerichtete-aufteilung-der-plattform">Muster A: An Domänen ausgerichtete Aufteilung der Plattform</h3>
<p>Eigene Plattformteams pro großer Engineering-Domäne:</p>
<ul>
<li>Infrastrukturplattform — Compute, Networking, Storage, Identity</li>
<li>Datenplattform — Data Warehousing, ETL, Echtzeit-Streams</li>
<li>ML-/KI-Plattform — GPU-Scheduling, Model Serving, Feature Stores</li>
<li>Anwendungsplattform — Laufzeitdienste, Deployment-Automatisierung</li>
</ul>
<p>Jedes Plattformteam hat eigene Kunden (die Produktteams, die die
jeweilige Domäne nutzen). Gemeinsame Standards werden über die
Governance-Funktion gesichert.</p>
<p>Passt zu: Organisationen mit klaren Grenzen zwischen
Engineering-Domänen (die meisten Fintechs, die meisten
Consumer-Tech-Unternehmen dieser Größe).</p>
<h3 id="muster-b-an-geschäftsbereichen-ausgerichtete-plattformföderation">Muster B: An Geschäftsbereichen ausgerichtete Plattformföderation</h3>
<p>Eigene Plattformteams pro Geschäftsbereich:</p>
<ul>
<li>Plattform für das Privatkundengeschäft</li>
<li>Plattform für das Firmenkundengeschäft</li>
<li>Plattform für das Wealth Management</li>
<li>Plattform für konzernweite Shared Services</li>
</ul>
<p>Jeder Geschäftsbereich betreibt seine eigene Plattform auf einem
gemeinsamen Substrat. Die Föderation läuft über Governance —
Architecture Review Board, Technologie-Radar,
Abkündigungsrichtlinien.</p>
<p>Passt zu: Organisationen mit starker Autonomie der Geschäftsbereiche
(die meisten etablierten Finanzdienstleister, die meisten großen
Industriekonglomerate).</p>
<h3 id="muster-c-hybrid--gemeinsames-substrat-plus-domänen-erweiterungen">Muster C: Hybrid — gemeinsames Substrat plus Domänen-Erweiterungen</h3>
<p>Eine einzige grundlegende Plattform (Compute, Networking, Storage,
Identity), die alle Geschäftsbereiche teilen. Domänenspezifische
Plattformerweiterungen (ML-Plattform, Datenplattform) setzen darauf
auf und werden von spezialisierten Domänenteams betrieben.</p>
<p>Passt zu: Organisationen, die Konsistenz (grundlegendes Substrat) mit
Spezialisierung nach Domänen (ML, Daten) ausbalancieren.</p>
<p>In allen drei Mustern ist die Governance der Plattform aus Plattformen
das tragende Element. Ohne sie führt die Aufteilung zu 50
verschiedenen Plattformen mit 50 verschiedenen Betriebsmodellen —
deutlich schlechter als eine gut gesteuerte Plattform.</p>
<h2 id="personalrechnung">Personalrechnung</h2>
<p>Für Platform Engineering im Enterprise-Maßstab hilft folgende
Faustregel:</p>
<ul>
<li><strong>Team für die grundlegende Substrat-Plattform</strong> — 1 Engineer pro
50–100 Produkt-Engineers. Bei 2.000 Produkt-Engineers sind das
20–40 Platform Engineers, verteilt auf Teilteams für Infrastruktur,
Daten, Anwendungen und SRE.</li>
<li><strong>Domänen-Plattformteams</strong> — jeweils 5–15 Engineers, skaliert mit
der domänenspezifischen Komplexität und der Zahl der Kunden.</li>
<li><strong>Governance- und Architekturfunktion</strong> — 3–8 Personen
(Architekten, Verantwortliche für das Technologie-Radar,
Verantwortliche für Abkündigungen).</li>
<li><strong>Betrieb und Rufbereitschaft</strong> — getrennt vom Build-Engineering;
skaliert nach Vorfallvolumen und SLA-Stufe.</li>
</ul>
<p>Gesamte Platform-Engineering-Funktion: etwa 5–10 % der gesamten
Engineering-Belegschaft in reifen Plattformorganisationen. Darunter ist
die Plattform strukturell unterfinanziert.</p>
<h2 id="governance-modelle">Governance-Modelle</h2>
<p>Das Muster des Architecture Review Board (ARB) funktioniert im
Enterprise-Maßstab, wenn es bewusst gestaltet wird:</p>
<h3 id="besetzung-des-arb">Besetzung des ARB</h3>
<p>Leitende Platform Engineers (eine Person pro Plattformteam) plus
leitende Produkt-Engineers (rotierend, etwa 5 gleichzeitig) plus
Security-Leitung plus Compliance-Leitung plus Chief Architect
(Vorsitz).</p>
<p>Das Board prüft Architekturentscheidungen, die mehrere Teams betreffen,
legt Zeitpläne für die Abkündigung ausgemusterter Fähigkeiten fest,
genehmigt neue Abhängigkeiten von Herstellern oder Open-Source-Projekten
und pflegt das Technologie-Radar (Adopt / Trial / Assess / Hold).</p>
<h3 id="entscheidungsrhythmus">Entscheidungsrhythmus</h3>
<p>Monatliche ARB-Sitzung für Routineentscheidungen. Quartalsweise für
den strategischen Review. Asynchrone Entscheidungen zwischen den
Sitzungen, wenn es zeitkritisch ist.</p>
<h3 id="was-das-arb-nicht-tut">Was das ARB NICHT tut</h3>
<p>Das ARB steuert nicht die Architekturentscheidungen einzelner
Produktteams innerhalb ihres eigenen Verantwortungsbereichs im Detail.
Diese bleiben Entscheidungen der Produktteams. Das ARB verantwortet
ausschließlich teamübergreifende Entscheidungen.</p>
<p>Diese Grenze ist wichtig: ARBs, die übergreifen, erzeugen politische
Reibung, die die Governance-Funktion selbst untergräbt.</p>
<h2 id="woran-enterprise-platform-engineering-scheitert">Woran Enterprise Platform Engineering scheitert</h2>
<p>Fünf Fehlermuster wiederholen sich:</p>
<h3 id="1-plattformfunktion-als-kostenstelle-statt-als-werttreiber">1. Plattformfunktion als Kostenstelle statt als Werttreiber</h3>
<p>Das Plattformteam wird als Overhead budgetiert. Die Stellen werden aus
Kostengründen begrenzt. Investitionen in Golden Paths werden auf „nach
der Auslieferung von Feature X“ verschoben. Sechs Monate später hat die
Geschwindigkeit der Plattform nachgelassen, aber die
Kosteneinsparungs-Erzählung bestimmt weiter das Budget.</p>
<p>Lösung: Messen Sie den Wert des Plattformteams in Kennzahlen der
Geschwindigkeit des Produkt-Engineerings (Zeit bis zur Umgebung, Zeit
bis zur Produktion, Fehlerquote der Deployments). Zeigen Sie die
Wirkung in denselben Kennzahlen, mit denen der CFO die Produktivität
der Produktteams bewertet.</p>
<h3 id="2-das-backstage-als-plattform-antipattern">2. Das Backstage-als-Plattform-Antipattern</h3>
<p>Backstage kaufen und das Plattformproblem für gelöst erklären.
Backstage funktioniert als Portal nur, wenn die zugrunde liegenden
Fähigkeiten tatsächlich als Self-Service verfügbar sind.
Enterprise-Organisationen, die Backstage vor dem Plattformsubstrat
kaufen, bekommen schöne Kataloge über betrieblichem Chaos. Die
Adoption stockt.</p>
<p>Lösung: Backstage als Oberfläche für die Nutzer, nachdem das
Plattformsubstrat real existiert. Developer Self-Service von Ænix lässt
sich mit Backstage kombinieren, wenn der Kunde das bevorzugt; das
Cozystack Dashboard funktioniert ebenfalls.</p>
<h3 id="3-aufteilung-ohne-governance">3. Aufteilung ohne Governance</h3>
<p>Mehrere Plattformteams entstehen organisch (jeder Geschäftsbereich baut
seine eigene Plattform). Es gibt keine gemeinsamen Standards. Workloads
zwischen Geschäftsbereichen zu verschieben, ist schwer oder unmöglich.
Engineers können nicht ohne erhebliche Umschulung zwischen
Geschäftsbereichen wechseln.</p>
<p>Lösung: Investieren Sie früh in Governance. Das ARB muss nicht
schwerfällig sein; es muss nur existieren und Entscheidungsbefugnis
haben.</p>
<h3 id="4-die-herstellergeführte-plattform-aus-der-box">4. Die herstellergeführte „Plattform aus der Box“</h3>
<p>Ein großer Hersteller verkauft dem Kunden eine komplette
Platform-Engineering-Lösung. Der Kunde akzeptiert. 18–24 Monate später
funktioniert die Plattform für die Referenzkunden des Herstellers, aber
nicht für diese konkrete Organisation. Der Vendor-Lock-in ist
strukturell, die Kosten für einen Austausch sind enorm.</p>
<p>Lösung: ein Open-Source-Substrat (Cozystack, Vanilla Kubernetes usw.)
mit optionalem kommerziellem Support. Der Kunde behält die
architektonische Hoheit.</p>
<h3 id="5-optimierung-auf-technische-eleganz-statt-auf-die-adoption-durch-produktteams">5. Optimierung auf technische Eleganz statt auf die Adoption durch Produktteams</h3>
<p>Eine architektonisch schöne Plattform, die Produktteams nicht nutzen
wollen. Die Adoption stockt. Das Plattformteam gibt den Produktteams
die Schuld, die Produktteams dem Plattformteam.</p>
<p>Lösung: Interviews mit Produktteams als wiederkehrende Disziplin des
Plattformteams. Messen Sie die Adoption pro Golden Path. Stellen Sie
Pfade ein, die nicht angenommen werden. Bauen Sie Pfade, die dem
entsprechen, was Produktteams tatsächlich anfragen.</p>
<h2 id="was-enterprise-platform-engineering-von-ænix-liefert">Was Enterprise Platform Engineering von Ænix liefert</h2>
<p>Ein typisches Projekt umfasst:</p>
<h3 id="arbeitspaket-1--bestandsaufnahme-des-ist-zustands">Arbeitspaket 1 — Bestandsaufnahme des Ist-Zustands</h3>
<p>Erfassung der bestehenden Plattforminvestitionen: Teams,
Technologie-Stack, Governance-Funktion, Adoptionskennzahlen,
Ausgangswerte für die Zeit bis zur Umgebung. Oft ist das erste
nützliche Artefakt die Bestandsaufnahme selbst — die meisten
Enterprise-Organisationen haben kein einziges Dokument, das den
gesamten Plattform-Footprint abbildet.</p>
<h3 id="arbeitspaket-2--design-des-soll-zustands">Arbeitspaket 2 — Design des Soll-Zustands</h3>
<p>Empfehlung zum Organisationsdesign nach den oben beschriebenen
Mustern. Personalprognosen pro Plattformteam. Design der
Governance-Funktion (ARB-Charta, Entscheidungsrhythmus,
Eskalationswege). Ersteinrichtung des Technologie-Radars.</p>
<h3 id="arbeitspaket-3--plattformsubstrat-auf-basis-von-cozystack-wo-zutreffend">Arbeitspaket 3 — Plattformsubstrat auf Basis von Cozystack (wo zutreffend)</h3>
<p>Grundlegendes Substrat auf der Ænix Private Cloud Platform (für
regulierte Organisationen) oder auf Developer Self-Service (für
produktorientierte Organisationen). Multi-Region, Multi-DC, für Audits
isolierte Umgebungen, Ausrichtung an DORA / NIS2, wo zutreffend.</p>
<p>Dieses Arbeitspaket ist nicht immer Teil des Projekts — manche Kunden
behalten ihr bestehendes Substrat und beauftragen Ænix nur mit
Governance und Disziplin.</p>
<h3 id="arbeitspaket-4--roadmap-der-golden-paths">Arbeitspaket 4 — Roadmap der Golden Paths</h3>
<p>Die 5–15 Golden Paths mit der größten Hebelwirkung für die konkreten
Bedürfnisse der Produktteams des Kunden identifizieren. In eine
Reihenfolge bringen. Gestaffelt ausrollen. Adoptionskennzahlen.</p>
<h3 id="arbeitspaket-5--kompetenztransfer-und-betriebliche-übergabe">Arbeitspaket 5 — Kompetenztransfer und betriebliche Übergabe</h3>
<p>Die Ænix-Engineers reduzieren ihre direkte Beteiligung schrittweise.
Die Platform-Engineering-Funktion des Kunden übernimmt die
Verantwortung. Der Ænix-Retainer läuft für Beratung und Eskalationen unter SLA
(Plus- oder Enterprise-Support-Stufe) weiter.</p>
<h2 id="wann-dieses-projekt-passt">Wann dieses Projekt passt</h2>
<p>Gute Passung:</p>
<ul>
<li>1.000+ Engineers über mehrere Geschäftsbereiche oder Domänen</li>
<li>Eine bestehende Platform-Engineering-Funktion, aber Probleme mit
Governance, Adoption oder teamübergreifender Konsistenz</li>
<li>Rückhalt durch Vorstand oder Geschäftsleitung für eine mehrjährige
Plattforminvestition</li>
<li>Regulatorische Pflichten (Finanzdienstleistungen, öffentlicher Sektor,
Telekommunikation, Energie, Gesundheitswesen)</li>
<li>Betrieb über mehrere Regionen oder Rechtsräume hinweg</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>500–1.000 Engineers — hier passt eher Developer Self-Service
(schlankerer Umfang) als ein vollständiges Enterprise-Platform-Engineering-Projekt</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Kleinere Organisationen — Developer Self-Service oder Leistungen für
Platform Engineering haben den richtigen Umfang</li>
<li>Organisationen mit nur einem Geschäftsbereich, unabhängig von der
Zahl der Engineers — der Governance-Aufwand zahlt sich nicht aus</li>
</ul>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/dienstleistungen/enterprise-platform-engineering/">Leistungen für Enterprise Platform Engineering</a></strong> —
die kommerzielle Landingpage</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-engineering/">Leistungen für Platform Engineering</a></strong> —
der kleinere Umfang</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/internal-developer-platform/">Leistungen rund um die Internal Developer Platform</a></strong> —
das Projekt auf der IDP-Ebene</li>
<li><strong><a href="https://aenix.io/de/loesungen/developer-self-service/">Lösungsseite Developer Self-Service</a></strong> —
für Organisationen mit Fokus auf Produkt-Engineering</li>
<li><strong><a href="https://aenix.io/de/produkte/private-cloud-platform/">Produktseite Private Cloud Platform</a></strong> —
für regulierte Organisationen</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/internal-developer-platform-beispiele-ohne-backstage/">Internal Developer Platform — 6 Muster ohne Backstage-Lock-in</a></strong> —
sechs Muster aus der Produktion</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/platform-engineering-vs-devops-vs-sre/">Reifegradmodell für Platform Engineering</a></strong> —
Reifegradmodell mit fünf Stufen und acht Dimensionen</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/developer-self-service-oekonomie-entwicklungsgeschwindigkeit/">Developer Self-Service — die Ökonomie der Entwicklungsgeschwindigkeit</a></strong> —
der wirtschaftliche Fall für die IDP</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/private-cloud-aufbauen-90-tage-playbook/">Private Cloud aufbauen — 90-Tage-Playbook</a></strong> —
für das Arbeitspaket zum Aufbau des Substrats</li>
</ul>
]]></content:encoded></item><item><title>Cloud-Plattformen für Finanzdienstleister — wie TLPT-Readiness 2026 tatsächlich aussieht</title><link>https://aenix.io/de/blog/2026/05/finanzdienstleister-cloud-tlpt-readiness/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/finanzdienstleister-cloud-tlpt-readiness/</guid><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Financial Services</category><category>DORA</category><category>Compliance</category><category>Sovereignty</category><category>Cozystack</category><description>Wie TLPT-Readiness unter DORA 2026 tatsächlich aussieht — für Platform Engineers bei Banken, Versicherern und Zahlungsinstituten vor einem echten Prüfzyklus.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/finanzdienstleister-cloud-tlpt-readiness.jpg" alt=""></p><p>Die DORA-Diskussion zerfiel in den meisten Finanzinstituten 2024–2025
in zwei Hälften. Die erste Hälfte — Governance, Richtlinien,
Dokumentation des IKT-Risikomanagements — landete bei Rechtsabteilung,
Compliance und CISO. Als DORA am 17. Januar 2025 in Kraft trat, war
diese Dokumentation bei den meisten regulierten Unternehmen in
ordentlichem Zustand.</p>
<p>Um die zweite Hälfte — die Cloud-Architektur <em>nachweisbar</em>
an DORA auszurichten, wenn ein echter TLPT-Zyklus ansteht — war es
stiller. Diese Stille bricht 2026 auf. TLPT-Übungen der Aufsicht
erreichen inzwischen Architekturen, die beim Start von DORA als konform
galten, aber nie unter realistischer Prüfung durch die Aufsicht
getestet wurden.</p>
<h2 id="was-tlpt-bedeutet-und-warum-es-jetzt-zählt">Was TLPT bedeutet und warum es jetzt zählt</h2>
<p>Threat-Led Penetration Testing (TLPT) ist unter DORA für bedeutende
Finanzunternehmen vorgeschrieben. Alle drei Jahre führt ein externer
Testdienstleister eine strukturierte Red-Team-Übung gegen die laufende
Produktionsumgebung durch, wobei das CSIRT / SOC des Finanzunternehmens
als echter Verteidiger behandelt wird.</p>
<p>Es geht nicht darum, Schwachstellen zu finden (das leistet jeder
Pentest). Es geht darum, die operationale Resilienz unter realistischen
Angriffsszenarien nachzuweisen — dass Menschen, Prozesse und
Infrastruktur des Unternehmens innerhalb der von DORA erwarteten
Fristen erkennen, reagieren und wiederherstellen können.</p>
<p>Für Platform Engineers zählen drei Fragen der TLPT-Readiness:</p>
<ol>
<li><strong>Erkennung im Takt der Meldefristen.</strong> DORA Artikel 17–19 setzen
für die Erstmeldung eines schwerwiegenden IKT-bezogenen Vorfalls
eine kurze Frist, und NIS2 Artikel 23 legt für Unternehmen, die unter
beide Regelwerke fallen, eine Frühwarnung binnen 24 Stunden fest.
Ist Ihre Detection-Telemetrie auf Performance statt auf Sicherheit
abgestimmt, ist jede dieser Fristen eine Fiktion.</li>
<li><strong>Vollständigkeit des Audit-Trails.</strong> DORA Artikel 6 verlangt einen
dokumentierten Rahmen für das IKT-Risikomanagement, den Sie der
Aufsicht <em>mit Nachweisen</em> belegen können — welche Kontrollen zum
Zeitpunkt des Vorfalls in Kraft waren. Dokumentation reicht nicht;
die Messlatte sind Nachweise aus dem laufenden System.</li>
<li><strong>Eindämmung und Wiederherstellung.</strong> TLPT-Übungen spielen reale
Angriffsmuster ein. Die Network Policies, das Identitätsmodell und
die Isolationsgrenzen der Plattform müssen realistischen Versuchen
von Lateral Movement und Persistenz standhalten.</li>
</ol>
<h2 id="wie-eine-dora-fähige-architektur-tatsächlich-aussieht">Wie eine „DORA-fähige Architektur“ tatsächlich aussieht</h2>
<p>Eine belastbare Cloud-Architektur für Finanzdienstleister hat sechs
Eigenschaften, auf die die Aufsicht achtet:</p>
<h3 id="1-auf-sicherheit-abgestimmte-detection-telemetrie">1. Auf Sicherheit abgestimmte Detection-Telemetrie</h3>
<p>Die meisten Banken, mit denen wir arbeiten, haben eine reichhaltige
Performance-Telemetrie und eine von Alert Fatigue geplagte
Sicherheitstelemetrie. Das Verhältnis der Alerts stimmt nicht: zu viel
Performance-Rauschen, zu wenig Signal bei den Sicherheitsereignissen,
die einem meldepflichtigen Vorfall nach DORA Artikel 18–19 (und NIS2
Artikel 23, wo beide gelten) entsprechen.</p>
<p>Lösungsmuster:</p>
<ul>
<li>Kuratierte Alert-Regeln, abgestimmt auf die für Cloud-Infrastruktur
relevanten MITRE-ATT&amp;CK-Techniken</li>
<li>Logs fließen aus VictoriaLogs / VictoriaMetrics (selbst gehostet, im
eigenen Rechtsraum) in ein SIEM, das das SOC tatsächlich überwacht</li>
<li>Erkennung rund um die Uhr (24×7) mit dokumentierter Eskalation</li>
<li>Alert-Hygiene als wiederkehrende Aufgabe</li>
</ul>
<p>Die Ænix Private Cloud Platform liefert VictoriaMetrics und
VictoriaLogs standardmäßig für Telemetrie in Sicherheitsqualität
konfiguriert aus, dazu sicherheitsorientierte Alert-Regeln. Die
Anbindung an das SIEM des Kunden ist Projektarbeit.</p>
<h3 id="2-workload-identität-statt-weit-offener-service-accounts">2. Workload-Identität statt weit offener Service Accounts</h3>
<p>Die Standard-Service-Accounts von Kubernetes sind weit offen. In einer
an DORA ausgerichteten Architektur hat jeder Workload eine Identität,
jede Identität ist eng begrenzt, und jeder Aufruf zwischen Diensten
ist authentifiziert und autorisiert.</p>
<p>Muster: SPIFFE/SPIRE für die Workload-Identität, External Secrets
Operator mit dem Schlüsselspeicher des Kunden als Backend, Pod Security Standards als
durchgesetzte Policy. Das Ænix-Projekt umfasst die Integration; der IdP
und die Mitarbeiteridentität des Kunden bleiben unter Kontrolle des
Kunden.</p>
<h3 id="3-tenant-crd-isolation-als-strukturelle-antwort-auf-das-konzentrationsrisiko">3. Tenant-CRD-Isolation als strukturelle Antwort auf das Konzentrationsrisiko</h3>
<p>Artikel 29 bewertet das Konzentrationsrisiko anhand der tatsächlichen
Resilienz, nicht anhand vertraglicher Diversifizierung. Das
Tenant-CRD-Modell bietet Isolation auf Namespace-Ebene pro
Geschäftsfunktion, pro Datenklasse und pro Kritikalitätsstufe — mit
Quotas, RBAC-Geltungsbereich, Observability-Geltungsbereich und
Audit-Trail-Geltungsbereich pro Tenant.</p>
<p>Das ist keine „weiche Mandantenfähigkeit nach dem Prinzip Hoffnung“.
Das Tenant CRD ist ein Kubernetes-natives Objekt, das der
cozystack-controller abgleicht; der laufende Zustand entspricht der
Spezifikation, oder der Operator macht die Abweichung sichtbar.</p>
<h3 id="4-für-audits-isolierte-umgebungen">4. Für Audits isolierte Umgebungen</h3>
<p>Kritische Workloads laufen in Tenants, die ausdrücklich für Audits
isoliert sind: getrennte Cluster von nicht produktiven Workloads,
manipulationssicheres Logging, das das Audit-Team des Kunden
unabhängig nachvollziehen kann, keine gemeinsame Infrastruktur zwischen
auditrelevanten und nicht auditrelevanten Workloads.</p>
<p>Das kostet mehr Infrastruktur. Diese Kosten sind der Preis für
belastbare Audit-Nachweise.</p>
<h3 id="5-exit-readiness-mit-geübten-exit-drills">5. Exit-Readiness mit geübten Exit-Drills</h3>
<p>Artikel 28(8) verlangt für Vereinbarungen zu kritischen Funktionen
einen erprobten Exit-Plan. Die Aufsicht erwartet zunehmend einen
teilweisen Exit-Drill innerhalb der letzten 24 Monate.</p>
<p>Die Cozystack-basierte Architektur macht Exit-Drills mechanisch
einfacher: Die Workloads sind Standard-KubeVirt-VMs und
Kubernetes-Ressourcen. Das Ziel des Exits kann „dieselbe
Kubernetes-API auf anderer Hardware oder bei einem anderen Anbieter“
sein. Das Projektmodell von Ænix enthält ein dokumentiertes Playbook
für den Exit-Drill, das Kunden jährlich durchspielen.</p>
<h3 id="6-transparenz-über-die-lieferkette-bis-zur-zweiten-stufe">6. Transparenz über die Lieferkette bis zur zweiten Stufe</h3>
<p>Artikel 30(2)(a) verlangt Einblick in die IKT-Lieferkette mindestens
bis zur zweiten Stufe. Für die Beziehung zum Plattformanbieter steht
Ænix in der Pflicht — wir stellen ein attestiertes Dokument zur
Offenlegung der Lieferanten bereit, das Upstream-Open-Source-Komponenten,
Kanäle für Sicherheitsmeldungen und betriebliche Abhängigkeiten
abbildet.</p>
<p>Jenseits des Plattformanbieters ist der Kunde dafür verantwortlich,
seine eigene Lieferkette abzubilden. Ænix-Projekte enthalten Tooling
für die Erfassung, die Bestandsaufnahme selbst ist aber Arbeit auf
Kundenseite.</p>
<h2 id="wo-die-meisten-cloud-architekturen-von-finanzdienstleistern-noch-zu-kurz-greifen">Wo die meisten Cloud-Architekturen von Finanzdienstleistern noch zu kurz greifen</h2>
<p>Vier wiederkehrende Muster aus unseren Assessments 2025–2026:</p>
<h3 id="lücke-1-observability-verlässt-still-den-regulierten-perimeter">Lücke 1: Observability verlässt still den regulierten Perimeter</h3>
<p>Die Produktionsdatenbank liegt in einer EU-Region, die dem
regulatorischen Mandat entspricht. Die darauf laufende Anwendung
schickt Logs an einen SaaS-Anbieter für Observability, dessen Region
für die Datenverarbeitung standardmäßig in den USA liegt. In jeder
Minute, in der die Anwendung läuft, wandern Anwendungslogs mit
Transaktionsdetails, Kundenkennungen und geschützten Daten in eine
nicht konforme Jurisdiktion.</p>
<p>Die meisten Banken bemerken das erst nach einem Hinweis der Aufsicht.
Dann bedeutet die Behebung entweder, den SaaS-Anbieter auszutauschen
(ein Projekt über mehrere Quartale), oder eine regionale
Datenverarbeitungsvereinbarung auszuhandeln (bei manchen Anbietern
möglich, bei anderen langwierig).</p>
<p>Die architektonische Antwort auf Basis von Cozystack: selbst gehostetes
VictoriaMetrics und VictoriaLogs auf derselben Infrastruktur wie die
Workloads. Damit ist das Residency-Leck beseitigt.</p>
<h3 id="lücke-2-der-exit-plan-existiert-auf-dem-papier-getestet-wurde-er-nie">Lücke 2: Der Exit-Plan existiert auf dem Papier, getestet wurde er nie</h3>
<p>Der Exit-Plan wurde für die Aufsicht geschrieben; geübt hat ihn
niemand. Die Schätzungen zur Dauer eines Exits stammen aus
Tabletop-Übungen und sind nicht an einem Drill kalibriert. Fragt die
Aufsicht „Wann haben Sie den Exit-Plan zuletzt getestet?“, herrscht
Schweigen.</p>
<p>Lösung: jährliche Exit-Drill-Übung mit dokumentiertem Ergebnis. Das
Ænix-Projekt liefert das Playbook; der Kunde führt die Übung durch.</p>
<h3 id="lücke-3-konzentrationsrisiko-als-beschaffungsfrage-behandelt">Lücke 3: Konzentrationsrisiko als Beschaffungsfrage behandelt</h3>
<p>„Wir nutzen AWS in zwei Regionen; wir haben eine Vertragsklausel, die
eine geografische Verteilung unseres Backups vorschreibt.“ Beides
stimmt. Keines von beidem adressiert, was Artikel 29 tatsächlich
bewertet — die materielle architektonische Resilienz gegen den Ausfall
eines einzelnen Anbieters.</p>
<p>Die materielle Antwort: Workloads nutzen Plattformabstraktionen
(Kubernetes, KubeVirt, S3-kompatiblen Storage, relationale
Standarddatenbanken), die es auf mehreren Substraten gibt. Das Ziel des
Exits wird auf Architekturebene benannt, nicht auf juristischer Ebene.</p>
<h3 id="lücke-4-das-risiko-der-unterauftragnehmer-ist-jenseits-der-ersten-stufe-unsichtbar">Lücke 4: Das Risiko der Unterauftragnehmer ist jenseits der ersten Stufe unsichtbar</h3>
<p>Der beauftragte Hyperscaler ist dokumentiert. Seine
Rechenzentrumsbetreiber, Anbieter der Netzwerkanbindung und die
darunterliegenden gemeinsam genutzten Plattformdienste sind es nicht.
Artikel 30(2)(a) verlangt Transparenz bis zur zweiten Stufe.</p>
<p>Bei einer Cozystack-basierten Architektur legt der Plattformanbieter
(Ænix) die Herkunft der Upstream-Komponenten offen. Der
Hardwarelieferant ist die nächste Stufe; alles darüber hinaus liegt in
der Verantwortung des Kunden.</p>
<h2 id="das-projektmodell-von-ænix-für-finanzdienstleister">Das Projektmodell von Ænix für Finanzdienstleister</h2>
<p>Wir gehen Projekte mit Finanzdienstleistern anders an als in anderen
Branchen, weil die Treiber Regulierung und Audit-Readiness die Arbeit
prägen.</p>
<h3 id="phase-0--discovery-und-dora-scoping">Phase 0 — Discovery und DORA-Scoping</h3>
<p>Den regulatorischen Rahmen bestätigen (DORA plus nationale
Zusatzregeln plus sektorale Vorschriften). Die
Kritikalitätsklassifizierung der Workloads bestätigen. Sponsor und
Ansprechpartner für die Kommunikation mit der Aufsicht auf Kundenseite.
Projektmodell (typisch: Ænix übernimmt Beratung und Support unter SLA,
der Kunde den Produktionsbetrieb).</p>
<h3 id="phase-1--platform-readiness-assessment-mit-dora-arbeitspaket">Phase 1 — Platform Readiness Assessment mit DORA-Arbeitspaket</h3>
<p>Assessment über 14 oder 28 Tage zum Festpreis. Architektur-Review
Kontrolle für Kontrolle gegen die Erwartungen aus DORA Artikel 6 und
Artikel 28–30. Ergebnis: ein Bericht von 30–50 Seiten mit
Gap-Analyse, priorisierter Behebung und Zeitplan.</p>
<h3 id="phase-2--pilot-deployment-der-private-cloud-platform">Phase 2 — Pilot-Deployment der Private Cloud Platform</h3>
<p>3–6 Monate. Ein definierter Ausschnitt der Workloads kritischer
Funktionen wird auf die Cozystack-basierte Private Cloud Platform
migriert. Der Nachweiskatalog für die Aufsicht wird teilweise
aufgebaut. Die TLPT-Readiness wird für den Pilotumfang validiert.</p>
<h3 id="phase-3--vollständiger-aufbau-der-private-cloud-platform">Phase 3 — Vollständiger Aufbau der Private Cloud Platform</h3>
<p>3–12 Monate, je nach Workload-Umfang und Multi-DC-Struktur; der
TLPT-Zyklus kann den Zeitpunkt der Abnahme zusätzlich bestimmen. Deployment in Produktionsqualität mit vollständiger
Compliance-Dokumentation als Lieferergebnis. Ænix wirkt an der
TLPT-Vorbereitung mit; den Test selbst führen akkreditierte
Red-Team-Dienstleister durch.</p>
<h3 id="phase-4--managed-retainer">Phase 4 — Managed Retainer</h3>
<p>Ænix-Beratung plus Support der Plus- oder Enterprise-Stufe unter SLA.
Gearbeitet wird über GitOps-PR-Reviews; Fernzugriff auf den
Produktionscluster gibt es nur mit Freigabe des Kunden. Entscheidend für die Governance einer Bank.</p>
<h2 id="wann-dieses-projektmodell-passt">Wann dieses Projektmodell passt</h2>
<p>Gute Passung:</p>
<ul>
<li>Europäische Tier-1- oder Tier-2-Bank mit aktivem DORA-Programm</li>
<li>Versicherer mit regulatorischer Exposition in mehreren Rechtsräumen</li>
<li>Zahlungsinstitut im Überschneidungsbereich von DORA und PSD2/PSD3</li>
<li>Marktinfrastruktur (CSDs, CCPs) unter DORA und CSDR</li>
<li>Ein laufender TLPT-Zyklus, der Arbeit an der Architektur-Readiness
erfordert</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Kleinere Banken, deren Budgetrahmen noch nicht auf ein mehrjähriges
Programm ausgelegt ist; die Public Cloud Platform mit
souveränitätsorientierter Architektur kann eine Brücke sein</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Banken, die sich bereits auf ein mehrjähriges Hyperscaler-Programm
festgelegt haben und diese Entscheidung nicht neu öffnen — Ænix kann
zu konkreten DORA-Architekturlücken im Hyperscaler-Kontext beraten,
die vollständige Private Cloud Platform passt dort aber nicht</li>
</ul>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/branchen/finanzdienstleistungen/">Branchenseite Finanzdienstleistungen</a></strong> —
die kommerzielle Landingpage, ausgehend von den Auslösern</li>
<li><strong><a href="https://aenix.io/de/loesungen/dora-compliance/">Leistungen zur DORA-Compliance</a></strong> —
die DORA-Landingpage aus Sicht des Einkäufers</li>
<li><strong><a href="https://aenix.io/de/produkte/private-cloud-platform/">Produktseite Private Cloud Platform</a></strong> —
das Produkt für regulierte Unternehmen</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/dora-checkliste-cloud-architektur/">DORA-Compliance-Checkliste für Cloud-Infrastruktur</a></strong> —
DORA-Durchgang auf Architekturebene</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/private-cloud-platform-dora-nis2-architektur/">Private Cloud Platform — DORA- und NIS2-Pflichten in der Architektur</a></strong> —
architektonische Details auf Produktebene</li>
<li><strong><a href="https://aenix.io/de/ressourcen/dora-compliance-checkliste/">DORA-Compliance-Checkliste</a></strong> —
Checkliste der Kontrollen zum Herunterladen</li>
</ul>
]]></content:encoded></item><item><title>Private Cloud Platform für die regulierte Cloud — DORA- und NIS2-Pflichten in der laufenden Architektur</title><link>https://aenix.io/de/blog/2026/05/private-cloud-platform-dora-nis2-architektur/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/private-cloud-platform-dora-nis2-architektur/</guid><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DORA</category><category>Financial Services</category><category>Compliance</category><category>Sovereignty</category><category>Multi-tenancy</category><category>Cozystack</category><description>Wie sich IKT-Risiko- und Drittparteienpflichten aus DORA und die Maßnahmen nach NIS2 Artikel 21(2) auf eine belastbare Cloud-Architektur abbilden lassen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/private-cloud-platform-dora-nis2-architektur.jpg" alt=""></p><p>Cloud-Architektur für regulierte Unternehmen ist 2026 ein anderes
Gespräch als 2022. DORA gilt seit dem 17. Januar 2025. Die Frist zur
Umsetzung von NIS2 ist im Oktober 2024 abgelaufen. Die Erwartungen der
Aufsicht werden mit jedem TLPT-Zyklus schärfer. Das Muster aus der Zeit
vor DORA — eine Hyperscaler-Region mit ein paar Vertragsklauseln — hält
einer realistischen Prüfung nicht stand.</p>
<h2 id="die-zehn-maßnahmenbereiche--nis2-artikel-212-und-wo-dora-sie-trifft">Die zehn Maßnahmenbereiche — NIS2 Artikel 21(2) und wo DORA sie trifft</h2>
<p>NIS2 Artikel 21(2) verlangt „geeignete und verhältnismäßige technische,
operative und organisatorische Maßnahmen“ in zehn aufgezählten
Bereichen. DORA deckt weitgehend dasselbe Terrain auf anderem Weg ab:
über den Rahmen für das IKT-Risikomanagement (Artikel 5–16,
insbesondere Artikel 6), das Management und die Meldung von Vorfällen
(Artikel 17–23) und das IKT-Drittparteienrisiko (Artikel 28–30). Ein
reguliertes Unternehmen, das unter beide Regelwerke fällt, betreibt
nicht zwei Architekturen — es betreibt eine und weist sie zweimal nach.
Die zehn Bereiche unten folgen der Aufzählung in NIS2; wo DORA dieselbe
Kontrolle in einem anderen Artikel regelt, ist dieser genannt.</p>
<p>Für Platform Engineers übersetzen sich die zehn Bereiche in konkrete
Architekturentscheidungen:</p>
<h3 id="1-konzepte-für-risikoanalyse-und-sicherheit-der-informationssysteme">1. Konzepte für Risikoanalyse und Sicherheit der Informationssysteme</h3>
<p>Folge für die Architektur: Jeder Workload einer kritischen Funktion hat
einen dokumentierten Eintrag im Risikoregister. Die Artefakte des
Threat Models liegen beim Workload (nicht in einem separaten
„Compliance-System“, das auseinanderdriftet). Pod Security Standards
und Kubernetes Network Policies setzen die technischen Kontrollen um,
die das Risikoregister benennt.</p>
<h3 id="2-bewältigung-von-sicherheitsvorfällen">2. Bewältigung von Sicherheitsvorfällen</h3>
<p>Die Erkennung muss innerhalb der Meldefristen nach NIS2 Artikel 23
funktionieren: Frühwarnung binnen 24 Stunden, Meldung des Vorfalls
binnen 72 Stunden, Abschlussbericht nach einem Monat. DORA regelt das
in den Artikeln 17–19 eigenständig — Klassifizierung nach Artikel 18,
Meldung schwerwiegender IKT-bezogener Vorfälle an die zuständige
Behörde nach Artikel 19 — mit Fristen, die in den technischen
Durchführungsstandards festgelegt sind und nicht im Artikeltext selbst.
Bauen Sie die Erkennung auf die strengere der beiden Vorgaben aus; die
Architektur ist in beiden Fällen dieselbe. Der Engpass in der Praxis
ist die Detection-Telemetrie — Alert Fatigue überdeckt das Signal. Die
Private Cloud Platform wird mit VictoriaMetrics und VictoriaLogs sowie
kuratierten Alert-Regeln ausgeliefert, die auf Sicherheit abgestimmt
sind, nicht nur auf Performance.</p>
<h3 id="3-aufrechterhaltung-des-betriebs">3. Aufrechterhaltung des Betriebs</h3>
<p>RTO und RPO sind pro kritischem Workload dokumentiert <em>und werden
jährlich getestet</em> — mit Telemetrie, die das Testergebnis belegt. Reine
Backups reichen nicht. Die Private Cloud Platform enthält Velero plus
anwendungsspezifische Muster (PostgreSQL PITR, Kafka-Snapshots usw.)
sowie Hooks für Chaos Engineering zur kontrollierten Fehlerinjektion.</p>
<h3 id="4-sicherheit-der-lieferkette">4. Sicherheit der Lieferkette</h3>
<p>Die anspruchsvollste Anforderung im Drittparteienkapitel von DORA
(Artikel 28–30): IKT-Drittparteienvereinbarungen werden erfasst, nach
Kritikalität klassifiziert, und die Kette der Unterauftragnehmer wird
nach Artikel 30(2)(a) bis zur <em>zweiten Stufe</em> abgebildet. Die Private
Cloud Platform liefert Ihnen die Anbieterbeziehung, für die Ænix
einstehen kann (wir sind der Plattformanbieter); das Open-Source-Fundament
(Cozystack) schafft Transparenz bis auf die Ebene der
Upstream-Komponenten. Alles darüber hinaus liegt in der Verantwortung
des Kunden.</p>
<h3 id="5-sicherheit-bei-erwerb-entwicklung-und-wartung">5. Sicherheit bei Erwerb, Entwicklung und Wartung</h3>
<p>SAST/DAST in der CI, Container-Scanning plus SBOM, Schwachstellenmanagement
mit dokumentiertem SLA, veröffentlichte Disclosure-Policy. Die Private
Cloud Platform bringt die Disziplin auf Betreiberseite mit; die
Pipelines des Kunden werden angebunden.</p>
<h3 id="6-bewertung-der-wirksamkeit">6. Bewertung der Wirksamkeit</h3>
<p>Für wesentliche Einrichtungen erwartet die Aufsicht eine jährliche
externe Bewertung. Die Dokumentation der Private Cloud Platform folgt
den Arbeitsformaten, mit denen die Aufsicht arbeitet — Mapping auf
Kontrollebene, Nachweiskatalog, vollständiger Audit-Trail.</p>
<h3 id="7-cyberhygiene-und-schulungen">7. Cyberhygiene und Schulungen</h3>
<p>Nicht Teil der Plattform selbst, aber Teil der Aufgaben des
Betriebsteams beim Kunden. Ænix kann den Kubernetes Deep Dive Course als
Teil des Projekts liefern (separates Produkt).</p>
<h3 id="8-kryptografie">8. Kryptografie</h3>
<p>Die Verschlüsselung ruhender Volumes ist pro Storage-Klasse verfügbar
und wird beim Design aktiviert (Opt-in). Schlüsselverwaltung, Rotation
und Notfallzugriff entwerfen und dokumentieren wir gemeinsam mit Ihnen.
Secrets lassen sich über den External Secrets Operator aus dem
Schlüsselspeicher des Kunden beziehen.</p>
<h3 id="9-personalsicherheit-zugriffskontrolle-und-asset-management">9. Personalsicherheit, Zugriffskontrolle und Asset-Management</h3>
<p>Workload-Identität über SPIFFE/SPIRE oder Gleichwertiges. Privileged
Access Management. Automatisierter Joiner-Mover-Leaver-Prozess.
Vollständiges und aktuelles Asset-Register. Die Private Cloud Platform
wird mit dem cozystack-controller ausgeliefert, der das Asset-Register
als Kubernetes-natives Objekt führt — ohne Abweichung zwischen Policy
und laufendem Zustand.</p>
<h3 id="10-mfa-kontinuierliche-authentifizierung-gesicherte-kommunikation">10. MFA, kontinuierliche Authentifizierung, gesicherte Kommunikation</h3>
<p>Mindestens MFA auf allen privilegierten Konten. Der Enterprise-Tier des
Ænix-Supports verlangt MFA für jeden Cluster-Zugriff auf Kundenseite.
Gesicherte Notfallkommunikation über den Supportkanal selbst.</p>
<h2 id="dora-artikel-2830--die-lieferantenrisiko-dimension-an-der-die-meisten-setups-scheitern">DORA Artikel 28–30 — die Lieferantenrisiko-Dimension, an der die meisten Setups scheitern</h2>
<p>Im Drittparteienkapitel von DORA haben die meisten Banken und
Versicherer, mit denen wir arbeiten, die größten Lücken. Drei Muster
wiederholen sich:</p>
<h3 id="muster-1--observability-daten-verlassen-still-den-regulierten-perimeter">Muster 1 — Observability-Daten verlassen still den regulierten Perimeter</h3>
<p>Die Produktionsdatenbank liegt in einer EU-Region, die dem
regulatorischen Mandat entspricht. Die darauf laufende Anwendung
schickt Logs und Metriken an einen SaaS-Anbieter für Observability —
Datadog, New Relic, Splunk Cloud —, dessen Region für die
Datenverarbeitung standardmäßig in den USA liegt. Anwendungslogs mit
Transaktionsdetails, Kundenkennungen und geschützten Daten wandern in
jeder Minute, in der die Anwendung läuft, in eine nicht konforme
Jurisdiktion.</p>
<p>Die Drittparteienanforderungen von DORA gelten für die <em>gesamte
IKT-Drittparteienvereinbarung</em> — Observability-Tools eingeschlossen.
Prüfungen der Aufsicht decken das zunehmend auf; herkömmliche
„Richtlinien zur Datenklassifizierung“ nicht. Die Private Cloud
Platform ersetzt SaaS-Observability durch selbst gehostetes
VictoriaMetrics und VictoriaLogs auf derselben Infrastruktur des
Kunden. Damit ist das häufigste Residency-Leck beseitigt.</p>
<h3 id="muster-2--exit-pläne-auf-dem-papier-nie-getestet">Muster 2 — Exit-Pläne auf dem Papier, nie getestet</h3>
<p>Artikel 28(8) verlangt für Vereinbarungen zu kritischen Funktionen einen
dokumentierten Exit-Plan mit <em>erprobter Durchführbarkeit</em>. Die meisten
Unternehmen haben einen Plan; deutlich weniger haben ihn geübt. Die
Aufsicht fragt inzwischen nach einer Übung innerhalb der letzten 24
Monate.</p>
<p>Das Open-Source-Fundament der Private Cloud Platform macht den Exit-Test
mechanisch einfacher: Die Workloads sind Standard-KubeVirt-VMs und
Kubernetes-Ressourcen. Das Ziel des Exits kann „dieselbe
Kubernetes-API auf anderer Hardware oder bei einem anderen Anbieter“
sein statt einer kompletten Migration. Das Projektmodell von Ænix
enthält ein dokumentiertes Playbook für die Exit-Übung, das Kunden
jährlich durchspielen.</p>
<h3 id="muster-3--konzentrationsrisiko-als-beschaffungsfrage-behandelt">Muster 3 — Konzentrationsrisiko als Beschaffungsfrage behandelt</h3>
<p>Konzentrationsrisiko wird oft erkannt und dann über vertragliche
Diversifizierungsklauseln „gemindert“. Die eigentliche Bedingung —
Workloads, die architektonisch über mehrere Anbieter verteilt sind — ist
meist nicht erfüllt. Artikel 29 bewertet das Konzentrationsrisiko
anhand der tatsächlichen Gegebenheiten, nicht anhand der
Beschaffungsformalitäten.</p>
<p>Die Architektur der Private Cloud Platform löst die Konzentration von
sich aus auf: Die Beziehung zum Cloud-Anbieter beschränkt sich auf
Hardware und Bandbreite, nicht auf Plattformdienste. Die Abbildung der
Unterauftragnehmer wird drastisch kürzer. Souveränität wird zu einer
Frage der Architektur statt des Vertrags.</p>
<h2 id="was-die-private-cloud-platform-zusätzlich-zur-public-cloud-platform-mitbringt">Was die Private Cloud Platform zusätzlich zur Public Cloud Platform mitbringt</h2>
<p>Mehrere Ebenen speziell für regulierte Unternehmen:</p>
<ul>
<li><strong>Air-Gap-Installation</strong>, dokumentiert und als vollwertiger
Deployment-Modus unterstützt. Updates laufen über kontrollierte Kanäle
(Harbor-Mirror, Artefakt-Registry auf Kundenseite, manuelle
Freigabe). Geeignet für Umgebungen mit Verschlusssachen und für die
sensibelsten Bank-Workloads.</li>
<li><strong>Multi-DC aktiv/passiv oder aktiv/aktiv</strong> — die Private Cloud Platform wird in der
Regel in zwei oder mehr Rechenzentren ausgerollt, mit
rechenzentrumsübergreifender Replikation, die auf die RTO-/RPO-Ziele
abgestimmt ist. Ein VM-Failover zwischen Standorten ist ein geprobtes
Runbook, kein automatischer Schalter.</li>
<li><strong>Zugriff nach Ihrer Wahl</strong> — Beratung, Runbooks und GitOps-PR-Reviews
brauchen keinen Zugriff auf Ihren Produktionscluster. Wo Ihre
Support-Stufe es vorsieht, gibt es Fernzugriff auf Ihre Cluster nur
mit Ihrer Freigabe.
Entscheidend für Banken, bei denen ein Zugriff des Anbieters ein
strukturelles Risiko darstellt.</li>
<li><strong>Anbindung an den Schlüsselspeicher des Kunden</strong> — Secrets kommen
über den External Secrets Operator aus dem System des Kunden; die
genaue Schlüsselarchitektur wird im Projekt festgelegt.</li>
<li><strong>Für Audits isolierte Umgebungen</strong> — getrennte Cluster für
Produktion, Audit und forensische Kopie. Audit-Logs lassen sich in
einen unveränderlichen Speicher des Kunden ausleiten.</li>
<li><strong>Compliance-Dokumentation als Lieferergebnis</strong> — zum Projektabschluss
erhält der Kunde einen Nachweiskatalog Kontrolle für Kontrolle,
ausgerichtet an den Erwartungen der Aufsicht zu DORA und NIS2.</li>
</ul>
<h2 id="was-in-der-verantwortung-des-kunden-bleibt">Was in der Verantwortung des Kunden bleibt</h2>
<p>Die Private Cloud Platform ist <em>architektonisch an DORA und NIS2
ausgerichtet</em>. Sie ist keine Zertifizierung. Mehrere Pflichten bleiben
beim Kunden:</p>
<ul>
<li><strong>Interne Governance</strong> — Berichterstattung an den Vorstand,
Risikomanagement-Ausschuss, IKT-Risikofunktion. Außerhalb des
Plattformumfangs.</li>
<li><strong>Sektorale Zusatzregeln</strong> — Bankgeheimnis, Versicherungsaufsicht,
Gesetze zu Gesundheitsdaten. Sie neben DORA auszulegen, liegt in der
Verantwortung des Kunden.</li>
<li><strong>Das Audit selbst</strong> — die Private Cloud Platform liefert Ihnen eine
belastbare Architektur und die Nachweise; den Auditzyklus
durchzuführen, ist Aufgabe Ihres Audit-Teams.</li>
<li><strong>Workload-spezifische Risikoentscheidungen</strong> — die Private Cloud
Platform liefert das Fundament; welche Workloads kritisch sind, wie
sie klassifiziert werden und welches Restrisiko Sie akzeptieren,
entscheiden Sie.</li>
</ul>
<h2 id="wann-die-private-cloud-platform-die-richtige-antwort-ist">Wann die Private Cloud Platform die richtige Antwort ist</h2>
<p>Gute Passung:</p>
<ul>
<li>Sie sind in einem regulierten Sektor tätig (Finanzdienstleistungen,
öffentlicher Sektor, Gesundheitswesen, Energie, Telekommunikation)
mit Pflichten aus DORA, NIS2 oder sektoralen Zusatzregeln.</li>
<li>Es gibt eine Entscheidung auf Vorstandsebene, Workloads kritischer
Funktionen vom Hyperscaler zu holen.</li>
<li>Sie können ein mehrjähriges Plattformprogramm budgetieren, dessen
Umfang im Scoping festgelegt wird.</li>
<li>Sie haben ein Plattformteam von 5–10 Engineers für den Betrieb der
Infrastruktur oder können es aufbauen.</li>
<li>In den nächsten 12–18 Monaten besteht sektoraler Druck in Richtung
TLPT, Audit der Lieferkette oder Exit-Readiness.</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>Mittelgroße Organisationen, bei denen der regulatorische Druck real
ist, das Budget für ein mehrjähriges Programm aber noch fehlt. Die
Public Cloud Platform mit souveränitätsorientierter Architektur kann
eine Brücke sein.</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Organisationen ohne regulatorischen Druck. Nutzen Sie ein anderes
Produkt (Developer Self-Service oder Cozystack Enterprise Support) —
der Compliance-Aufwand der Private Cloud Platform zahlt sich ohne den
Treiber Regulierung nicht aus.</li>
</ul>
<h2 id="ablauf-der-zusammenarbeit">Ablauf der Zusammenarbeit</h2>
<ul>
<li><strong>Discovery Call</strong> (30 Min., kostenlos)</li>
<li><strong>Platform Readiness Assessment</strong> (14 oder 28 Tage, Schwerpunkt auf
dem Arbeitspaket DORA / NIS2) — Gap-Analyse auf Kontrollebene gegen
die aktuelle Architektur</li>
<li><strong>Pilot</strong> (3–6 Monate) — ein definierter Ausschnitt wird auf die Ænix
Private Cloud Platform migriert, der Nachweiskatalog für die Aufsicht
teilweise aufgebaut</li>
<li><strong>Vollständiger Aufbau der Private Cloud Platform</strong> (3–12 Monate je nach Umfang) —
Multi-DC-Deployment in Produktionsqualität mit vollständiger
Compliance-Dokumentation</li>
<li><strong>Managed Retainer</strong> (fortlaufend) — Beratung, Runbooks, Review von
GitOps-PRs, Incident Response unter SLA</li>
</ul>
<p>Zeitrahmen: 30-minütiges Discovery-Gespräch, Assessment über 14 oder
28 Tage, danach 3–12 Monate Aufbau je nach Umfang. Bei großen Banken
bestimmen TLPT-Zyklus und Abnahmen durch die Aufsicht zusätzlich, wann
der Produktivbetrieb beginnt.</p>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/produkte/private-cloud-platform/">Landingpage Private Cloud Platform</a></strong> —
Funktionsübersicht, produktspezifisches FAQ, Kundennachweise</li>
<li><strong><a href="https://aenix.io/de/loesungen/dora-compliance/">Leistungen zur DORA-Compliance</a></strong> —
Details zu DORA-orientierten Projekten</li>
<li><strong><a href="https://aenix.io/de/loesungen/nis2-compliance/">Leistungen zur NIS2-Compliance</a></strong> —
Details zu NIS2-orientierten Projekten</li>
<li><strong><a href="https://aenix.io/de/ressourcen/dora-compliance-checkliste/">DORA-Compliance-Checkliste</a></strong> —
kostenlose Checkliste der Kontrollen zum Herunterladen</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/dora-checkliste-cloud-architektur/">DORA-Compliance-Checkliste für Cloud-Infrastruktur</a></strong> —
ausführlicherer DORA-Durchgang auf Architekturebene</li>
</ul>
]]></content:encoded></item><item><title>Developer-Experience-Plattformen — Self-Service-Pfade bauen, die tatsächlich genutzt werden</title><link>https://aenix.io/de/blog/2026/05/developer-experience-plattform-self-service-pfade/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/developer-experience-plattform-self-service-pfade/</guid><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Backstage</category><category>Kubernetes</category><description>Die zehn Golden Paths, die sich am meisten lohnen, die fünf Merkmale, mit denen sie funktionieren, und die Architekturentscheidungen hinter Self-Service.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/developer-experience-plattform-self-service-pfade.jpg" alt=""></p><p>Die meisten Artikel zur „Developer Experience“ hören 2026 bei „Nehmen Sie Backstage“ auf. Das ist keine Antwort, sondern eine Tooling-Entscheidung, die nach den Architekturentscheidungen kommt. Und die Architekturentscheidungen bestimmen, ob Self-Service-Pfade tatsächlich funktionieren.</p>
<h2 id="warum-self-service-der-hebel-ist">Warum Self-Service der Hebel ist</h2>
<p>In einer Organisation mit 200 Engineers kostet eine Wartezeit von 2–5 Wochen bis zur Bereitstellung einer Umgebung rund 5 % der Engineering-Produktivität (grobe Schätzung aus unseren Projekten). Diese Zeit auf Stunden zu verkürzen, rechtfertigt die Investition in die Plattform.</p>
<p>Die Einsparungen werden aber nur realisiert, wenn die Produktteams die Self-Service-Pfade tatsächlich nutzen. Eine Plattform, die technisch Self-Service bietet, im Betrieb aber umständlich ist, wird nicht angenommen; Teams schreiben weiter Tickets, weil Tickets sich verlässlich anfühlen.</p>
<p>Die Adoption ist die Kennzahl. Die Architekturentscheidungen leiten sich daraus ab.</p>
<h2 id="fünf-merkmale-von-golden-paths-die-funktionieren">Fünf Merkmale von Golden Paths, die funktionieren</h2>
<h3 id="1-schneller-als-die-alternative-per-ticket">1. Schneller als die Alternative per Ticket</h3>
<p>Der Self-Service-Pfad liefert schneller ein funktionierendes Ergebnis als ein Ticket. Dauert ein Ticket 3 Tage und der Self-Service 2 Tage, wählen Teams das Ticket, weil Warten bequemer ist als Lernen.</p>
<h3 id="2-verlässlich-genug-um-ihm-zu-vertrauen">2. Verlässlich genug, um ihm zu vertrauen</h3>
<p>Der Self-Service-Pfad funktioniert für den dokumentierten Anwendungsfall beim ersten Mal und jedes Mal. Bricht er in einem von zehn Fällen, verlieren Teams das Vertrauen.</p>
<h3 id="3-auf-höchstens-einer-seite-dokumentiert">3. Auf höchstens einer Seite dokumentiert</h3>
<p>Eine Dokumentation, die länger als eine Seite ist, deutet auf eine falsche Architektur hin. Echte Golden Paths sind von vornherein einfach.</p>
<h3 id="4-im-besitz-eines-echten-teams">4. Im Besitz eines echten Teams</h3>
<p>Ein Team, das den Pfad pflegt, Sonderfälle auffängt und Verbesserungen ausliefert. Ohne klare Verantwortung verfallen Pfade.</p>
<h3 id="5-mit-ausweichmöglichkeiten">5. Mit Ausweichmöglichkeiten</h3>
<p>Produktteams können abweichen, wenn ihr Fall besonders ist. Die Ausweichmöglichkeit ist ein echtes Gespräch mit dem Plattformteam, nicht „Nutzen Sie den Pfad oder scheitern Sie“.</p>
<h2 id="die-10-pfade-die-sich-am-meisten-lohnen">Die 10 Pfade, die sich am meisten lohnen</h2>
<p>Grob nach Hebelwirkung sortiert:</p>
<ol>
<li><strong>Bereitstellung von Umgebungen</strong> — Dev / Staging / Preview / Prod. Der größte einzelne Gewinn durch Self-Service.</li>
<li><strong>Anwendungs-Deployment</strong> — Image-Push → automatisiertes Deployment.</li>
<li><strong>Bereitstellung von Datenbanken</strong> — am häufigsten Managed PostgreSQL; danach MySQL und Redis.</li>
<li><strong>Onboarding in die Observability</strong> — automatisch instrumentierte Metriken, Logs und Traces.</li>
<li><strong>Object-Storage-Bucket</strong> — S3-kompatibel, mit Lifecycle-Policies.</li>
<li><strong>Secrets-Management</strong> — Anlegen von Secrets und Zuweisen von Zugriffen.</li>
<li><strong>Netzwerkzugang</strong> — zu Legacy-Diensten, gemeinsam genutzten Datenbanken und Partnern.</li>
<li><strong>Einrichtung von CI/CD-Pipelines</strong> — Service-Template plus automatisierte Pipeline.</li>
<li><strong>Identity-/SSO-Integration</strong> — von der Mitarbeiteridentität zur Serviceidentität.</li>
<li><strong>Einrichtung von Backup/DR</strong> — für zustandsbehaftete Workloads.</li>
</ol>
<p>Die ersten drei (Umgebung, Deployment, Datenbank) decken rund 60 % des typischen Anfragevolumens von Produktteams ab. Bauen Sie diese zuerst.</p>
<h2 id="architekturentscheidungen-die-self-service-prägen">Architekturentscheidungen, die Self-Service prägen</h2>
<h3 id="bereitstellungsmodell">Bereitstellungsmodell</h3>
<ul>
<li><strong>GitOps + IaC</strong> — Produktteams committen IaC-Manifeste, die Plattform reagiert darauf. 2026 am weitesten verbreitet.</li>
<li><strong>API-getrieben</strong> — die Plattform stellt eine REST-/RPC-API bereit; Produktteams rufen sie direkt oder über ein Portal auf.</li>
<li><strong>Operator-getrieben</strong> — Kubernetes-Operatoren pro Ressourcentyp; Produktteams legen CRD-Instanzen an.</li>
<li><strong>Click-Ops über ein Portal</strong> — Backstage / Port / eigene UI, die Operator-gestützte Aktionen bereitstellt.</li>
</ul>
<p>Die meisten Organisationen kombinieren mehrere Modelle: GitOps plus IaC als Source of Truth, das Portal als Ebene zum Auffinden für Teams, die sich in Kubernetes nicht zu Hause fühlen.</p>
<h3 id="mandantenmodell">Mandantenmodell</h3>
<ul>
<li><strong>Namespace pro Team</strong> — weiche Isolation, am einfachsten, Standard für Organisationen, in denen sich die Teams gegenseitig vertrauen.</li>
<li><strong>Cluster pro Team</strong> — harte Isolation, im Betrieb teuer, nötig für Fälle mit hohen Isolationsanforderungen.</li>
<li><strong>Tenant CRD pro Team</strong> — Kubernetes-native Isolation in einem gemeinsamen Cluster, im Betrieb effizient. Standard in Cozystack.</li>
</ul>
<h3 id="identitätsmodell">Identitätsmodell</h3>
<p>Die Mitarbeiteridentität (Keycloak / Okta / Azure AD) wird in die Plattformidentität föderiert. Die Serviceidentität (SPIFFE/SPIRE oder Service Accounts) regelt die Kommunikation zwischen Diensten. Beides zusammenzuführen, ist Aufgabe des Plattformteams.</p>
<h2 id="was-schiefgeht">Was schiefgeht</h2>
<h3 id="fallstrick-1-backstage-als-die-plattform">Fallstrick 1: Backstage als die Plattform</h3>
<p>Wer Backstage kauft, bevor die zugrunde liegenden Fähigkeiten als Self-Service verfügbar sind, bekommt einen schönen Katalog über demselben betrieblichen Chaos. Die Adoption stockt.</p>
<h3 id="fallstrick-2-zu-starr">Fallstrick 2: zu starr</h3>
<p>Golden Paths müssen 80 % der Fälle abdecken. Die übrigen 20 % brauchen Ausweichmöglichkeiten; ohne sie umgehen Teams mit speziellen Anforderungen die Plattform komplett.</p>
<h3 id="fallstrick-3-pfade-ohne-personal">Fallstrick 3: Pfade ohne Personal</h3>
<p>Das Plattformteam baut Pfade und wendet sich dann anderem zu. Die Pfade verfallen, Fehlermeldungen stapeln sich. Die Teams verlieren das Vertrauen.</p>
<h3 id="fallstrick-4-optimierung-auf-technische-eleganz">Fallstrick 4: Optimierung auf technische Eleganz</h3>
<p>Architektonisch schöner Self-Service, der im Betrieb umständlich ist. Produktteams interessieren sich für Ergebnisse, nicht für Architektur.</p>
<h3 id="fallstrick-5-die-bestandsaufnahme-überspringen">Fallstrick 5: die Bestandsaufnahme überspringen</h3>
<p>Das Plattformteam baut Pfade, die es selbst für nötig hält; dann stellt sich heraus, dass die tatsächlichen Top-10-Anfragen andere sind. Die Lösung: Fragen Sie die Produktteams, was sie am häufigsten anfragen, und bauen Sie dafür.</p>
<h2 id="reihenfolge-der-umsetzung">Reihenfolge der Umsetzung</h2>
<ol>
<li><strong>Den aktuellen Ticketfluss erfassen</strong> — welche 10 Dinge fragen Produktteams am häufigsten an? Interviews mit den einzelnen Teams bringen das zutage.</li>
<li><strong>Die Top 3–5 auswählen</strong> — sie decken rund 60 % des Volumens ab.</li>
<li><strong>Für jeden einen Golden Path bauen</strong> — typischerweise 1–2 Monate pro Pfad bei ausreichender Kapazität im Plattformteam.</li>
<li><strong>An der Adoption iterieren</strong> — Feedback einsammeln, Reibung beseitigen, Dokumentation ergänzen.</li>
<li><strong>Die Pfade 4–10 in den folgenden Quartalen ergänzen</strong> — orientiert an der beobachteten Nachfrage.</li>
</ol>
<h2 id="bewerten-und-loslegen">Bewerten und loslegen</h2>
<p>Steht Self-Service zur Debatte, benennt ein strukturiertes Assessment die wichtigsten Anfragen, zeigt, wo die heutigen Pfade versagen, und legt die Reihenfolge fest, in der gebaut werden sollte. Ænix führt das als Teil des <strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong> durch.</p>
<p>Details finden Sie unter <strong><a href="https://aenix.io/de/loesungen/developer-self-service/">Developer Self-Service</a></strong> und <strong><a href="https://aenix.io/de/dienstleistungen/internal-developer-platform/">Leistungen rund um die Internal Developer Platform</a></strong>.</p>
]]></content:encoded></item><item><title>Cozystack vs. VMware — der Detailvergleich für Platform Engineers</title><link>https://aenix.io/de/blog/2026/05/cozystack-vs-vmware-detailvergleich/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/cozystack-vs-vmware-detailvergleich/</guid><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><category>Cilium</category><category>LINSTOR</category><description>Cozystack und VMware Schicht für Schicht verglichen — Compute, Storage, Netzwerk, Mandantenfähigkeit — mit Folgen für den Betrieb und Migrationsmustern.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cozystack-vs-vmware-detailvergleich.jpg" alt=""></p><p>Dieser Artikel setzt voraus, dass Sie beide Plattformen kennen. Eine breitere Orientierung zum Ausstieg aus VMware finden Sie unter <strong><a href="https://aenix.io/de/alternativen/vmware-alternative/">VMware-Alternative</a></strong> oder <strong><a href="https://aenix.io/de/migration/vmware/">VMware-Migration</a></strong>.</p>
<h2 id="compute-schicht">Compute-Schicht</h2>
<p><strong>VMware vSphere/ESXi:</strong> ausgereifter Typ-1-Hypervisor. Starkes Lifecycle-Management für VMs, Live-Migration mit Shared Storage, vMotion. Enge Integration der VMware Tools in die Gastsysteme.</p>
<p><strong>Cozystack KubeVirt:</strong> qemu/KVM, verpackt in Pods. KVM selbst ist ein Hypervisor im Kernel-Modus, der Gast läuft also weiterhin auf den Virtualisierungserweiterungen der Hardware — der Pod ist eine Hülle für Scheduling und Lifecycle, keine zusätzliche Emulationsschicht. Live-Migration (CPU; GPU-Live-Migration ist eine branchenweite Einschränkung). Unter der Haube Standard-QEMU/KVM; breite Unterstützung für Gastbetriebssysteme.</p>
<p>In der Praxis liefern beide VM-Workloads in Produktionsqualität. Das KubeVirt-Modell bringt zusätzlich die betriebliche Integration in Kubernetes mit (deklarative VM-Konfiguration, GitOps-Lifecycle, natives Ingress, Observability).</p>
<h2 id="storage-schicht">Storage-Schicht</h2>
<p><strong>VMware vSAN:</strong> in vSphere integrierter Software-defined Storage. Im Betrieb reibungslos, eng integriert. An die VMware-Lizenzierung gebunden.</p>
<p><strong>Cozystack LINSTOR:</strong> replizierter Open-Source-Blockspeicher, ausgerollt über den Piraeus-Operator. LINSTOR nutzt DRBD für die synchrone Replikation; Object Storage ist eine eigene Schicht (SeaweedFS). Mehr Verantwortung im Betrieb, mehr architektonische Flexibilität.</p>
<p>Für die meisten Workloads erreicht LINSTOR die betrieblichen Eigenschaften von vSAN. Wo zusätzlich Object Storage im S3-Stil gebraucht wird, liefert Cozystack SeaweedFS als verwalteten Bucket-Service mit.</p>
<h2 id="netzwerkschicht">Netzwerkschicht</h2>
<p><strong>VMware NSX:</strong> Software-defined Networking. Verteilte virtuelle L2-Switches, L3-Routing, Mikrosegmentierung, Edge Gateway. Ausgereift, aber komplex.</p>
<p><strong>Cozystack Cilium:</strong> eBPF-basiertes CNI mit L4/L7-Policies, Observability, Service-Mesh-Integration, MetalLB / BGP. Neuere Architektur, oft einfacher.</p>
<p>Die Migration aus einer NSX-lastigen Umgebung zu Cilium erfordert ein Redesign der Policies — eine 1:1-Abbildung gibt es nicht. Das Architekturmodell ist ein anderes.</p>
<h2 id="mandantenschicht">Mandantenschicht</h2>
<p><strong>VMware vCloud Director:</strong> ausgereiftes Multi-Tenant-Overlay auf vSphere. Funktionen für Service Provider (Organisationen, vDC, Kataloge).</p>
<p><strong>Cozystack Tenant CRD:</strong> Kubernetes-native Abstraktion für Mandantenfähigkeit. Verschachtelte Tenants, Quotas pro Tenant, mandantenbezogenes Audit, abrechnungsfreundlich.</p>
<p>Das Mandantenmodell ist konzeptionell ein anderes — vCD-Organisationen gegenüber Instanzen des Tenant CRD. Bei der Migration muss die Mandantenstruktur auf das Kubernetes-native Äquivalent neu abgebildet werden.</p>
<h2 id="folgen-für-den-betrieb">Folgen für den Betrieb</h2>
<h3 id="tagesgeschäft">Tagesgeschäft</h3>
<p><strong>VMware:</strong> vCenter-UI für Ad-hoc-Aufgaben; PowerCLI / Ansible für die Automatisierung. SSH ist nicht das Standardmodell.</p>
<p><strong>Cozystack:</strong> kubectl plus GitOps als Standardmodell. Cozystack-Dashboard-UI für Tenant-Aufgaben. Review von GitOps-PRs als Change-Management.</p>
<p>Der Wechsel vom vCenter-zentrierten zum kubectl-zentrierten Arbeiten ist für VMware-geschulte Teams eine echte Lernkurve im Betrieb. Die meisten Engineers arbeiten sich mit gezieltem Training in 4–8 Wochen ein.</p>
<h3 id="upgrades">Upgrades</h3>
<p><strong>VMware:</strong> zuerst Upgrade von vCenter, dann ESXi-Upgrade Host für Host (rollierend). Ausgereifter Prozess.</p>
<p><strong>Cozystack:</strong> Upgrade von Talos OS, von Kubernetes und vom Cozystack-Operator. GitOps-gesteuert. Rollierend Host für Host.</p>
<p>Beide arbeiten mit Rolling Upgrades. Im Betrieb ähnlich im Geist, aber mit unterschiedlichem Tooling.</p>
<h3 id="backup--dr">Backup / DR</h3>
<p><strong>VMware Site Recovery Manager:</strong> ausgereifte DR-Orchestrierung mit automatisiertem Failover. Im großen Maßstab erprobt.</p>
<p><strong>Cozystack Velero plus PITR pro Anwendung:</strong> Velero übernimmt das Backup auf Cluster-Ebene; anwendungsspezifische Muster (PostgreSQL PITR usw.) kommen darüber. Mehr bewegliche Teile, mehr Flexibilität.</p>
<p>Das Muster ist ein anderes — SRM ist eine vom Hersteller verwaltete Plug-and-Play-Lösung mit orchestriertem Failover. Auf Cozystack heißt DR: Backup und Wiederherstellung mit Velero plus geübte Runbooks; ein orchestriertes standortübergreifendes Failover wie bei SRM gibt es nicht. Dafür ist der Velero-Stack transparenter und besser anpassbar.</p>
<h2 id="migrationsmuster">Migrationsmuster</h2>
<p>Die Migration von VMware zu Cozystack in der Produktion:</p>
<ol>
<li><strong>Discovery</strong> — Inventar von vSphere/VCF; Klassifizierung der Workloads.</li>
<li><strong>Cozystack-Fundament</strong> — paralleles Deployment; kein Tenant von VMware.</li>
<li><strong>Image-Migration</strong> — KubeVirt CDI importiert VMDK- oder qcow2-Images. Bei Windows-VMs werden die VMware Tools vor dem ersten Start unter KubeVirt bereinigt.</li>
<li><strong>Netzwerk-Cutover</strong> — Abbildung der VLANs in Cilium; die Gleichwertigkeit der Policies wird gegen die NSX-Regeln validiert.</li>
<li><strong>Storage-Cutover</strong> — vSAN → LINSTOR (DRBD); Datenmigration während des Cutovers der jeweiligen Kohorte.</li>
<li><strong>DR-Cutover</strong> — Backup und Wiederherstellung mit Velero plus Runbooks an Stelle der SRM-Pläne (kein orchestriertes Failover wie bei SRM); wird pro Kohorte getestet.</li>
<li><strong>Abschaltung von VMware</strong> — gestaffelt, sobald die Kohorten abgeschlossen sind.</li>
</ol>
<p>Typische Gesamtdauer nach einem Platform Readiness Assessment von 14 oder 28 Tagen: rund 8–12 Monate für einen Bestand von ~100 VMs und 18–24 Monate für ~1.000 VMs, einschließlich Planung und Migrationswellen; Bestände dazwischen liegen je nach Abhängigkeiten zwischen diesen Werten. Treiber ist selten die reine Kopiergeschwindigkeit — es sind die Regressionstests und die Parallelbetriebsfenster, denen die Verantwortlichen der Anwendungen zustimmen.</p>
<h2 id="wann-der-vergleich-zählt">Wann der Vergleich zählt</h2>
<p>Diese Detailtiefe ist hilfreich, wenn:</p>
<ul>
<li>ein Architektur-Review läuft</li>
<li>die Umsetzung in Phase 2 geplant wird</li>
<li>konkrete betriebliche Fragen anstehen (Storage-Performance, Netzwerklatenz usw.)</li>
<li>Schulungen für das Team geplant werden</li>
</ul>
<p>Für eine Bewertung auf höherer Ebene ist <strong><a href="https://aenix.io/de/alternativen/vmware-alternative/">VMware-Alternative</a></strong> der passendere Einstieg.</p>
]]></content:encoded></item><item><title>Herstellerneutrale Cloud-Strategie — wie ehrliche Cloud-Beratung 2026 aussieht</title><link>https://aenix.io/de/blog/2026/05/herstellerneutrale-cloud-strategie-beratung/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/herstellerneutrale-cloud-strategie-beratung/</guid><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cloud</category><category>Platform Engineering</category><category>Sovereignty</category><category>Compliance</category><description>Was eine herstellerneutrale Cloud-Strategieberatung tatsächlich liefert und worin sie sich von Big-4-Beratung und Hyperscaler-nahen Beratungshäusern abhebt.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/herstellerneutrale-cloud-strategie-beratung.jpg" alt=""></p><p>„Cloud-Strategie“ ist ein abgenutzter Begriff. Hyperscaler bieten sie
an (Azure Cloud Adoption Framework, AWS Migration Acceleration Programme,
Google Cloud Adoption Framework). Die Big 4 bieten sie an (Deloitte,
KPMG, EY und PwC haben jeweils Cloud-Beratungssparten mit Tausenden
Beratern). Partner der Hyperscaler bieten sie an (Systemintegratoren mit
Tausenden zertifizierten Cloud-Beratern). Boutique-Beratungen bieten sie
an. Interne Strategieteams erarbeiten sie selbst.</p>
<p>Der Markt ist voll, und die Methoden sehen von außen ähnlich aus. Der
Unterschied zeigt sich darin, was die Strategie tatsächlich empfiehlt,
wer welchen Anreiz für welche Empfehlung hat und ob die Empfehlung
18 Monate Praxis übersteht.</p>
<p>Dieser Artikel ist die ehrliche Fassung: Was liefert eine
herstellerneutrale Cloud-Strategieberatung <em>nach Art von Ænix</em>, warum
unterscheidet sie sich von Hyperscaler-nahen oder Big-4-Alternativen,
und wann passt welche Variante.</p>
<h2 id="was-eine-cloud-strategie-2026-wirklich-beantworten-muss">Was eine „Cloud-Strategie“ 2026 wirklich beantworten muss</h2>
<p>Fünf strategische Fragen bestimmen die Diskussion 2026:</p>
<h3 id="1-wo-sollte-jede-workload-klasse-laufen">1. Wo sollte jede Workload-Klasse laufen?</h3>
<p>Der Standard von 2018 — „alles in die Public Cloud“ — ist überholt.
DORA-relevante Workloads laufen anders als SaaS-Workloads. Dauerhafte
KI-Inferenz läuft anders als kundenseitige Anwendungen mit Lastspitzen.
Regulierte Datenklassen laufen anders als offene Daten. Die Strategie
muss pro Workload-Klasse Position beziehen, statt alle über einen Kamm
zu scheren.</p>
<h3 id="2-wie-lautet-die-position-zur-souveränität">2. Wie lautet die Position zur Souveränität?</h3>
<p>Unterschiedliche Rechtsordnungen, Branchen und Kundenbeziehungen
stellen unterschiedliche Anforderungen an die Souveränität. Die
Strategie muss die Position ausdrücklich benennen — einschließlich der
Kosten in Form betrieblicher Komplexität und der Auswirkungen auf die
Anbieterauswahl.</p>
<h3 id="3-wie-entwickeln-sich-die-kosten">3. Wie entwickeln sich die Kosten?</h3>
<p>Public-Cloud-Rechnungen wachsen mit Zinseszinseffekt. Die Strategie muss
die Kosten über die nächsten 3–5 Jahre für jede Workload-Klasse und
jede Substrat-Option prognostizieren. Eine ehrliche Prognose —
einschließlich Hardware-Erneuerung, Kapazität im Platform Engineering
und Wechselkosten durch Vendor-Lock-in —, nicht die Marketing-Version.</p>
<h3 id="4-welches-betriebsmodell-skaliert">4. Welches Betriebsmodell skaliert?</h3>
<p>Nur DevOps? Platform Engineering? In die Teams eingebettete SREs?
Zentrales SRE? Das Modell muss zum Personalprofil und zum
Wachstumspfad der Engineering-Organisation passen; Fehlanpassungen
kosten mehr, als sie sparen.</p>
<h3 id="5-wie-entwickelt-sich-das-regulatorische-umfeld">5. Wie entwickelt sich das regulatorische Umfeld?</h3>
<p>DORA gilt seit Januar 2025. Die NIS2-Umsetzung erfolgte im Oktober
2024. EUCS wird finalisiert. Branchenspezifische Vorgaben weiten sich
aus. Regelwerke für souveräne Clouds werden schärfer. Die Strategie
darf nicht auf den heutigen regulatorischen Stand festgeschrieben sein;
sie muss die wahrscheinliche Entwicklung der nächsten 24–36 Monate
einbeziehen.</p>
<p>Eine „Cloud-Strategie“-Beratung, die nicht zu allen fünf Fragen
Position bezieht, ist keine Strategie. Sie ist eine Tooling-Roadmap.</p>
<h2 id="warum-herstellerneutralität-zählt">Warum Herstellerneutralität zählt</h2>
<p>Hyperscaler-nahe Beratung und die meisten Big-4-Beratungssparten haben
eine implizite kommerzielle Ausrichtung, die ihre Empfehlungen prägt:</p>
<ul>
<li><strong>Beratung unter Führung der Hyperscaler</strong> — AWS, Azure, GCP und IBM
Cloud finanzieren jeweils eigene und partnergeführte
Beratungssparten. Die Beratung ist strukturell darauf ausgerichtet,
den jeweiligen Hyperscaler zu empfehlen. Ehrliche Praktiker versuchen
gegenzusteuern, aber der kommerzielle Anreiz ist eindeutig.</li>
<li><strong>Cloud-Beratung der Big 4</strong> — Deloitte, KPMG, EY und PwC haben
jeweils Partnerprogramme mit Hyperscalern, die die Empfehlungen
beeinflussen. Die meisten Projekte enden mit einem
Modernisierungsplan, der auf einen Hyperscaler ausgerichtet ist,
weil dort die Integrationsumsätze liegen.</li>
<li><strong>Systemintegratoren als Hyperscaler-Partner</strong> — Capgemini,
Accenture, Infosys und Wipro haben den Status zertifizierter Partner
bei Hyperscalern und verdienen an Umsetzungen unter Führung der
Hyperscaler. Herstellerneutral laut Marketing, herstellergebunden
laut Ökonomie.</li>
</ul>
<p>Herstellerneutrale Beratung bedeutet: Das kommerzielle Ergebnis des
Projekts hängt nicht davon ab, dass sich der Kunde für einen
bestimmten Hyperscaler, eine bestimmte Distribution oder ein
bestimmtes Produkt entscheidet. Das Geschäftsmodell von Ænix — wir
bauen und betreiben die Cloud-Plattform-Produkte von Ænix — schafft
eine andere Ausrichtung: Wir möchten, dass die Strategie bei einem
davon landet, <em>wo es passt</em>, drängen aber ausdrücklich nicht darauf,
wo es nicht passt.</p>
<p>Wir sagen „bleiben Sie beim Hyperscaler“, wenn die Abwägung es
rechtfertigt. Und zwar schriftlich. Der negative Anreiz, der daraus
entsteht, ist real — manche Projekte enden ohne Folgeauftrag für
Plattformarbeit bei Ænix —, und genau so soll Herstellerneutralität
funktionieren.</p>
<h2 id="was-unsere-beratung-tatsächlich-liefert">Was unsere Beratung tatsächlich liefert</h2>
<p>Eine typische Cloud-Strategieberatung von Ænix umfasst:</p>
<h3 id="arbeitsstrang-1--strategie-für-das-workload-portfolio">Arbeitsstrang 1 — Strategie für das Workload-Portfolio</h3>
<p>Taxonomie der Workload-Klassen: reguliert / nicht reguliert, Dauerlast /
Lastspitzen, sensible / nicht sensible Datenklasse, latenzkritisch /
elastisch. Für jede Klasse die Eignung des Substrats (Public Cloud /
von Hyperscalern verwaltet / Private Cloud / souverän / hybrid / Edge).</p>
<p>Ergebnis: eine Matrix von Workload-Klassen zu Substraten mit Begründung
pro Klasse.</p>
<h3 id="arbeitsstrang-2--position-zur-souveränität">Arbeitsstrang 2 — Position zur Souveränität</h3>
<p>Anwendbarkeit der Regulierung über Rechtsordnungen und Branchen hinweg.
Substanzielle Souveränitätsanforderungen pro Workload-Klasse.
Bewertungskriterien für Anbieter aus Sicht der Souveränität.</p>
<p>Ergebnis: eine schriftliche Position zur Souveränität mit benannten
Rechtsordnungen, benannten Einschränkungen für Substrate und
dokumentierter Akzeptanz der Restrisiken.</p>
<h3 id="arbeitsstrang-3--kostenentwicklung">Arbeitsstrang 3 — Kostenentwicklung</h3>
<p>Kostenprognose über drei bis fünf Jahre für die verschiedenen
Substrat-Optionen. Ehrliche TCO einschließlich versteckter Kosten
(Egress, schlecht genutzte Reservierungen, Kapazität im Platform
Engineering, Wechselkosten durch Vendor-Lock-in,
Hardware-Erneuerungszyklen). Sensitivitätsanalyse für die wichtigsten
Annahmen.</p>
<p>Ergebnis: eine Tabellenkalkulation, die Ihr CFO prüfen kann, plus
erläuternder Text.</p>
<h3 id="arbeitsstrang-4--empfehlung-zum-betriebsmodell">Arbeitsstrang 4 — Empfehlung zum Betriebsmodell</h3>
<p>Gestaltung der Funktionen DevOps / SRE / Platform Engineering.
Personalprognosen. Einstellungsplan. Empfehlungen zur
Organisationsstruktur. Prioritäten beim Tooling.</p>
<p>Ergebnis: Empfehlungen zum Organisationsdesign mit benannten Rollen,
RACI-Matrizen und priorisierter Einstellungsreihenfolge.</p>
<h3 id="arbeitsstrang-5--regulatorische-entwicklung">Arbeitsstrang 5 — regulatorische Entwicklung</h3>
<p>Ausblick auf 24–36 Monate für die anwendbaren Regelwerke. Finalisierung
von EUCS, Durchsetzung von NIS2, Verschärfung branchenspezifischer
Vorgaben, Ausweitung der Souveränitäts-Regelwerke. Wie sich die
Strategie für das Workload-Portfolio anpasst, wenn sich das
regulatorische Umfeld verändert.</p>
<p>Ergebnis: eine regulatorische Roadmap mit Prüfterminen und
Entscheidungsauslösern.</p>
<h3 id="synthese-der-plan-für-1836-monate">Synthese: der Plan für 18–36 Monate</h3>
<p>Die Ergebnisse von fünf Arbeitssträngen werden zu einem
Strategiedokument auf Vorstandsniveau zusammengeführt. Management
Summary (3–5 Seiten). Details der Arbeitsstränge (5–8 Seiten je
Strang). Roadmap mit Meilensteinen (2–3 Seiten). Empfehlungen zur
Reihenfolge der Umsetzung.</p>
<p>Insgesamt: ein Dokument mit 30–50 Seiten plus Management-Präsentation
für Vorstand bzw. Sponsoren.</p>
<h2 id="varianten-der-zusammenarbeit">Varianten der Zusammenarbeit</h2>
<ul>
<li><strong>Strategisches Assessment über 28 Tage</strong> — engerer Umfang,
Festpreis, ein einzelnes Segment des Workload-Portfolios</li>
<li><strong>Strategieprojekt über 8 Wochen</strong> — voller Umfang mit fünf
Arbeitssträngen, Festpreis</li>
<li><strong>Quartalsweise strategische Beratung</strong> — laufende Begleitung bei
strategischen Entscheidungen, sobald sie anstehen (typischerweise für
Tier-1-Kunden)</li>
</ul>
<h2 id="wo-der-nutzen-der-beratung-wächst">Wo der Nutzen der Beratung wächst</h2>
<p>Strategieprojekte haben oft ein „Schrankware“-Problem — das Ergebnis
wird abgeliefert, verteilt, und 18 Monate später weiß niemand mehr, was
drinstand. Das Beratungsmodell von Ænix setzt hier an:</p>
<ul>
<li><strong>Von Engineers geschrieben, nicht von Beratern</strong> — unsere
Ergebnisse schreiben dieselben Engineers, die sie umsetzen würden;
technische Nachvollziehbarkeit bedeutet, dass sich jede Aussage auf
konkrete Artefakte zurückführen lässt.</li>
<li><strong>Kontinuität in der Umsetzung</strong> — beauftragt der Kunde Ænix mit der
Umsetzung, wirkt das Engineering-Team, das die Strategie geschrieben
hat, an der Ausführung mit. Kein Verlust bei der Übergabe.</li>
<li><strong>Entscheidungstempo statt Folienglanz</strong> — wir liefern 30–50 Seiten
verwertbarer Details, nicht 100 Seiten Management-Theater.</li>
<li><strong>Quartalsweise strategische Beratung</strong> für Tier-1-Kunden hält die
Strategie aktuell, während sich das Umfeld des Kunden und die
Regulierung weiterentwickeln.</li>
</ul>
<h2 id="wann-diese-beratung-passt">Wann diese Beratung passt</h2>
<p>Gute Eignung:</p>
<ul>
<li>CIO / CTO / Head of Cloud in einer Organisation mit über 100 Mio. €
Umsatz</li>
<li>Vor der Entscheidung über eine mehrjährige Cloud-Ausrichtung
(Modernisierung, Repatriierung, souveräne Cloud, KI-Infrastruktur)</li>
<li>Bisherige Strategiearbeit hat herstellergebundene Optionen
hervorgebracht, mit denen man sich unwohl fühlt</li>
<li>Regulatorischer Druck (DORA, NIS2, branchenspezifisch) erfordert
eine substanzielle Positionierung über die Erfüllung von
Beschaffungsklauseln hinaus</li>
</ul>
<p>Bedingte Eignung:</p>
<ul>
<li>Mittelgroße Organisationen mit einfacherem Entscheidungsraum — hier
passt eher ein Platform Readiness Assessment (taktischer) als ein
vollständiges Strategieprojekt</li>
<li>Entscheidung für eine einzelne Workload-Klasse (z. B. nur
KI-Infrastruktur) — hier passt eher das KI-spezifische
Sovereign AI Architecture Review</li>
</ul>
<p>Schlechte Eignung:</p>
<ul>
<li>Organisationen, die sich bereits auf ein bestimmtes
Hyperscaler-Programm festgelegt haben — Ænix kann zu konkreten
Architekturlücken innerhalb dieser Festlegung beraten, aber eine
vollständige Strategiearbeit setzt voraus, dass die Entscheidungen
noch offen sind</li>
<li>Strategiearbeit, bei der es vor allem um Change Management oder
Umstrukturierung der Organisation geht — das ist eine andere
Kategorie</li>
</ul>
<h2 id="der-unterschied-zum-platform-readiness-assessment">Der Unterschied zum Platform Readiness Assessment</h2>
<p>Die beiden Angebote überschneiden sich im Umfang, verfolgen aber
unterschiedliche Zwecke:</p>
<ul>
<li><strong>Platform Readiness Assessment</strong> ist <em>taktisch</em> — es bewertet den
Ist-Zustand gegenüber einer Zielarchitektur und liefert einen
Maßnahmenplan in 14 oder 28 Tagen. Es kommt zum Einsatz, wenn die
strategische Richtung feststeht.</li>
<li><strong>Cloud-Strategie-Beratung</strong> ist <em>strategisch</em> — sie definiert die
Zielarchitektur und die Substrat-Position. Sie kommt zum Einsatz,
wenn die strategische Richtung noch offen ist.</li>
</ul>
<p>Die meisten Kunden nehmen am Ende beides nacheinander in Anspruch:
zuerst die Strategie, dann das Assessment, dann die Umsetzung.</p>
<h2 id="weiterführende-informationen">Weiterführende Informationen</h2>
<ul>
<li><strong><a href="https://aenix.io/de/dienstleistungen/cloud-strategy-consultancy/">Cloud-Strategie-Beratung</a></strong> —
die Angebotsseite</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong> —
das taktische Assessment</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/cloud-readiness-assessment-methodik/">Cloud Readiness Assessment — Methodik für 14 Tage</a></strong> —
Details zur Methodik des taktischen Assessments</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/cloud-engineering/">Cloud Engineering 2026</a></strong> —
die sieben Disziplinen des Cloud Engineering</li>
</ul>
]]></content:encoded></item><item><title>CloudStack-Migration zu Cozystack — der Modernisierungspfad für etablierte Service Provider</title><link>https://aenix.io/de/blog/2026/05/cloudstack-migration-cozystack-modernisierung/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/cloudstack-migration-cozystack-modernisierung/</guid><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>CloudStack</category><category>Cozystack</category><category>Migration</category><category>Hosting</category><category>Multi-tenancy</category><description>Wie Service Provider Apache CloudStack auf Cozystack als Kubernetes-natives Ziel modernisieren: Architektur-Mapping, Migrationsphasen und Abwägungen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cloudstack-migration-cozystack-modernisierung.jpg" alt=""></p><p>Apache CloudStack ist bei Service Providern in mehreren Märkten in der
EU, im MENA-Raum und in APAC fest etabliert. Es bringt ein ausgereiftes
Mandantenmodell, breite Unterstützung durch die Community und gut
verstandene Betriebsmuster mit. Warum also prüfen Betreiber 2026 eine
Modernisierung?</p>
<p>Drei Druckfaktoren stechen heraus:</p>
<ol>
<li><strong>Fachkräftemangel</strong> — der Pool an CloudStack-Expertise ist kleiner
als früher, und neue Engineers werden auf Kubernetes ausgebildet,
nicht auf das Komponentenmodell von CloudStack.</li>
<li><strong>Grenzen des Servicekatalogs</strong> — der Kern von CloudStack sind VMs,
Netzwerke und Storage. Managed-Datenbanken, S3-kompatibler Object
Storage, Container-native Workloads und GPU-as-a-Service werden
entweder umständlich angeflanscht oder laufen komplett außerhalb der
Plattform.</li>
<li><strong>Nachfrage der Kunden nach Kubernetes-nativen Diensten</strong> — Kunden
wollen zunehmend Tenant-Kubernetes-Cluster, Container-Workloads und
Kubernetes-natives Networking. CloudStack löst das über
Integrationen, Cozystack nativ.</li>
</ol>
<h2 id="wo-cloudstack-weiterhin-die-bessere-wahl-ist">Wo CloudStack weiterhin die bessere Wahl ist</h2>
<p>Bevor wir über Modernisierung sprechen, sollten wir ehrlich benennen,
wo CloudStack nach wie vor die richtige Antwort ist:</p>
<ul>
<li><strong>Etablierte Expertise und stabiler Kundenstamm</strong> — Betreiber mit
tiefer CloudStack-Betriebserfahrung und stabiler Kundenzahl, bei
denen die Migrationskosten den Nutzen der Modernisierung übersteigen
könnten</li>
<li><strong>VMware-on-CloudStack-Deployments</strong> — wo CloudStack als
Orchestrierungsschicht über einem bestehenden VMware-Bestand läuft,
lautet die Modernisierungsfrage zuerst „Verlassen wir VMware?“ und
erst danach „Wechseln wir den Orchestrator?“</li>
<li><strong>Spezifische CloudStack-Funktionen ohne direktes
Kubernetes-Äquivalent</strong> — tiefgehende Netzwerkkonfigurationsmuster,
bestimmte Load-Balancer-Integrationen, an regionale Beschaffung
gebundene Funktionen</li>
</ul>
<p>Die Modernisierung passt woanders: bei Providern mit wachsender
Kundennachfrage nach Kubernetes-nativen Diensten, bei Providern, deren
Betriebskomplexität mit jeder Fluktuation im Team weiter zunimmt, und
bei Providern, die Managed-Datenbanken, S3 oder GPU-Dienste einführen,
die nicht nativ in CloudStack passen.</p>
<h2 id="architektur-mapping-cloudstack--cozystack">Architektur-Mapping: CloudStack → Cozystack</h2>
<table>
  <thead>
      <tr>
          <th>CloudStack-Komponente</th>
          <th>Cozystack-Äquivalent</th>
          <th>Anmerkungen</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Management Server</strong></td>
          <td>Cozystack Control Plane (Kubernetes-API + cozystack-controller)</td>
          <td>Anderes Betriebsmodell — deklaratives GitOps statt imperativer CloudStack-API</td>
      </tr>
      <tr>
          <td><strong>System-VMs (SSVM, CPVM, VR)</strong></td>
          <td>In die Cozystack-Plattform integriert — keine System-VMs pro Tenant nötig</td>
          <td>Deutliche betriebliche Vereinfachung</td>
      </tr>
      <tr>
          <td><strong>Hypervisor (KVM, XenServer, VMware)</strong></td>
          <td>KubeVirt auf Talos</td>
          <td>Der reine KVM-Pfad ist am häufigsten; VMware-on-CloudStack wird in der Regel zuerst zu einer Migration von VMware zu Cozystack</td>
      </tr>
      <tr>
          <td><strong>Primary Storage</strong></td>
          <td>LINSTOR (DRBD)</td>
          <td>Anderes Replikationsmodell; Kapazitätsplanung muss neu gerechnet werden</td>
      </tr>
      <tr>
          <td><strong>Secondary Storage</strong></td>
          <td>SeaweedFS (S3-kompatibel)</td>
          <td>Besser für Snapshots, Backups und ISOs; native S3-API, die Kunden direkt nutzen können</td>
      </tr>
      <tr>
          <td><strong>Networking (Advanced / Basic / Isolated)</strong></td>
          <td>Cilium (eBPF)</td>
          <td>Architektonisches Umdenken — Cilium arbeitet auf L4/L7 mit eBPF; das CloudStack-Netzwerkmodell ist auf L2/L3 verankert</td>
      </tr>
      <tr>
          <td><strong>Virtual Router (VR)</strong></td>
          <td>Cilium + MetalLB oder BGP</td>
          <td>Anderes Konzept; das Routing findet auf Cilium-Ebene statt</td>
      </tr>
      <tr>
          <td><strong>Accounts und Domains (Mandantenfähigkeit)</strong></td>
          <td>Tenant CRD mit verschachtelten Tenants</td>
          <td>Konzeptionell näher an CloudStack als andere Kubernetes-Plattformen</td>
      </tr>
      <tr>
          <td><strong>API und UI</strong></td>
          <td>Kubernetes-API + Cozystack Dashboard</td>
          <td>Die Oberfläche für Kunden unterscheidet sich</td>
      </tr>
      <tr>
          <td><strong>Volumes, Snapshots, Templates</strong></td>
          <td>KubeVirt CDI + DataVolume + VirtualMachineImage</td>
          <td>Image-Migration per Image-Konvertierung</td>
      </tr>
      <tr>
          <td><strong>Service Offering / Disk Offering</strong></td>
          <td>Cozystack-Paketdefinitionen</td>
          <td>Anderes Modell; das Produktteam kuratiert den Katalog</td>
      </tr>
      <tr>
          <td><strong>Network Offering</strong></td>
          <td>Cilium NetworkPolicy + Ingress</td>
          <td>Andere Abstraktion</td>
      </tr>
      <tr>
          <td><strong>VPC</strong></td>
          <td>Cilium ClusterPool + Tenant-bezogene NetworkPolicy</td>
          <td>Konzeptionell ähnlich</td>
      </tr>
  </tbody>
</table>
<p>Zwei Bereiche brauchen ein grundlegendes Redesign statt einer
1:1-Abbildung: das <strong>Networking</strong> (das eBPF-Modell von Cilium ist
grundlegend anders als der L2/L3-Virtual-Router von CloudStack) und der
<strong>Servicekatalog</strong> (CloudStack Service Offerings gegenüber
Cozystack-Paket plus ApplicationDefinition).</p>
<h2 id="migrationsphasen">Migrationsphasen</h2>
<h3 id="phase-0--assessment-14-oder-28-tage">Phase 0 — Assessment (14 oder 28 Tage)</h3>
<p>Workload-Inventar: Anzahl der VMs, Betriebssystem-Mix,
vCPU-/RAM-/Disk-Profile, Kritikalitätsstufe. Netzwerk-Inventar: Anzahl
der VPCs, Vergabe öffentlicher IPs, Load-Balancer-Konfigurationen,
Security-Group-Regeln. Storage-Inventar: Kapazität von Primary und
Secondary Storage, Aufbewahrung von Snapshots, Volume-Typen.
Mandanten-Inventar: Anzahl der Accounts, Domain-Hierarchie,
Projektstruktur.</p>
<p>Kundenbezogenes Inventar: ARPU pro Kunde, Servicenutzung, vertragliche
Verpflichtungen, SLA-Stufen, Berührungspunkte mit der
Billing-Integration.</p>
<p>Ergebnis: ein Migrationsplan mit Workload-Gruppen (jetzt migrieren /
später migrieren / bleibt / neu architektieren), Risikomarkierungen
und Zeitplan.</p>
<h3 id="phase-1--cozystack-fundament-24-monate">Phase 1 — Cozystack-Fundament (2–4 Monate)</h3>
<p>Hardwarebeschaffung (oder Weiterverwendung vorhandener Hardware). Die
Cozystack-Plattform wird auf neuer Infrastruktur parallel zum
bestehenden CloudStack-Bestand aufgebaut. Cilium-Networking wird
validiert, LINSTOR-Storage in den Betrieb überführt. Anbindung an das
Identity-Management (Keycloak oder den IdP, den der Provider
betreibt).</p>
<p>Das Tenant-CRD-Modell wird so entworfen, dass es sich sauber aus der
Account-/Domain-Hierarchie von CloudStack ableiten lässt — in der Regel
wird jeder CloudStack-Account der obersten Ebene zu einem
Cozystack-Tenant, verschachtelte CloudStack-Domains werden zu
verschachtelten Tenants.</p>
<p>Endzustand: eine funktionierende Cozystack-Plattform, interne
Validierung abgeschlossen, noch nicht für Kunden freigegeben.</p>
<h3 id="phase-2--servicekatalog-und-kundenportal-24-monate">Phase 2 — Servicekatalog und Kundenportal (2–4 Monate)</h3>
<p>Anpassung des Cozystack Dashboards an die Marke des Providers.
WHMCS-Integration, falls der Provider WHMCS nutzt (das tun die meisten
CloudStack-Provider mit WHMCS). Rollout des Servicekatalogs — zuerst
die Basisdienste (VMs, Volumes, S3-Buckets, grundlegendes Networking),
danach schrittweise Managed Services, die es in der CloudStack-Ära
nicht gab.</p>
<h3 id="phase-3--vm-migration-39-monate">Phase 3 — VM-Migration (3–9 Monate)</h3>
<p>Die Workloads ziehen in Kohorten von jeweils 50 bis 200 Kunden um. Pro
Kohorte:</p>
<ol>
<li><strong>Image-Konvertierung</strong> — CloudStack-Templates und Kunden-Images
werden in ein KubeVirt-kompatibles Format konvertiert. Die meisten
CloudStack-KVM-Images lassen sich mit qemu-img plus kleinen
Metadaten-Anpassungen konvertieren. In Windows-VMs der Kunden werden
virtio-Treiber injiziert (Standardvorgehen).</li>
<li><strong>Netzwerk-Mapping</strong> — Übersetzung von VLANs in Cilium-Policies,
von Security-Group-Regeln in NetworkPolicies und vom VPC-Routing in
ClusterPool plus Cilium L3.</li>
<li><strong>Storage-Migration</strong> — die Volume-Daten werden vom
CloudStack-Primary-Storage nach LINSTOR migriert. Die
Snapshot-Historie wird je nach Aufbewahrungsrichtlinie übernommen
oder bereinigt.</li>
<li><strong>Cutover</strong> — der Workload läuft für ein Validierungsfenster
(typischerweise 7–14 Tage) parallel auf Cozystack. Der Kunde wird
über den Cutover informiert; der endgültige Cutover erfolgt in einem
geplanten Wartungsfenster.</li>
</ol>
<h3 id="phase-4--rückbau-von-cloudstack-26-monate">Phase 4 — Rückbau von CloudStack (2–6 Monate)</h3>
<p>Mit jeder abgeschlossenen Migrationskohorte wird Hardware in den
Cozystack-Cluster übernommen. Der CloudStack Management Server wird
abgeschaltet. Das Betriebstooling (Monitoring, Ticketing-Integrationen)
wird auf den Cozystack-Stack konsolidiert.</p>
<h2 id="wo-migrationen-von-cloudstack-zu-cozystack-ins-stocken-geraten">Wo Migrationen von CloudStack zu Cozystack ins Stocken geraten</h2>
<h3 id="1-übersetzung-des-netzwerkmodells">1. Übersetzung des Netzwerkmodells</h3>
<p>Das Netzwerkmodell von CloudStack war historisch konfigurierbarer als
das der meisten Cloud-Orchestrierungsplattformen — Advanced
Networking, Basic Networking, Isolated Networks, VPC, öffentliche IPs,
Hairpin-Routing, aufwendige Security-Group-Konfigurationen. All das in
Cilium, MetalLB und Standard-Kubernetes-NetworkPolicies zu übersetzen,
erfordert sorgfältige Architekturarbeit. Wer das in Phase 0–1
überspringt, produziert in Phase 3 Produktionsvorfälle.</p>
<h3 id="2-billing-integration-für-kunden">2. Billing-Integration für Kunden</h3>
<p>Die Billing-Hooks von CloudStack unterscheiden sich von denen von
Cozystack. Provider mit WHMCS-integriertem CloudStack-Billing nutzen
die WHMCS-Integration von Ænix (ein proprietäres Ænix-Modul, nicht Teil
von Cozystack); die Anpassung an Tarife und Prozesse ist für jeden
Provider spezifisch.</p>
<h3 id="3-abweichende-self-service-api-für-kunden">3. Abweichende Self-Service-API für Kunden</h3>
<p>CloudStack bietet eine umfassende API für Kunden (cmdkit / SDK).
Kunden, die eigenes Tooling gegen die CloudStack-API gebaut haben,
brauchen einen Migrationspfad: entweder einen CloudStack-API-kompatiblen
Shim auf Cozystack (für einen Teil der Operationen möglich) oder eine
Migration der kundenseitigen API auf Cozystack-native Muster. Planen
Sie das ein.</p>
<h2 id="wann-die-migration-von-cloudstack-zu-cozystack-die-richtige-antwort-ist">Wann die Migration von CloudStack zu Cozystack die richtige Antwort ist</h2>
<p>Gute Passung:</p>
<ul>
<li>Service Provider mit KVM-basiertem CloudStack und wachsender
Kundennachfrage nach Managed-Datenbanken, S3, Container-nativen
Diensten oder GPU-Diensten</li>
<li>Der Fachkräftemangel beginnt, die Betriebsqualität zu beeinträchtigen</li>
<li>Der Kundenstamm wächst oder ist stabil, schrumpft aber nicht</li>
<li>Der Betreiber hat Budget für ein Modernisierungsprogramm von 9 bis 24
Monaten</li>
</ul>
<p>Bedingte Passung:</p>
<ul>
<li>VMware-on-CloudStack-Provider — zuerst die VMware-Migration lösen</li>
<li>Stabile, langsam wachsende Betreiber mit tiefer
CloudStack-Expertise, die den betrieblichen Schmerz nicht spüren —
die Modernisierung ist ein aufschiebbares Investitionsprojekt</li>
</ul>
<p>Schlechte Passung:</p>
<ul>
<li>Betreiber mit sinkender Kundenzahl — die Modernisierungskosten sind
schwer zu rechtfertigen</li>
<li>Sehr kleine Betreiber (&lt;200 Kunden) — die Fixkosten der Cozystack
Public Cloud Platform übersteigen die Einsparungen</li>
</ul>
<h2 id="ablauf-der-zusammenarbeit">Ablauf der Zusammenarbeit</h2>
<ul>
<li><strong>Discovery Call</strong> (30 Min., kostenlos)</li>
<li><strong>Migrations-Assessment</strong> (14 oder 28 Tage, Festpreis) — Inventar,
Workload-Gruppen, Zeitplan</li>
<li><strong>Pilot-Deployment</strong> (3–6 Monate) — Aufbau der Cozystack-Plattform,
Migration von 5–10 wohlgesonnenen Kunden, Validierung der
Billing-Workflows</li>
<li><strong>Migration der Kundenkohorten</strong> (6–18 Monate) — Workload-Migration
in Kohorten, parallel dazu Rückbau von CloudStack</li>
<li><strong>Managed Retainer</strong> (optional, fortlaufend) — mit Plus- oder Enterprise-Support-Stufe (siehe <a href="https://aenix.io/de/preise/">Preise</a>)</li>
</ul>
<p>Gesamtdauer: 12–24 Monate vom Projektstart bis zur vollständigen
Abschaltung von CloudStack.</p>
<h2 id="weiterführende-inhalte">Weiterführende Inhalte</h2>
<ul>
<li><strong><a href="https://aenix.io/de/migration/cloudstack/">CloudStack-Migrations-Hub</a></strong> — der
Einstiegspunkt zur Migration im Überblick</li>
<li><strong><a href="https://aenix.io/de/produkte/public-cloud-platform/">Produktseite Public Cloud Platform</a></strong> —
das häufigste Zielprodukt bei CloudStack-Migrationen</li>
<li><strong><a href="https://aenix.io/de/branchen/hosting-anbieter/">Branchenseite Hosting-Anbieter</a></strong> —
Positionierung speziell für Hosting-Anbieter</li>
<li><strong><a href="https://aenix.io/de/blog/2026/05/hosting-anbieter-plattform-modernisierung/">Plattformmodernisierung für Hosting-Anbieter</a></strong> —
Artikel zu einem verwandten Modernisierungsmuster</li>
</ul>
]]></content:encoded></item><item><title>Ehrliche TCO-Modelle für Cloud Repatriation — welche Zahlen Sie wirklich vergleichen sollten</title><link>https://aenix.io/de/blog/2026/05/cloud-repatriation-tco-modell-ehrliche-zahlen/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/cloud-repatriation-tco-modell-ehrliche-zahlen/</guid><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cloud Repatriation</category><category>Financial Services</category><category>Platform Engineering</category><category>Backup and DR</category><category>Observability</category><description>Warum die meisten TCO-Modelle zur Cloud Repatriation falsch sind: übersehene Zielkosten, Sensitivitätsanalyse und Entscheidungen auf Ebene der Workloads.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cloud-repatriation-tco-modell-ehrliche-zahlen.jpg" alt=""></p><h2 id="warum-die-meisten-cloud-tco-modelle-falsch-sind">Warum die meisten Cloud-TCO-Modelle falsch sind</h2>
<p>Die Rechnung ist eine einzige Zahl. Die echte TCO der Public Cloud umfasst:</p>
<ul>
<li><strong>Egress-Gebühren</strong> — oft 5–15 % der Gesamtausgaben, leicht zu übersehen</li>
<li><strong>Schlecht genutzte Reservierungen</strong> — eine Ausschöpfung von 30–50 % ist üblich; der Rabatt verpufft</li>
<li><strong>Ungenutzte und überdimensionierte Ressourcen</strong> — 10–20 % der Compute-Ausgaben</li>
<li><strong>Aufschlag für Managed Services der Hyperscaler</strong> — 2–4× gegenüber Eigenbetrieb im großen Maßstab</li>
<li><strong>Wechselkosten durch Vendor-Lock-in</strong> — unsichtbar, bis etwas bricht</li>
<li><strong>Kapazität im Platform Engineering, die durch die Komplexität der jeweiligen Public Cloud gebunden ist</strong></li>
</ul>
<p>Ein echtes TCO-Modell erfasst all das.</p>
<h2 id="zielkosten--was-übersehen-wird">Zielkosten — was übersehen wird</h2>
<p>Für die Private Cloud als Ziel:</p>
<ul>
<li><strong>Hardware-Anschaffung + Erneuerung nach 5 Jahren</strong> (die Erneuerungswelle kommt)</li>
<li><strong>Rechenzentrum oder Colocation</strong></li>
<li><strong>Netzwerkbandbreite, einschließlich Egress zwischen Standorten</strong></li>
<li><strong>Storage-Tiering und Wachstum</strong></li>
<li><strong>Infrastruktur für Backup und DR</strong></li>
<li><strong>Identity, Observability, Plattform-Tooling</strong></li>
<li><strong>Kapazität im Platform Engineering für den Betrieb</strong></li>
<li><strong>Softwarelizenzen, sofern anfallend</strong></li>
</ul>
<p>Lassen Sie diese Posten weg, sieht die TCO künstlich gut aus; im zweiten Jahr holt Sie die Realität ein.</p>
<h2 id="sensitivitätsanalyse">Sensitivitätsanalyse</h2>
<p>Ein ehrliches TCO-Modell reagiert empfindlich auf Annahmen zur Auslastung:</p>
<ul>
<li>Eine Dauerauslastung von 50 % statt 80 % verändert die Wirtschaftlichkeit der Private Cloud dramatisch</li>
<li>Ein Wachstum der Workloads von 20 %/Jahr statt 50 %/Jahr verändert die Erneuerungszyklen der Hardware</li>
<li>Änderungen beim Egress-Volumen haben einen unverhältnismäßig großen Einfluss</li>
</ul>
<h2 id="entscheidungen-auf-ebene-der-workloads">Entscheidungen auf Ebene der Workloads</h2>
<p>Auf Portfolio-Ebene kann die TCO neutral ausfallen. Auf Ebene der Workloads zeigt sich meist:</p>
<ul>
<li>Top-10-Workloads: 60–80 % der Kostenbilanz</li>
<li>Der Rest der Workloads: allenfalls leicht kostenpositiv oder neutral</li>
</ul>
<p>Die Top-10-Workloads zurückzuholen und den Rest in der Cloud zu lassen, ist oft am besten.</p>
<h2 id="so-nutzen-sie-das-arbeitsblatt">So nutzen Sie das Arbeitsblatt</h2>
<p>Laden Sie das <strong><a href="https://aenix.io/de/ressourcen/cloud-repatriation-tco-worksheet/">Cloud-Repatriation-TCO-Worksheet</a></strong> herunter. Tragen Sie Ihre Zahlen ein und gehen Sie sie mit Ihrem Partner aus dem Finanzbereich und dem Platform Engineering durch. Bestimmen Sie die Top-10-Kandidaten für die Repatriierung. Prüfen Sie die Annahmen.</p>
<p>Für die vollständige Zusammenarbeit siehe <strong><a href="https://aenix.io/de/loesungen/cloud-repatriation/">Cloud Repatriation</a></strong>.</p>
]]></content:encoded></item><item><title>Cloud-native Infrastruktur für Forschung und Lehre — was Hochschulen 2026 wirklich brauchen</title><link>https://aenix.io/de/blog/2026/05/cloud-native-forschung-lehre-infrastruktur-hochschulen/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/cloud-native-forschung-lehre-infrastruktur-hochschulen/</guid><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Kubernetes</category><category>AI and ML</category><category>GPU</category><category>Multi-tenancy</category><description>Architekturmuster für Forschungs- und Lehrinfrastruktur an Hochschulen: die drei Aufgaben, GPU-Scheduling für Labore und die wiederkehrenden Fallstricke.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/cloud-native-forschung-lehre-infrastruktur-hochschulen.jpg" alt=""></p><p>Die IT von Hochschulen und Forschungsinstituten steht 2026 an einem schwierigen Schnittpunkt: steigender Bedarf an Research Computing (vor allem KI/ML), Vorgaben zur Reproduzierbarkeit (Plan S, FAIR, Horizon Europe), Lehrbedarf für Cloud-native Technologien, Governance mit vielen Beteiligten und Budgets, die nicht im Tempo des Rechenbedarfs wachsen. Cloud-native Plattformen — Open Source, Kubernetes-nativ, mandantenfähig — beantworten zunehmend all das zugleich, wo Infrastruktur aus der Zeit vor der Cloud für jeden Anwendungsfall eigens spezialisiert werden musste.</p>
<h2 id="die-drei-aufgaben-im-detail">Die drei Aufgaben im Detail</h2>
<p>Auf der <a href="https://aenix.io/de/branchen/universitaeten/">Branchenseite</a> haben wir drei Aufgaben von Hochschulen beschrieben. Hier gehen wir auf jede tiefer ein.</p>
<h3 id="aufgabe-1--research-computing-im-ki-zeitalter">Aufgabe 1 — Research Computing im KI-Zeitalter</h3>
<p>Der Bedarf an Research Computing hat sich in den letzten 5 Jahren erheblich verschoben. KI/ML-Workloads sind von einer „Spezialtätigkeit einzelner Labore“ zu einer „allgemeinen Forschungsmethode“ quer durch die Disziplinen geworden. Computational Biology, Materialwissenschaften, Klimamodellierung, NLP in den Geisteswissenschaften — alle setzen zunehmend auf Deep-Learning-Ansätze, die GPUs brauchen.</p>
<p>Die Infrastruktur-Antwort darauf bestand bisher aus:</p>
<ul>
<li><strong>EuroHPC / nationalem HPC</strong> — für die größten Workloads</li>
<li><strong>Institutsclustern</strong> — für mittlere Workloads, von den Laboren selbst verwaltet</li>
<li><strong>Cloud-GPU-Guthaben</strong> — für gelegentliche und experimentelle Workloads</li>
<li><strong>Persönlichen Workstations</strong> — für leichte Workloads</li>
</ul>
<p>Jede Variante hat Grenzen:</p>
<ul>
<li>HPC hat Zugangshürden und Wartezeiten und eignet sich nur bedingt für iterative KI/ML-Entwicklung</li>
<li>Institutscluster zersplittern das Know-how; jedes Labor pflegt seinen eigenen</li>
<li>Cloud-GPU-Guthaben sind im großen Maßstab nicht tragfähig; dazu kommen Souveränitätsbedenken bei sensiblen Daten</li>
<li>Persönliche Workstations stoßen bei kleinen Modellen an ihre Grenzen</li>
</ul>
<p>Was modernes Research Computing zunehmend will: <strong>einen gemeinsamen GPU-Pool mit starker Isolation, Self-Service für PIs, Verwaltung per IaC für Reproduzierbarkeit und, wo sinnvoll, Integration in nationale und europäische Forschungsinfrastruktur.</strong></p>
<p>Eine Kubernetes-native Plattform wie Cozystack liefert genau das. KubeVirt bedient ältere, VM-basierte Forschungs-Workflows; native Container bedienen moderne ML-Pipelines. Der NVIDIA GPU Operator übergibt ganze GPUs an Workloads, und HAMi teilt eine einzelne GPU nach Speicher und Rechenkernen zwischen Laboren auf; VMs erhalten VFIO-Passthrough ganzer GPUs oder NVIDIA vGPU (erfordert Ihre NVIDIA-vGPU-Lizenz). Das Tenant CRD sorgt für Isolation pro Labor. Das Cozystack Dashboard gibt PIs Self-Service. Dieselbe Infrastruktur lässt sich für die größten Workloads mit EuroHPC verbinden (viele Hochschulen haben hybride Vereinbarungen).</p>
<h3 id="aufgabe-2--infrastruktur-für-reproduzierbare-forschung">Aufgabe 2 — Infrastruktur für reproduzierbare Forschung</h3>
<p>Reproduzierbarkeit ist in vielen Förderkontexten vom Anspruch zur Pflicht geworden. Plan S, die FAIR-Prinzipien für Daten, die Anforderungen von Horizon Europe und fachspezifische Replikationskrisen (Psychologie, Sozialwissenschaften, Biomedizin) drängen alle zu reproduzierbaren Artefakten.</p>
<p>Für rechnergestützte Forschung erfordert Reproduzierbarkeit heute typischerweise:</p>
<ul>
<li>die Daten (mit persistenten Identifikatoren, DOIs)</li>
<li>den Code (mit Versionierung)</li>
<li><strong>die Laufzeitumgebung</strong> (Container-Images, IaC-Manifeste, Abhängigkeitsspezifikationen)</li>
</ul>
<p>Beim dritten Punkt kommt es auf die Infrastrukturebene an. Ein Forschungsartefakt mit der Angabe „wir haben Python 3.10 mit PyTorch 2.1 auf Ubuntu 22.04 verwendet“ ist nach 5 Jahren nicht reproduzierbar — die Pakete haben sich weiterentwickelt. Ein Forschungsartefakt mit Dockerfile (oder KubeVirt-VM-Image) IST reproduzierbar — die Laufzeitumgebung bleibt bitgenau erhalten.</p>
<p>Cozystack unterstützt dieses Muster nativ:</p>
<ul>
<li><strong>Containerisierte Umgebungen</strong> als Kubernetes-Manifeste + Image-Registry</li>
<li><strong>Langzeitarchivierung</strong> — Registries mit Aufbewahrungsrichtlinien</li>
<li><strong>Air-Gap-Installation</strong> — für sensible Forschung, die nicht von externen Registries abhängen darf</li>
<li><strong>Föderierte Muster</strong> — Forschungskonsortien mehrerer Einrichtungen können Container-Images über eine gemeinsame Registry teilen</li>
</ul>
<p>Die European Open Science Cloud (EOSC) ist die Dachinitiative, die die Infrastruktur für reproduzierbare Forschung an europäischen Hochschulen verbindet; Cozystack-Plattformen können sich an EOSC-Föderationen beteiligen.</p>
<h3 id="aufgabe-3--cloud-native-lehre">Aufgabe 3 — Cloud-native Lehre</h3>
<p>Informatik- und Ingenieurfakultäten lehren zunehmend Kubernetes, Container-Orchestrierung, GitOps, Observability und verwandte Themen. Die Herausforderung: Studierende brauchen echte Infrastruktur, an der sie praktisch lernen, und diese Infrastruktur muss:</p>
<ul>
<li>der Produktionsrealität entsprechen (damit Absolventen sofort einsetzbar sind)</li>
<li>gefahrloses Experimentieren erlauben (eine kaputte Umgebung darf benachbarte Studierende nicht beeinträchtigen)</li>
<li>sich zwischen Jahrgängen sauber zurücksetzen lassen</li>
<li>mit den Kapazitäten der Hochschul-IT laufen (ohne Betrieb auf kommerziellem Niveau zu erfordern)</li>
</ul>
<p>Cozystack deckt jeden Punkt ab:</p>
<ul>
<li><strong>Echte Plattform in Produktionsqualität</strong> — Studierende lernen, was die Industrie einsetzt (Cozystack läuft produktiv bei Hosting-Providern, Banken usw.)</li>
<li><strong>Tenant CRD pro Jahrgang</strong> — kaputte Studierendenumgebungen beeinträchtigen benachbarte Studierende nicht</li>
<li><strong>Durchgesetzte Quotas und RBAC</strong> — Fehlkonfigurationen von Studierenden bleiben eingegrenzt</li>
<li><strong>Self-Service für Lehrende</strong> — Lehrende legen Studierendenumgebungen ohne IT-Ticket an und löschen sie wieder</li>
<li><strong>Status als CNCF-Projekt</strong> — Studierende lernen das CNCF-Ökosystem kennen, was nach dem Abschluss wertvoll ist</li>
</ul>
<p>Erwähnenswert ist auch die Brancheninitiative CNOE (Cloud Native Operational Excellence) — es liefert Referenzmuster für Cloud-native Umgebungen, die sich für die akademische Lehre eignen.</p>
<h2 id="architekturmuster-die-sich-bewährt-haben">Architekturmuster, die sich bewährt haben</h2>
<p>Speziell an Hochschulen und Forschungsinstituten haben sich mehrere Architekturmuster als tragfähig erwiesen:</p>
<h3 id="muster-a--zentraler-research-computing-dienst">Muster A — zentraler Research-Computing-Dienst</h3>
<p>Eine Cozystack-Installation, betrieben von einem zentralen Research-Computing-Team, das mehrere Fakultäten bzw. Labore als Tenants bedient. Am besten für mittlere bis große Hochschulen (10.000+ Studierende, mehrere forschungsstarke Fakultäten).</p>
<h3 id="muster-b--föderierte-institutscluster">Muster B — föderierte Institutscluster</h3>
<p>Mehrere Cozystack-Installationen, eine pro großer Fakultät, mit gemeinsamer Identity und Föderation für fakultätsübergreifende Projekte. Am besten für sehr große Hochschulen oder Systeme mit mehreren Standorten.</p>
<h3 id="muster-c--plattform-für-forschungskonsortien">Muster C — Plattform für Forschungskonsortien</h3>
<p>Forschungskonsortien mehrerer Einrichtungen betreiben eine gemeinsame Cozystack-Plattform unter gemeinsamer Governance. Am besten für kooperative Forschung mit erheblichem Rechenbedarf.</p>
<h3 id="muster-d--plattform-für-fe-institute">Muster D — Plattform für F&amp;E-Institute</h3>
<p>Forschungsinstitute (IT, Ingenieurwesen, Biotech) betreiben Cozystack als zentrale Forschungsinfrastruktur. Oft kombiniert mit Zugängen für Industriepartner über das Tenant-CRD-Modell.</p>
<h2 id="besonderheiten-von-hochschulen">Besonderheiten von Hochschulen</h2>
<h3 id="open-source-ethos">Open-Source-Ethos</h3>
<p>Die akademische Kultur bevorzugt klar Open-Source-Infrastruktur. Apache 2.0, transparente Governance, die Möglichkeit, Code einzusehen und zu verändern — all das entspricht akademischen Werten. Der Status von Cozystack als CNCF-Projekt und die Lizenz Apache 2.0 passen dazu.</p>
<h3 id="realistische-budgets">Realistische Budgets</h3>
<p>Die IT-Budgets von Hochschulen wachsen nicht mit dem Rechenbedarf. Eine Open-Source-Plattform mit optionalem kommerziellem Support ist ein wirtschaftlich tragfähiges Modell. Subscriptions mit Preisen pro CPU (typisch für kommerzielle Alternativen) passen nicht zur Hochschulfinanzierung.</p>
<h3 id="planung-über-jahrzehnte">Planung über Jahrzehnte</h3>
<p>Hochschulen planen in Jahrzehnten, nicht in Quartalen. Herstellergetriebene Plattformen, deren Roadmap und Preise sich mit Konzernentscheidungen ändern, sind für eine Planung über Jahrzehnte riskant. Von der Community gesteuerte Open-Source-Projekte sind in dieser Hinsicht berechenbarer.</p>
<h3 id="souveränität-für-manche-forschung">Souveränität für manche Forschung</h3>
<p>Medizinische Forschungsdaten, Verschlusssachen, Forschung mit Industriepartnern unter NDA — all das profitiert von Infrastruktur, die Daten unter der Kontrolle der Einrichtung hält. Die Air-Gap-Unterstützung von Cozystack, die optionale Volume-Verschlüsselung im Ruhezustand (LINSTOR und LUKS) mit einer Passphrase, die die Einrichtung verwaltet, und der Betrieb On-Premises erfüllen diese Anforderungen.</p>
<h3 id="föderation-mit-nationaler-und-europäischer-infrastruktur">Föderation mit nationaler und europäischer Infrastruktur</h3>
<p>EuroHPC für die größten Workloads. EOSC für die Föderation von Open Science. GÉANT für das europäische Forschungsnetz. Nationale Forschungsnetze. Cozystack-Plattformen lassen sich über Standard-Kubernetes-APIs mit all diesen verbinden.</p>
<h3 id="industriepartnerschaften">Industriepartnerschaften</h3>
<p>Hochschulen arbeiten bei geförderter Forschung zunehmend mit der Industrie zusammen. Die Plattform muss Zugriffsmuster für viele Beteiligte unterstützen — Forschende der Hochschule und der Industriepartner, mit angemessener Isolation und Schutz des geistigen Eigentums. Das Tenant CRD mit verschachtelten Tenants leistet das.</p>
<h2 id="häufige-fallstricke">Häufige Fallstricke</h2>
<h3 id="fallstrick-1-reines-hpc-denken">Fallstrick 1: reines HPC-Denken</h3>
<p>Wer Research Computing als „kleines HPC“ behandelt, übersieht, dass der iterative Entwicklungsablauf bei KI/ML nicht zum Warteschlangenmodell von HPC passt. Moderne Research-Computing-Plattformen müssen sowohl interaktive (Notebook-artige) als auch Batch-Workloads abdecken.</p>
<h3 id="fallstrick-2-zersplitterung-durch-cluster-pro-labor">Fallstrick 2: Zersplitterung durch Cluster pro Labor</h3>
<p>Baut jedes Labor seinen eigenen Cluster, zersplittert das Know-how, die Wartung verdoppelt sich, und Ressourcen lassen sich bei Lastspitzen nicht teilen. Eine zentrale oder föderierte Plattform steigert den Nutzen immer weiter.</p>
<h3 id="fallstrick-3-zu-wenig-in-den-betrieb-investiert">Fallstrick 3: zu wenig in den Betrieb investiert</h3>
<p>Research Computing, das Doktoranden oder Postdocs nebenbei betreiben, ist nicht von Dauer. Ein eigenes Research-Computing-Team (auch ein kleines) ist notwendig.</p>
<h3 id="fallstrick-4-lehrinfrastruktur-die-nicht-zur-praxis-passt">Fallstrick 4: Lehrinfrastruktur, die nicht zur Praxis passt</h3>
<p>Kubernetes auf einem Single-Tenant-minikube zu lehren heißt, an einem Spielzeug zu lehren. Wer auf einer mandantenfähigen Plattform nach Produktionsmustern lehrt, bringt Absolventen hervor, die mit den Plattformen arbeiten können, die die Industrie tatsächlich betreibt.</p>
<h3 id="fallstrick-5-reproduzierbarkeit-als-nachgedanke">Fallstrick 5: Reproduzierbarkeit als Nachgedanke</h3>
<p>Wer Forschungsinfrastruktur ohne Muster für Reproduzierbarkeit ab dem ersten Tag aufbaut, muss später teuer nachrüsten. Containerisierung und IaC-Disziplin sollten der Standard sein.</p>
<h2 id="was-ænix-für-hochschulen-konkret-bietet">Was Ænix für Hochschulen konkret bietet</h2>
<p>Ænix hat Cozystack-basierte Plattformen für Hochschulen und Forschungsinstitute in der EU und in Zentralasien gebaut. Die Besonderheiten der Zusammenarbeit:</p>
<ul>
<li><strong>Vertraut mit öffentlicher Beschaffung</strong> — RFI / RFP über die üblichen Kanäle in der EU und in Zentralasien</li>
<li><strong>Kapazitätstransfer als Kernbestandteil</strong> — die Wissensübergabe an die hochschuleigene IT ist ein ausdrückliches Ergebnis</li>
<li><strong>Schrittweise Zusammenarbeit</strong>, wo sinnvoll abgestimmt auf Förderzyklen</li>
<li><strong>Konsortien mehrerer Einrichtungen</strong> werden unterstützt</li>
</ul>
<p>Details finden Sie auf der <strong><a href="https://aenix.io/de/branchen/universitaeten/">Branchenseite für Hochschulen</a></strong>.</p>
]]></content:encoded></item><item><title>Wie man eine souveräne Cloud aufbaut — Playbook für die EU und Zentralasien 2026</title><link>https://aenix.io/de/blog/2026/05/souveraene-cloud-aufbauen-eu-zentralasien/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/souveraene-cloud-aufbauen-eu-zentralasien/</guid><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DORA</category><category>NIS2</category><category>Sovereignty</category><category>Financial Services</category><category>Backup and DR</category><category>Observability</category><description>Was Souveränität in der Praxis bedeutet, welche Regelwerke sie definieren und welche Architekturmuster eine souveräne Cloud in EU und Zentralasien trägt.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/souveraene-cloud-aufbauen-eu-zentralasien.jpg" alt=""></p><p>Die souveräne Cloud ist kein Nischenthema mehr. Vorgaben der EU-Mitgliedstaaten, Souveränitätsklauseln auf dem Beschaffungsportal Kasachstans und mehrere Initiativen im asiatisch-pazifischen Raum haben Souveränität zu einer eigenen Marktkategorie gemacht. Die „souveränen“ Regionen der Hyperscaler versuchen, darauf zu antworten, stoßen aber an strukturelle Grenzen (Bindung an US-Anbieter, Abhängigkeiten in der Control Plane).</p>
<p>Die Chance für eigens gebaute souveräne Cloud-Produkte ist real — doch der Aufwand für Engineering, Zertifizierung und Betrieb ist erheblich.</p>
<h2 id="was-souveränität-wirklich-bedeutet">Was Souveränität wirklich bedeutet</h2>
<p>Souveränität ist mehr als Datenresidenz. Die vollständigen Anforderungen:</p>
<ol>
<li><strong>Datenresidenz auf jeder Ebene</strong> — Produktion, Backup, Observability, CI/CD, Telemetrie</li>
<li><strong>Verschlüsselung mit vom Kunden kontrollierten Schlüsseln</strong> — HSM, dokumentierte Rotation, Verfahren für den Notfallzugriff</li>
<li><strong>Open-Source-Fundament der Plattform</strong> — Transparenz und Ausstiegsfähigkeit</li>
<li><strong>Transparente Lieferkette</strong> — mindestens bis zur zweiten Stufe</li>
<li><strong>Air-Gap-Option</strong> für die sensibelsten Workloads</li>
<li><strong>Vollständiger Audit-Trail</strong> in Formaten, die die Aufsicht verarbeiten kann</li>
<li><strong>Keine Phone-Home-Telemetrie</strong> — nur Opt-in</li>
<li><strong>Betriebliche Unabhängigkeit</strong> — das Team der souveränen Cloud untersteht einer souveränen Rechtsordnung</li>
</ol>
<p>Ein „souveränes Cloud“-Produkt, das nicht alle diese Punkte substanziell erfüllt, scheitert beim Audit der Aufsicht.</p>
<h2 id="konkrete-regelwerke-zur-souveränität">Konkrete Regelwerke zur Souveränität</h2>
<p>Jede Rechtsordnung hat ihr eigenes Regelwerk:</p>
<h3 id="eu">EU</h3>
<ul>
<li><strong>EUCS (EU Cybersecurity Certification Scheme for Cloud Services)</strong> — vorgeschlagenes EU-weites Schema (Annahme ausstehend)</li>
<li><strong>SecNumCloud</strong> (Frankreich) — strenge französische Souveränitätsanforderung</li>
<li><strong>BSI C5</strong> (Deutschland) — deutscher Kriterienkatalog für Cloud-Sicherheit</li>
<li><strong>DORA</strong> — speziell für Finanzdienstleistungen, gilt für Cloud-Provider, die Banken bedienen</li>
<li><strong>NIS2</strong> — breitere Cybersicherheit; Cloud-Anbieter gehören zu einem Sektor nach Anhang I (wesentliche oder wichtige Einrichtungen, je nach Größe)</li>
</ul>
<h3 id="zentralasien">Zentralasien</h3>
<ul>
<li><strong>Kasachstan</strong> — durch die Beschaffung vorgeschriebene Souveränität für Workloads des öffentlichen Sektors.</li>
<li><strong>Weitere GUS-Staaten</strong> — verschiedene nationale Regelwerke im Entstehen</li>
</ul>
<h3 id="andere-regionen">Andere Regionen</h3>
<ul>
<li><strong>Französisches SecNumCloud</strong> außerhalb Frankreichs: wird zunehmend als Referenz herangezogen</li>
<li><strong>Asien-Pazifik</strong> — Singapur IM8, Indien MeitY, Australien IRAP usw.</li>
</ul>
<h2 id="architekturmuster-für-die-souveräne-cloud">Architekturmuster für die souveräne Cloud</h2>
<h3 id="muster-1-vollständig-on-premises-betriebene-souveräne-cloud">Muster 1: vollständig On-Premises betriebene souveräne Cloud</h3>
<p>Hardware des Kunden, vom Kunden betrieben, auf jeder Ebene vom Kunden kontrolliert. Maximale Souveränität bei maximalem Betriebsaufwand. Richtig für die sensibelsten Workloads (Verschlusssachen, Kernbankensysteme).</p>
<h3 id="muster-2-verwaltete-souveräne-cloud">Muster 2: verwaltete souveräne Cloud</h3>
<p>Hardware des Cloud-Providers + souveräne Rechtsordnung + vom Kunden kontrollierte Schlüssel + transparente Lieferkette. Vereinfachter Betrieb bei substanzieller Souveränität. Richtig für die meisten regulierten Unternehmens-Workloads.</p>
<h3 id="muster-3-hybrid-aus-souveräner-und-nicht-souveräner-cloud">Muster 3: Hybrid aus souveräner und nicht souveräner Cloud</h3>
<p>Workloads mit kritischen Funktionen auf der souveränen Cloud, unkritische beim Hyperscaler. Ein verbreitetes Muster bei Finanzdienstleistern.</p>
<h3 id="muster-4-souveräne-edge-cloud">Muster 4: souveräne Edge-Cloud</h3>
<p>Die souveräne Cloud wird auf Edge-Standorte innerhalb der Rechtsordnung verteilt. Richtig für Workloads, die sowohl Souveränität als auch Nähe zum Edge brauchen (IoT, Telco).</p>
<h2 id="cozystack-als-fundament-der-souveränen-cloud">Cozystack als Fundament der souveränen Cloud</h2>
<p>Cozystack ist Open Source (Apache 2.0), wird als CNCF-Projekt gesteuert (die Roadmap bestimmt die Community), unterstützt Air-Gap-Installationen, Volume-Verschlüsselung mit Schlüsseln beim Kunden (Opt-in) und Audit-Logs, die sich in Systeme des Kunden ausleiten lassen.</p>
<p>Speziell für Betreiber souveräner Clouds:</p>
<ul>
<li>Mandantenmodell mit dem Tenant CRD — für ein souveränes Cloud-Produkt für Endkunden</li>
<li>Cozystack Dashboard — Self-Service-Oberfläche für Kunden</li>
<li>Integration der WHMCS-Abrechnung — für ein Abonnement-Angebot an Endkunden (ein Ænix-Produkt auf Basis von Cozystack, keine Upstream-Komponente)</li>
<li>Air-Gap-Installation unterstützt und dokumentiert</li>
<li>VictoriaMetrics + VictoriaLogs — selbst gehostete Observability (keine SaaS-Abhängigkeit)</li>
<li>Cilium-Netzwerk — souveränitätsfreundlich, keine Abhängigkeit von einer proprietären Netzwerkplattform</li>
</ul>
<h2 id="zeitplan-der-umsetzung">Zeitplan der Umsetzung</h2>
<p>Ein souveränes Cloud-Produkt aufzubauen dauert länger als eine nicht souveräne Cloud:</p>
<ul>
<li><strong>Discovery + Assessment:</strong> kostenloses 30-minütiges Discovery-Gespräch, danach ein <a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a> zum Festpreis (14 oder 28 Tage)</li>
<li><strong>Einzelner Anbieter im Providermaßstab:</strong> Plattform mit dem produktisierten Installer wenige Wochen nach Bereitstellung der Hardware live</li>
<li><strong>Nationales oder Betreiberprogramm:</strong> 3–6 Monate Pilot, danach 9–18 Monate bis zum vollen Multi-Region-Betrieb</li>
<li><strong>Zertifizierung:</strong> läuft parallel zum Aufbau; ihr Umfang kann den Termin des ersten zertifizierten Dienstes verschieben</li>
<li><strong>Onboarding der Kunden:</strong> fortlaufend</li>
</ul>
<h2 id="zusammenarbeit-mit-ænix">Zusammenarbeit mit Ænix</h2>
<p>Ænix baut souveräne Cloud-Produkte von Anfang bis Ende, mit einem Team von rund 20 Personen in der EU und in Zentralasien. Open-Source-Fundament. Dokumentation, die für die Beschaffung bereit ist.</p>
<p>Details finden Sie auf der <strong><a href="https://aenix.io/de/dienstleistungen/sovereign-cloud-builder/">Seite zum Sovereign Cloud Builder</a></strong> und bei der <strong><a href="https://aenix.io/de/produkte/public-cloud-platform/">Ænix Public Cloud Platform</a></strong>.</p>
]]></content:encoded></item><item><title>Die eigene Private Cloud aufbauen — ein 90-Tage-Playbook für den Ansatz unter Führung des Plattform-Teams</title><link>https://aenix.io/de/blog/2026/05/private-cloud-aufbauen-90-tage-playbook/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/private-cloud-aufbauen-90-tage-playbook/</guid><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DORA</category><category>NIS2</category><category>VMware</category><category>Cozystack</category><category>Cilium</category><category>Talos</category><description>Ein Plan von Tag 0 bis Tag 90 für den Aufbau einer Private Cloud: was jeden Monat entsteht, was Sie bewusst weglassen und wo Teams regelmäßig straucheln.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/private-cloud-aufbauen-90-tage-playbook.jpg" alt=""></p><p>„Die eigene Cloud bauen“ war 2018 noch ein Nischenthema. 2026 ist es Mainstream — die Preisänderungen von Broadcom, der Druck in Richtung Souveränität und die Wirtschaftlichkeit von KI-Workloads haben Tausende Organisationen von „Wir mieten einfach Cloud“ zu „Wir brauchen eine Plattform, die wir selbst kontrollieren“ gebracht.</p>
<p>Was früher 18 Monate dauerte, schafft man heute für das Fundament in rund 90 Tagen; die folgenden Quartale bringen dann Reife. Der Grund: Der Open-Source-Plattform-Stack ist ausgereift.</p>
<h2 id="tag-0-discovery-1-woche">Tag 0: Discovery (1 Woche)</h2>
<p>Bevor Sie bauen, verständigen Sie sich auf:</p>
<ul>
<li><strong>Auslöser</strong> — was treibt Sie zum Aufbau? (VMware-Ausstieg, Souveränität, Kosten, KI.) Der Auslöser prägt die Architektur.</li>
<li><strong>Workload-Portfolio</strong> — was läuft heute, was kommt hinzu. Daraus folgt die Dimensionierung.</li>
<li><strong>Kapazität</strong> — die Kapazität des internen Teams, die Plattform nach dem Aufbau zu betreiben.</li>
<li><strong>Hardware-Rahmenbedingungen</strong> — Rechenzentrums- oder Colocation-Vereinbarungen, Erneuerungszyklen, Netzwerkanbindung.</li>
<li><strong>Compliance-Umfang</strong> — DORA, NIS2, DSGVO, branchenspezifische Vorgaben.</li>
</ul>
<p>Ergebnis: ein einseitiges Architektur-Briefing. Noch kein Code.</p>
<h2 id="tag-130-fundament">Tag 1–30: Fundament</h2>
<h3 id="woche-1-hardware-einrichten">Woche 1: Hardware einrichten</h3>
<ul>
<li>Compute-Server beschafft bzw. umgewidmet</li>
<li>Storage-Tier bereitgestellt</li>
<li>Netzwerk-Fabric konfiguriert (BGP, Leaf-Spine)</li>
<li>Out-of-Band-Management</li>
</ul>
<h3 id="woche-2-betriebssystem-und-plattform">Woche 2: Betriebssystem und Plattform</h3>
<ul>
<li>Talos Linux installiert (Standard für Cozystack) oder die gewählte Betriebssystemschicht</li>
<li>Cozystack-Plattform ausgerollt</li>
<li>Erster Cluster in Betrieb</li>
<li>Zugriff für Operatoren und Admins geprüft</li>
</ul>
<h3 id="woche-3-storage-und-netzwerk">Woche 3: Storage und Netzwerk</h3>
<ul>
<li>LINSTOR (DRBD) ausgerollt und validiert</li>
<li>Cilium mit Network Policies konfiguriert</li>
<li>MetalLB / Ingress eingerichtet</li>
<li>Replikation über Nodes hinweg getestet</li>
</ul>
<h3 id="woche-4-identity-und-observability">Woche 4: Identity und Observability</h3>
<ul>
<li>Keycloak (oder der gewählte IdP) integriert</li>
<li>VictoriaMetrics + VictoriaLogs ausgerollt</li>
<li>Erste Dashboards und Alerts</li>
<li>Audit-Logging konfiguriert</li>
</ul>
<p>Ende von Tag 30: eine funktionierende Plattform. Single-Tenant, ein Cluster, grundlegende Observability. Für Kunden noch nicht produktionsreif.</p>
<h2 id="tag-3160-mandantenfähigkeit-und-betrieb">Tag 31–60: Mandantenfähigkeit und Betrieb</h2>
<h3 id="woche-56-mandantenfähigkeit">Woche 5–6: Mandantenfähigkeit</h3>
<ul>
<li>Tenant CRD konfiguriert</li>
<li>RBAC und Quotas pro Tenant</li>
<li>Playbook für das Onboarding von Tenants</li>
<li>Erste Test-Tenants bereitgestellt</li>
</ul>
<h3 id="woche-78-betrieb">Woche 7–8: Betrieb</h3>
<ul>
<li>Runbooks für typische Szenarien (Ausfall eines Pods, Ausfall eines Nodes, Wiederherstellung der Control Plane, Zertifikatsrotation)</li>
<li>Rufbereitschaft eingerichtet</li>
<li>Backup und DR mit Velero</li>
<li>Prozess für die Incident Response dokumentiert</li>
</ul>
<p>Ende von Tag 60: Die Plattform trägt mehrere Tenants mit dokumentiertem Betrieb. Bereit für das Onboarding der ersten echten Workload.</p>
<h2 id="tag-6190-workload-onboarding-und-golden-paths">Tag 61–90: Workload-Onboarding und Golden Paths</h2>
<h3 id="woche-910-migration-der-ersten-workload">Woche 9–10: Migration der ersten Workload</h3>
<ul>
<li>Pilot-Workload (geringes Risiko) aus der bestehenden Infrastruktur migriert</li>
<li>Performance und Stabilität validiert</li>
<li>Backup und Wiederherstellung getestet</li>
<li>Feedback der (internen) Kunden eingeholt</li>
</ul>
<h3 id="woche-1112-golden-paths">Woche 11–12: Golden Paths</h3>
<ul>
<li>Self-Service-Pfade für die 5–10 häufigsten Bedürfnisse der Produktteams</li>
<li>Service-Vorlagen dokumentiert</li>
<li>Automatisches Onboarding in die Observability</li>
<li>CI/CD auf Anwendungsebene integriert</li>
</ul>
<p>Ende von Tag 90: Die Plattform trägt produktive Workloads mit Self-Service. Von hier an wächst die Reife immer weiter.</p>
<h2 id="was-sie-in-90-tagen-weglassen">Was Sie in 90 Tagen weglassen</h2>
<p>Ehrlich benannt:</p>
<ul>
<li><strong>Ausgefeiltes Kundenportal</strong> — das Cozystack Dashboard funktioniert, der Feinschliff der Oberfläche erfolgt aber schrittweise.</li>
<li><strong>Betrieb über mehrere Regionen / Rechenzentren</strong> — zuerst eine Region; mehrere Regionen in den Monaten 4–6.</li>
<li><strong>Optimierung für GPU-/KI-Workloads</strong> — generische GPU-Unterstützung ja; KI-spezifische Optimierungen später.</li>
<li><strong>Umfassende Compliance-Zertifizierung</strong> — die Architektur ist auf DORA/NIS2/DSGVO ausgerichtet; das Zertifizierungsaudit ist ein eigenes Vorhaben.</li>
<li><strong>Stilllegung der Altinfrastruktur</strong> — meist in den Monaten 4–12 in Kohorten.</li>
</ul>
<h2 id="wo-teams-regelmäßig-straucheln">Wo Teams regelmäßig straucheln</h2>
<h3 id="stolperstein-1-unterbesetztes-plattform-team">Stolperstein 1: unterbesetztes Plattform-Team</h3>
<p>Ein Plattform-Team aus 5 Personen, das eine Private Cloud baut und nebenbei die bestehende Infrastruktur betreibt, bleibt in Woche 4 stecken. Realistische Teamgröße: 5–10 dedizierte Engineers für die Aufbauphase; für den Regelbetrieb kann es auf 3–5 schrumpfen.</p>
<h3 id="stolperstein-2-an-der-observability-sparen">Stolperstein 2: an der Observability sparen</h3>
<p>Die Observability wird zusammengestrichen, weil sie in den Demos an Tag 0 nicht auftaucht. In der Produktion rächt sich das. Bauen Sie die Observability in Woche 4 zusammen mit der Kernplattform auf.</p>
<h3 id="stolperstein-3-herstellergetriebene-private-cloud-appliance">Stolperstein 3: herstellergetriebene „Private-Cloud-Appliance“</h3>
<p>Wer eine „komplette Private Cloud in der Box“ kauft, baut den Lock-in wieder auf. Auch der Aufbau geht langsamer voran, weil die Appliance im Weg steht.</p>
<h3 id="stolperstein-4-keine-produktorientierung-im-plattform-team">Stolperstein 4: keine Produktorientierung im Plattform-Team</h3>
<p>Exzellentes Engineering ohne Produktorientierung bringt eine Plattform hervor, die interne Kunden nicht so annehmen, wie sie gedacht war.</p>
<h3 id="stolperstein-5-die-compliance-ebene-überspringen">Stolperstein 5: die Compliance-Ebene überspringen</h3>
<p>Eine Architektur, die Compliance auf später verschiebt, muss nachgerüstet werden. Bauen Sie Souveränität, Audit und Observability von Tag 0 an mit Blick auf die Compliance.</p>
<h2 id="was-90-tage-nicht-umfassen">Was 90 Tage nicht umfassen</h2>
<p>Das 90-Tage-Playbook liefert ein Fundament. Die Reife wächst weiter:</p>
<ul>
<li><strong>Monate 4–6:</strong> Migrationskohorten für Workloads, Ausbau der Golden Paths, regionaler Standort / DR-Standort</li>
<li><strong>Monate 7–12:</strong> GPU-/KI-Subsysteme, fortgeschrittene Muster für Mandantenfähigkeit, FinOps-Integration</li>
<li><strong>Jahr 2:</strong> Reife, Optimierung, Skalierung</li>
</ul>
<p>Eine Private Cloud im zweiten Jahr ist eine andere Plattform als eine Private Cloud an Tag 90.</p>
]]></content:encoded></item><item><title>Die besten VMware-Alternativen 2026 — ausführlicher Vergleich und Entscheidungsrahmen</title><link>https://aenix.io/de/blog/2026/05/vmware-alternativen-2026-vergleich-entscheidung/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/vmware-alternativen-2026-vergleich-entscheidung/</guid><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>OpenStack</category><category>OpenShift</category><category>Kubernetes</category><category>Cozystack</category><category>Sovereignty</category><description>Entscheidungsrahmen und Rangliste der ernstzunehmenden VMware-Alternativen 2026: was jede Plattform ist, für wen sie passt und was die Migration kostet.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/vmware-alternativen-2026-vergleich-entscheidung.jpg" alt=""></p><p>Der Markt für VMware-Alternativen sieht 2026 anders aus als 2022. Die Preisänderungen von Broadcom, der Druck in Richtung Souveränität und die Reife Kubernetes-nativer Alternativen haben die Landschaft verschoben. Dies ist die praxistaugliche Fassung der „besten VMware-Alternativen“ — mit genug Tiefe, um tatsächlich zu entscheiden.</p>
<h2 id="entscheidungsrahmen--fünf-fragen">Entscheidungsrahmen — fünf Fragen</h2>
<p>Bevor Sie Produkte bewerten, beantworten Sie diese fünf Fragen:</p>
<ol>
<li><strong>Was ist Ihre wichtigste Workload?</strong> Nur VMs / überwiegend VMs / gemischt aus VMs und Containern / nur Container.</li>
<li><strong>Mandantenfähigkeit?</strong> Single-Tenant / mehrere Geschäftsbereiche / Service-Provider-Modell mit Endkunden.</li>
<li><strong>Größenordnung?</strong> &lt;50 Hosts / 50–500 Hosts / &gt;500 Hosts.</li>
<li><strong>Bestehende Beziehungen?</strong> Red Hat / Microsoft / Erfahrung mit OpenStack / offen für Open Source / nur kommerzielle Anbieter.</li>
<li><strong>Auslöser?</strong> Kosten (Broadcom-Preise), Souveränität (Aufsicht), KI-Workload, Größenordnung, Greenfield.</li>
</ol>
<p>Ihre Antworten grenzen die realistischen Optionen auf 1–2 Kandidaten ein.</p>
<h2 id="die-wichtigsten-alternativen-nach-anwendungsfall">Die wichtigsten Alternativen nach Anwendungsfall</h2>
<h3 id="für-service-provider-und-betreiber-mandantenfähiger-clouds">Für Service-Provider und Betreiber mandantenfähiger Clouds</h3>
<p><strong>Beste Wahl: Cozystack</strong> (Open Source, Kubernetes-nativ, native Mandantenfähigkeit über das Tenant CRD)</p>
<p><strong>Zweitbeste Wahl: OpenStack</strong> (ausgereift, mandantenfähig über Keystone, im Telco-Maßstab bewährt; hohe betriebliche Komplexität)</p>
<p><strong>Warum Cozystack vorne liegt:</strong> Das Mandantenmodell ist strukturell angelegt, nicht nachträglich angeflanscht. Eine Plattform für VMs + Container + Datenbanken + S3 + GPU. Open Source — kein Vendor-Lock-in. Geringerer Betriebsaufwand als OpenStack.</p>
<h3 id="für-regulierte-unternehmen-banken-versicherungen-finanzdienstleister">Für regulierte Unternehmen (Banken, Versicherungen, Finanzdienstleister)</h3>
<p><strong>Beste Wahl: Cozystack</strong> (Souveränität durch Architektur, optionale Volume-Verschlüsselung mit einer Passphrase, die Sie verwalten, auditfähig)</p>
<p><strong>Zweitbeste Wahl: OpenShift Virtualization</strong> (kommerzieller Support von Red Hat, etablierte Beschaffungsbeziehungen)</p>
<p><strong>Warum Cozystack bei Souveränität vorne liegt:</strong> Open-Source-Plattform auf Kunden-Hardware, Zugriff auf den Cluster kontrolliert der Kunde. Die Souveränität ist strukturell, kein „souverän mit Einschränkungen“.</p>
<h3 id="für-bestehende-red-hat---openshift-kunden">Für bestehende Red-Hat- / OpenShift-Kunden</h3>
<p><strong>Beste Wahl: OpenShift Virtualization</strong> (KubeVirt-basiert, in bestehendes OpenShift integriert)</p>
<p><strong>Zweitbeste Wahl: Cozystack</strong> (sofern die Beschaffung es zulässt; bessere Mandantenfähigkeit)</p>
<p><strong>Warum OpenShift in diesem Fall vorne liegt:</strong> Bestehende Beziehung zu Red Hat / IBM, etablierte Beschaffung, vertraut für das Team.</p>
<h3 id="für-kmu--single-tenant--labs">Für KMU / Single-Tenant / Labs</h3>
<p><strong>Beste Wahl: Proxmox VE</strong> (ausgereift, einfache Installation, starke Community)</p>
<p><strong>Zweitbeste Wahl: Scale Computing HC3</strong> (Einfachheit einer Appliance)</p>
<p><strong>Warum Proxmox vorne liegt:</strong> Open Source, große Community, gut geeignet für Single-Tenant-Installationen unter etwa 50 Hosts.</p>
<h3 id="für-robo--edge">Für ROBO / Edge</h3>
<p><strong>Beste Wahl: Scale Computing HC3</strong> (Appliance, für ROBO/Edge konzipiert)</p>
<p><strong>Zweitbeste Wahl: Cozystack</strong> (wenn ein einheitlicher Betrieb über mehrere Standorte zählt)</p>
<p><strong>Warum Scale bei reinem ROBO vorne liegt:</strong> Betriebliche Einfachheit an Edge-Standorten; konzipiert für Umgebungen ohne eigenes Infrastruktur-Team.</p>
<h3 id="für-ki--gpu-im-großen-maßstab">Für KI / GPU im großen Maßstab</h3>
<p><strong>Beste Wahl: Cozystack</strong> (KubeVirt + NVIDIA GPU Operator für NVIDIA-Rechenzentrums-GPUs; Passthrough ganzer GPUs an VMs, NVIDIA vGPU für VMs (erfordert Ihre NVIDIA-vGPU-Lizenz), fraktionierte Freigabe über HAMi)</p>
<p><strong>Zweitbeste Wahl: OpenShift Virtualization</strong> (Red-Hat-Ökosystem mit GPU)</p>
<p><strong>Warum Cozystack bei KI vorne liegt:</strong> Kubernetes-nativ bedeutet GPU-Workloads in Containern und VMs auf einer Plattform. Das Mandantenmodell bietet Platz für mehrere Data-Science-Teams. Souveränität für die Datenresidenz.</p>
<h3 id="für-microsoft-orientierte-organisationen">Für Microsoft-orientierte Organisationen</h3>
<p><strong>Beste Wahl: Azure Stack HCI</strong> (Hyper-V + Integration mit Azure Arc)</p>
<p><strong>Zweitbeste Wahl: Cozystack</strong> (wenn Open Source wichtiger ist als das Microsoft-Ökosystem)</p>
<p><strong>Warum Azure Stack HCI bei Microsoft-Häusern vorne liegt:</strong> Vertrautes Fundament mit Hyper-V; Azure Arc schlägt die Brücke zur Azure-Cloud; die Microsoft-Lizenzierung rechnet sich.</p>
<h3 id="für-telekommunikation-und-behörden-mit-openstack-erfahrung">Für Telekommunikation und Behörden mit OpenStack-Erfahrung</h3>
<p><strong>Beste Wahl: OpenStack</strong> (im Telco-Maßstab bewährt)</p>
<p><strong>Zweitbeste Wahl: Cozystack</strong> (geringerer Betriebsaufwand; Option zur schrittweisen Migration)</p>
<p><strong>Warum OpenStack bei eingespielten Teams vorne liegt:</strong> Vorhandene Expertise, ausgereifte Distributionen der Hersteller, im Telco-Maßstab validiert.</p>
<h3 id="für-reine-container-workloads-ohne-vms">Für reine Container-Workloads (ohne VMs)</h3>
<p><strong>Beste Wahl: Vanilla-Kubernetes</strong> (kleinste Plattform, geringster Overhead)</p>
<p><strong>Zweitbeste Wahl: Cozystack</strong> (mandantenfähiges Kubernetes, wenn Isolation wichtig ist)</p>
<p><strong>Warum reines Kubernetes vorne liegt:</strong> Ohne VMs ist die KubeVirt-Schicht überflüssig; reine Container-Plattformen sind einfacher.</p>
<h2 id="was-sich-wirklich-von-vmware-unterscheidet">Was sich wirklich von VMware unterscheidet</h2>
<p>Für jede Alternative die architektonischen Abweichungen von VMware, die einen Neuentwurf erfordern:</p>
<h3 id="cozystack">Cozystack</h3>
<ul>
<li><strong>Netzwerk:</strong> Cilium (eBPF) ≠ NSX. Ein anderes Modell; wird während der Migration neu entworfen.</li>
<li><strong>Mandantenfähigkeit:</strong> Tenant CRD ≠ vCloud Director. Konzeptionell anders; Abbildung während der Migration.</li>
<li><strong>Betrieb:</strong> Betriebsmodell von Kubernetes; Lernkurve für das Team.</li>
</ul>
<h3 id="openshift-virtualization">OpenShift Virtualization</h3>
<ul>
<li><strong>Betrieb:</strong> OpenShift ist umfangreicher als VMware; Lernkurve für das Team.</li>
<li><strong>Preise:</strong> Subscription-Modell von Red Hat.</li>
</ul>
<h3 id="nutanix-ahv">Nutanix AHV</h3>
<ul>
<li><strong>Herstellermodell:</strong> Closed Source / Appliance — anders als das offene VMware-Ökosystem.</li>
<li><strong>Netzwerk:</strong> Weniger flexibel als NSX; vom Hersteller verwaltet.</li>
</ul>
<h3 id="openstack">OpenStack</h3>
<ul>
<li><strong>Betrieb:</strong> Deutlich komplexer als VMware. Realistisch, wenn das Team die Expertise hat.</li>
</ul>
<h3 id="proxmox">Proxmox</h3>
<ul>
<li><strong>Mandantenfähigkeit:</strong> Begrenzt. Nur für Single-Tenant geeignet.</li>
</ul>
<h3 id="scale-computing">Scale Computing</h3>
<ul>
<li><strong>Obergrenze der Skalierung:</strong> Niedriger als bei VMware-Installationen in Großunternehmen.</li>
</ul>
<h3 id="azure-stack-hci">Azure Stack HCI</h3>
<ul>
<li><strong>Herstellerbeziehung:</strong> An Microsoft gebunden statt an VMware — eine andere Abhängigkeit.</li>
</ul>
<h2 id="überlegungen-zur-migration">Überlegungen zur Migration</h2>
<p>Für jede Alternative die Komplexität des Migrationspfads:</p>
<ul>
<li><strong>VMware → Cozystack:</strong> Image-Konvertierung (qcow2 nach KubeVirt CDI). Neuentwurf des Netzwerks (NSX → Cilium). Neuentwurf des Mandantenmodells (vCD → Tenant CRD). Migration der Storage-Schicht (vSAN → LINSTOR/DRBD). Typisch: Platform Readiness Assessment von 14 oder 28 Tagen, danach rund 8–12 Monate für einen Bestand von ~100 VMs und 18–24 Monate für ~1.000 VMs, einschließlich Planung und Migrationswellen.</li>
<li><strong>VMware → OpenShift:</strong> Ähnlich wie bei Cozystack, aber auf Red-Hat-Basis.</li>
<li><strong>VMware → Nutanix:</strong> AHV-Migration über Nutanix Move (Herstellerwerkzeug). Weniger Kontrolle während der Migration.</li>
<li><strong>VMware → OpenStack:</strong> Betrieblich am komplexesten; erfordert tiefe Expertise im Team.</li>
<li><strong>VMware → Proxmox:</strong> Image-Konvertierung unkompliziert; Neuentwurf für Mandantenfähigkeit erforderlich.</li>
</ul>
]]></content:encoded></item><item><title>Wann Cozystack für KMU und Mittelstand passt — und wann nicht</title><link>https://aenix.io/de/blog/2026/05/wann-cozystack-fuer-mittelstand-passt/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/wann-cozystack-fuer-mittelstand-passt/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DORA</category><category>Proxmox</category><category>Cozystack</category><category>GPU</category><category>Multi-tenancy</category><description>Ein ehrlicher Test für KMU und Mittelstand: unter welchen Bedingungen Cozystack passt, wann nicht, typische Einsatzbeispiele und wie die Zusammenarbeit abläuft.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/wann-cozystack-fuer-mittelstand-passt.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/branchen/mittelstand/">KMU und Mittelstand</a></strong>.</p>
<h2 id="der-ehrliche-test">Der ehrliche Test</h2>
<p>Cozystack passt, wenn mindestens drei zutreffen:</p>
<ol>
<li>Regulierte Daten</li>
<li>Multi-Tenant-Modell</li>
<li>Stetig-state-Workloads</li>
<li>Internes Plattform-Team</li>
<li>KI/GPU-Workloads im großen Maßstab</li>
<li>Spezifischer Exit-Trigger</li>
</ol>
<p>Bei 0-1: Over-Engineering. Bei 2: marginal. Bei 3+: passt.</p>
<h2 id="wenn-nicht-passt">Wenn nicht passt</h2>
<ul>
<li>Hyperscaler-managed (AWS, Azure, GCP)</li>
<li>Hetzner / OVHcloud</li>
<li>Proxmox VE für on-prem</li>
</ul>
<h2 id="wenn-passt--beispiele">Wenn passt — Beispiele</h2>
<ul>
<li>Mittelstand mit DORA-relevant Tochter</li>
<li>Mittelstand wird Multi-Tenant SaaS</li>
<li>Mittelstand mit starker Plattform-Engineering-Investition</li>
</ul>
<h2 id="ænix-engagement">Ænix-Engagement</h2>
<ul>
<li><strong><a href="https://aenix.io/de/kontakt/">30-minütiges Discovery-Gespräch</a></strong> — kostenlos, ohne Vertriebsdruck</li>
<li><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong> (Festpreis, 14 Tage fokussiert) — wenn Sie eine strukturierte Bewertung wollen</li>
<li><strong>Umsetzung</strong> — nur, wenn es tatsächlich passt; im Mittelstand reicht oft selbst betriebenes Cozystack mit <a href="https://aenix.io/de/produkte/cozystack-enterprise-support/">Enterprise-Support von Ænix</a></li>
</ul>
<p>Für die meisten KMU lautet die ehrliche Antwort: Bleiben Sie, wo Sie sind.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>VMware-Migration-Tools und -Strategie 2026 — was funktioniert</title><link>https://aenix.io/de/blog/2026/05/vmware-migration-tools-strategie/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/vmware-migration-tools-strategie/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>Cozystack</category><category>KubeVirt</category><category>Migration</category><description>VMware-Migration 2026: drei Migrationspfade mit ihren Werkzeugen, eine Strategie für die Reihenfolge der Workloads und typische Stellen, an denen sie scheitern.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/vmware-migration-tools-strategie.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/migration/vmware/">VMware-Migration</a></strong>.</p>
<h2 id="drei-migrations-pfade">Drei Migrations-Pfade</h2>
<ol>
<li><strong>VMware-managed Migration</strong> — VMware HCX, Red Hat MTV</li>
<li><strong>KubeVirt-basierte Migration</strong> — virtv2v, Forklift, KubeVirt CDI, Cozystack-spezifische Skripte</li>
<li><strong>Lift-and-Shift in Public Cloud</strong> — VMware-on-Cloud (selten die richtige Antwort 2026)</li>
</ol>
<h2 id="strategie">Strategie</h2>
<ol>
<li>Discovery und Bewertung</li>
<li>Zielplattform produktionsreif bereitgestellt</li>
<li>Kohorten-basierte Migration</li>
<li>VCF-Verfallszeit-aligned Sequenzierung</li>
<li>Decommission</li>
</ol>
<h2 id="wo-migrationen-scheitern">Wo Migrationen scheitern</h2>
<ul>
<li>Zielplattform nicht bereit</li>
<li>Big-Bang-Cutover-Versuch</li>
<li>Datenschwerkraft ignoriert</li>
<li>Networking-Redesign übersprungen</li>
<li>Post-Migration-Kapazität unterschätzt</li>
</ul>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>VMware-Ablösung nach Broadcom — Leitfaden für DACH-Service-Provider, Banken und souveräne Clouds</title><link>https://aenix.io/de/blog/2026/05/vmware-ablosung-nach-broadcom/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/vmware-ablosung-nach-broadcom/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>DORA</category><category>NIS2</category><category>VMware</category><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><description>VMware-Ablösung nach Broadcom: warum Teams jetzt wechseln, wie sich VMware auf Cozystack abbildet und wie eine Migration in sechs Phasen abläuft.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/vmware-ablosung-nach-broadcom.jpg" alt=""></p><p><strong>Dieser Beitrag vertieft unsere Seite zur <a href="https://aenix.io/de/alternativen/vmware-alternative/">VMware-Alternative</a>. Er führt durch den Wandel unter Broadcom, was eine glaubwürdige VMware-Ablösung in der Produktion tatsächlich bedeutet, und wie eine echte Migration End-to-End abläuft.</strong></p>
<p>Nach Broadcom ist die VMware-Rechnung unkalkulierbar geworden. Subscription-only-Lizenzierung, verpflichtende VCF-Bündelung, Preiserhöhungen von 2-5× bei Verlängerung und das Ende der ewigen Lizenzen haben die Kalkulation für jedes Infrastruktur-Team grundlegend verändert.</p>
<p>Diese Veränderung hat einen dokumentierten Wandel ausgelöst — Service Provider, Banken, öffentlicher Sektor und KI/GPU-Betreiber bewerten Alternativen.</p>
<h2 id="warum-die-vmware-ablösung-jetzt-anläuft">Warum die VMware-Ablösung jetzt anläuft</h2>
<p>Drei unabhängige Druckpunkte treffen die gleiche Architektur gleichzeitig:</p>
<p><strong>Kostenklippe nach dem Verlängerungszyklus.</strong> VMware-Ausgaben, die 2020-2022 akzeptabel wirkten, haben sich über mehrere Jahre kumuliert. Verlängerungszyklen treffen jetzt auf Vorstände, die diesen Verlauf nicht genehmigt haben.</p>
<p><strong>Regulatorischer Druck.</strong> DORA seit Januar 2025; NIS2 in der Umsetzung in den EU-Mitgliedstaaten; sektorale Regeln im Finanzdienstleistungssektor; explizite souveräne Cloud-Mandate in Deutschland (BSI C5), Frankreich (SecNumCloud) und anderen Märkten.</p>
<p><strong>KI-Workload-Ökonomie.</strong> GenAI-Inferenz im großen Maßstab hat Egress-, GPU-Pricing- und Datenresidenz-Profile, die Hyperscaler nicht optimiert haben.</p>
<h2 id="architektur-mapping-vmware--cozystack">Architektur-Mapping: VMware → Cozystack</h2>
<table>
  <thead>
      <tr>
          <th>VMware/VCF-Komponente</th>
          <th>Cozystack-Äquivalent</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>vSphere/ESXi</td>
          <td>KubeVirt auf Talos</td>
      </tr>
      <tr>
          <td>vCenter</td>
          <td>Cozystack Control Plane (Kubernetes API + Cozystack Dashboard)</td>
      </tr>
      <tr>
          <td>vSAN</td>
          <td>LINSTOR (DRBD)</td>
      </tr>
      <tr>
          <td>NSX</td>
          <td>Cilium (eBPF)</td>
      </tr>
      <tr>
          <td>vCloud Director</td>
          <td>Tenant CRD + Cozystack Dashboard</td>
      </tr>
      <tr>
          <td>vRealize/Aria Operations</td>
          <td>VictoriaMetrics + VictoriaLogs + Grafana</td>
      </tr>
      <tr>
          <td>Site Recovery Manager</td>
          <td>Velero + S3 + PostgreSQL PITR plus geübte Runbooks (kein orchestriertes Failover wie bei SRM)</td>
      </tr>
      <tr>
          <td>Tanzu Kubernetes Grid</td>
          <td>Tenant Kubernetes (nativ)</td>
      </tr>
      <tr>
          <td>VMware Cloud Foundation</td>
          <td>Cozystack (vollständiges Stack-Äquivalent)</td>
      </tr>
  </tbody>
</table>
<p>Zwei Bereiche erfordern Redesign anstelle eines 1:1-Mappings: <strong>Networking</strong> (Cilium ist grundlegend anders als NSX) und <strong>Multi-Mandanten-Modell</strong> (Cozystack-Mandanten sind Kubernetes-nativ).</p>
<h2 id="wie-eine-echte-vmware-migration-abläuft">Wie eine echte VMware-Migration abläuft</h2>
<p>Migrationspfade sind workload-abhängig. Für die meisten Teams ist dies die realistische Reihenfolge.</p>
<h3 id="1-discovery-und-assessment">1. Discovery und Assessment</h3>
<p>Strukturierte Bewertung des aktuellen vSphere/VCF/vCD-Bestands: Workload-Anzahl, OS-Mix, vSAN/NSX-Abhängigkeiten, Integrationen, Mandantenmodell.</p>
<h3 id="2-cozystack-parallel-deployed">2. Cozystack parallel deployed</h3>
<p>Cozystack wird auf neuer oder umgewidmeter Hardware neben dem bestehenden VMware-Bestand installiert. Kein Big-Bang-Cutover.</p>
<h3 id="3-vm-für-vm-image-migration-zu-kubevirt">3. VM-für-VM-Image-Migration zu KubeVirt</h3>
<p>Für die meisten VMs ist die Migration eine Disk-Image-Kopie. KubeVirt CDI plus ein Set spezieller Migrations-Skripte. Für Windows-VMs läuft ein automatischer Cleanup-Pass vor dem Boot auf KubeVirt.</p>
<h3 id="4-netzwerk--und-speicher-cutover">4. Netzwerk- und Speicher-Cutover</h3>
<p>Networking: VLAN-Mapping in Cilium mit Policy-Parität gegen NSX-Regeln. Storage: Disks in LINSTOR importieren.</p>
<h3 id="5-validierung-und-dr-cutover">5. Validierung und DR-Cutover</h3>
<p>Jede migrierte Workload läuft parallel auf Cozystack bis zur Validierung. Vor dem finalen Cutover stehen Backup und Wiederherstellung mit Velero und PostgreSQL PITR plus geübte Runbooks; ein orchestriertes standortübergreifendes Failover wie bei SRM gibt es nicht.</p>
<h3 id="6-vmware-decommission">6. VMware-Decommission</h3>
<p>Lizenzen enden zu ihren eigenen Bedingungen. Hardware in den Cozystack-Cluster umgewidmet.</p>
<h2 id="souveränität-by-architecture">Souveränität-by-Architecture</h2>
<p>Cozystack ist Open Source unter Apache 2.0. Ihre Binaries, Ihre Hardware, Ihre Datenebene. Ænix liefert Air-Gap-Installations-Workflows und ein Supportmodell, bei dem Sie den Zugriff bestimmen: Beratung und GitOps-PR-Review ohne Clusterzugriff, Fernzugriff nur mit Ihrer Freigabe.</p>
<p>Architektonische Implikationen:</p>
<ul>
<li><strong>Tenant CRD</strong> — jeder Mandant ist ein Kubernetes-Objekt</li>
<li><strong>Air-Gap-Install</strong> unterstützt</li>
<li><strong>Kein Phone-Home</strong> — Telemetrie ist standardmäßig deaktiviert</li>
<li><strong>Auf DORA/NIS2 ausgerichtete Kontrollen</strong> — operative Resilienz, Dokumentation des Lieferantenrisikos</li>
<li><strong>Ænix-Supportmodell</strong> — Zugriff nach Ihrer Wahl: Beratung, Runbooks und GitOps-PR-Review ohne Clusterzugriff; Fernzugriff auf Ihre Cluster mit Ihrer Freigabe und externes Monitoring in den höheren <a href="https://aenix.io/de/preise/">Support-Stufen</a></li>
</ul>
<h2 id="migrations-zeitplan">Migrations-Zeitplan</h2>
<p>Nach einem Platform Readiness Assessment von 14 oder 28 Tagen:</p>
<ul>
<li><strong>Rund 100 VMs:</strong> rund 8–12 Monate, einschließlich Planung und Migrationswellen</li>
<li><strong>Rund 1.000 VMs:</strong> 18–24 Monate, in Kohorten</li>
<li><strong>Dazwischen:</strong> je nach Abhängigkeiten zwischen diesen beiden Werten</li>
</ul>
<p>Treiber sind Regressionstests und Parallelbetriebsfenster, nicht die reine Kopiergeschwindigkeit.</p>
<h2 id="wie-geht-es-weiter">Wie geht es weiter?</h2>
<p>Für eine spezifische Bewertung Ihres VMware-Ausstiegs siehe <strong><a href="https://aenix.io/de/alternativen/vmware-alternative/">fokussierte Seite zur VMware-Alternative</a></strong> oder <strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts — CNCF Certified Kubernetes Distribution.</em></p>
]]></content:encoded></item><item><title>Transport- und Logistik-Cloud-Architektur — NIS2, KI, Edge im Jahr 2026</title><link>https://aenix.io/de/blog/2026/05/transport-logistik-cloud-architektur-nis2/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/transport-logistik-cloud-architektur-nis2/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>NIS2</category><category>Cozystack</category><description>Cloud-Architektur für Transport und Logistik: NIS2-Pflichten, ein dreistufiges Muster von Edge bis Rechenzentrum, Kontrollen für den Sektor und KI-Anwendungen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/transport-logistik-cloud-architektur-nis2.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/branchen/transport-logistik/">Transport und Logistik</a></strong>.</p>
<h2 id="drei-druckpunkte">Drei Druckpunkte</h2>
<ol>
<li>NIS2: Sektor nach Anhang I (wesentliche oder wichtige Einrichtung, je nach Größe)</li>
<li>KI-Optimierung</li>
<li>Edge-Compute-Dichte</li>
</ol>
<h2 id="three-tier-architekturmuster">Three-Tier-Architekturmuster</h2>
<ul>
<li><strong>Zentrale Cloud</strong> — TMS, Fleet-Management, KI-Training</li>
<li><strong>Regionale Standorte</strong> — operative Zentren, regionale Disposition</li>
<li><strong>Edge</strong> — Depots, Häfen, Terminals, On-Vehicle-Compute</li>
</ul>
<h2 id="nis2-architekturkontrollen-für-transport">NIS2-Architekturkontrollen für Transport</h2>
<p>Übliche Zuordnung zu Artikel 21 und 23; dazu transportspezifisch:</p>
<ul>
<li>Multi-modale Datensouveränität</li>
<li>Sub-Lieferanten-Transparenz (Logistikketten 5+ Ebenen)</li>
<li>Notfallplanung für physische Störungen</li>
<li>Air-gap für sicherheitskritische OT</li>
</ul>
<h2 id="ki-use-cases-im-transport">KI-Use-Cases im Transport</h2>
<ul>
<li>Routenoptimierung</li>
<li>Nachfrageprognose</li>
<li>Predictive Maintenance für Flotte</li>
<li>Last-Mile-Optimierung</li>
<li>Customer-facing KI (Lieferzeit, Kundenservice)</li>
</ul>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Smart-Grid-Plattform-Architektur — IT/OT-Konvergenz, Edge und KI auf kundenkontrollierter Infrastruktur</title><link>https://aenix.io/de/blog/2026/05/smart-grid-plattform-architektur-it-ot/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/smart-grid-plattform-architektur-it-ot/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>NIS2</category><category>Cozystack</category><category>Compliance</category><description>Plattformarchitektur für Smart Grids: drei Ebenen von Edge bis Core, IT/OT-Konvergenz mit klaren Grenzen, NIS2-Kontrollen und KI auf Netzbetriebsdaten.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/smart-grid-plattform-architektur-it-ot.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/branchen/energie/">Energiewirtschaft</a></strong>.</p>
<h2 id="drei-druckpunkte-konvergieren-auf-energie-infrastruktur">Drei Druckpunkte konvergieren auf Energie-Infrastruktur</h2>
<ol>
<li>NIS2-Compliance mit operativer Realität</li>
<li>KI für Netzoperationen</li>
<li>Edge-Compute an Substation-Dichte</li>
</ol>
<h2 id="three-tier-referenz-architektur">Three-Tier-Referenz-Architektur</h2>
<ul>
<li><strong>Zentrale Cloud</strong> — EMS, KI-Training, Marktintegration</li>
<li><strong>Regionale Standorte</strong> — SCADA-Aggregation, regionale Netzführung</li>
<li><strong>Umspannstation-Edge</strong> — lokale SCADA / RTU-Integration, Air-gapped OT-Boundary</li>
</ul>
<h2 id="itot-konvergenz-mit-grenzen">IT/OT-Konvergenz mit Grenzen</h2>
<ul>
<li><strong>Strikte Grenze: OT-Zone</strong> — Air-gapped, OT-bewusste Cybersicherheit</li>
<li><strong>Permeable Grenze: IT-Zone</strong> — Standard-Cloud-native operativ</li>
<li><strong>Brücke: Datenfabric</strong> — kontrollierte Datenflüsse OT→IT</li>
</ul>
<h2 id="nis2-spezifische-architekturkontrollen">NIS2-spezifische Architekturkontrollen</h2>
<ul>
<li>Risikoregister pro kritische Funktion</li>
<li>24-Stunden-Zeitfenster Erkennungsfähigkeit</li>
<li>Geschäftskontinuität getestet</li>
<li>Lieferanten-Transparenz bis zum zweiten Hop</li>
<li>Verschlüsselung mit kundenkontrollierten Schlüsseln</li>
</ul>
<h2 id="ki-workloads-auf-netzbetriebsdaten">KI-Workloads auf Netzbetriebsdaten</h2>
<ul>
<li>Lastprognose</li>
<li>Erzeugungsprognose (besonders für Erneuerbare)</li>
<li>Predictive Maintenance</li>
<li>Demand-Response-Automatisierung</li>
<li>Marktpreis-Optimierung</li>
</ul>
<p>Typische Hardware-Größe für mittelgroßen Energieversorger (5-10 GW): 16-64 GPUs.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Reverse Cloud Migration — praktischer Leitfaden für Public-Cloud-Ausstieg im Jahr 2026</title><link>https://aenix.io/de/blog/2026/05/reverse-cloud-migration-leitfaden/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/reverse-cloud-migration-leitfaden/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cozystack</category><category>Cloud Repatriation</category><category>Migration</category><description>Reverse Cloud Migration 2026: warum Repatriation selten alles oder nichts ist, ein Playbook in fünf Schritten und die Fehler, die Ausstiegsprojekte verzögern.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/reverse-cloud-migration-leitfaden.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/loesungen/cloud-repatriation/">Cloud Repatriation</a></strong>.</p>
<h2 id="repatriation-ist-nicht-alles-oder-nichts">Repatriation ist nicht alles-oder-nichts</h2>
<p>Typischer repatriierter Bestand:</p>
<ul>
<li>30-50% on-prem oder Private Cloud (steady-state, reguliert, teuer, latenz-kritisch)</li>
<li>30-50% bleibt in Public Cloud (elastisch, hyperscaler-proprietär, latenzempfindlich)</li>
<li>10-20% in Übergang</li>
</ul>
<h2 id="fünf-schritte-playbook">Fünf-Schritte-Playbook</h2>
<ol>
<li><strong>Ehrliche TCO-Modellierung</strong> — alle versteckten Kosten erfasst</li>
<li><strong>Workload-Klassifikation</strong> — repatriate now / later / stay / reassess</li>
<li><strong>Zielarchitektur</strong> — vollständige Plattform mit Ops-Modell</li>
<li><strong>Cutover-Sequenzierung</strong> — respektiert Commitment-Verfallszeiten</li>
<li><strong>Plattform betreiben</strong> — nach der Migration</li>
</ol>
<h2 id="häufige-fehler">Häufige Fehler</h2>
<ul>
<li>Wishful TCO ohne Hardware-Refresh / Plattform-Team-Kapazität</li>
<li>Zielarchitektur als Gedanke später</li>
<li>Datenschwerkraft als Checkbox</li>
<li>Vollumfänglicher Ausstieg, wenn selektiv die richtige Antwort ist</li>
</ul>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Proxmox vs VMware vs Cozystack — Vergleich für die Post-Broadcom-Ära</title><link>https://aenix.io/de/blog/2026/05/proxmox-vs-vmware-vs-cozystack/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/proxmox-vs-vmware-vs-cozystack/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>Proxmox</category><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><category>Cilium</category><description>Proxmox VE, VMware nach Broadcom und Cozystack im Vergleich: Ausrichtung, Stärken und Grenzen jeder Plattform und wie Sie die passende Wahl treffen.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/proxmox-vs-vmware-vs-cozystack.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <a href="https://aenix.io/de/alternativen/proxmox-alternative/">Proxmox-Alternative</a>.</p>
<p>Drei Hauptoptionen für Open-Source-fähige Virtualisierung im Jahr 2026: Proxmox VE, VMware (nach Broadcom) und Cozystack. Jede hat ein anderes architektonisches Ziel.</p>
<h2 id="proxmox-ve--smb-fokussiert">Proxmox VE — SMB-fokussiert</h2>
<p><strong>Architektur:</strong> KVM + LXC + ZFS + Ceph (Community). <strong>Beste Wahl für</strong> SMB-IT, Labs, single-tenant Bereitstellungen.</p>
<h2 id="vmware-post-broadcom--enterprise-legacy">VMware (Post-Broadcom) — enterprise legacy</h2>
<p><strong>Architektur:</strong> vSphere + vSAN + NSX + vCD. <strong>Beste Wahl für</strong> bestehende VMware-Bestände bis zur Renewal-Krise.</p>
<h2 id="cozystack--open-source-kubernetes-nativ">Cozystack — Open Source, Kubernetes-nativ</h2>
<p><strong>Architektur:</strong> KubeVirt + Cilium + LINSTOR + Tenant CRD + Cozystack Dashboard. <strong>Beste Wahl für</strong> Service Provider, regulierte Mandanten, KI/GPU.</p>
<h2 id="wie-wählen">Wie wählen</h2>
<ol>
<li>&lt;50 Hosts, single-tenant, mostly VMs → Proxmox VE</li>
<li>Service Provider, Multi-Tenant Cloud → Cozystack</li>
<li>Bestehende VMware-Investition stabil → bleiben (mit Exit-Plan)</li>
<li>KI/GPU im großen Maßstab → Cozystack</li>
</ol>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Produktions-Kubernetes-Cluster — Architekturentscheidungen, Sizing und Operations 2026</title><link>https://aenix.io/de/blog/2026/05/produktion-kubernetes-cluster-architektur/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/produktion-kubernetes-cluster-architektur/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>OpenShift</category><category>Kubernetes</category><category>Cozystack</category><category>Cilium</category><category>LINSTOR</category><category>GitOps</category><description>Kubernetes-Cluster für die Produktion: zehn Architekturentscheidungen von Distribution bis Upgrades, bewährte Betriebspraktiken und die häufigsten Fehler.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/produktion-kubernetes-cluster-architektur.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/dienstleistungen/kubernetes-consulting/">Kubernetes-Beratung</a></strong>.</p>
<h2 id="10-architekturentscheidungen-die-zählen">10 Architekturentscheidungen, die zählen</h2>
<ol>
<li>Distribution (vanilla / OpenShift / Cozystack / vendor-led)</li>
<li>Multi-Tenancy (soft, hard via Tenant CRD, cluster pro tenant)</li>
<li>Networking / CNI (Cilium ist 2026 Standard)</li>
<li>Storage (LINSTOR, Ceph, vendor SAN)</li>
<li>Identität und Secrets</li>
<li>GitOps-Engine (Argo CD oder Flux)</li>
<li>Observability-Stack (VictoriaMetrics + VictoriaLogs)</li>
<li>Backup und DR (Velero + per-app PITR)</li>
<li>Ingress und Load Balancing</li>
<li>Lifecycle-Management</li>
</ol>
<h2 id="operative-praktiken">Operative Praktiken</h2>
<ul>
<li>SLOs und Error Budgets</li>
<li>Dokumentierte Runbooks</li>
<li>Capacity Planning</li>
<li>Upgrade-Disziplin (Kubernetes minor jedes Quartal)</li>
<li>Incident Response</li>
<li>Sicherheitsposture (Pod Security Standards, Network Policies)</li>
</ul>
<h2 id="häufige-fehler">Häufige Fehler</h2>
<ul>
<li>Dev-Cluster auf Prod skaliert</li>
<li>Kein Observability-Budget</li>
<li>Sicherheit als Nachgedanke</li>
<li>Upgrade-Schulden</li>
<li>Kein Plattform-Team</li>
</ul>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Private-Cloud-Anbieter und -Plattformen — Vergleich 2026 für die DACH-Region</title><link>https://aenix.io/de/blog/2026/05/private-cloud-anbieter-vergleich/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/private-cloud-anbieter-vergleich/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>VMware</category><category>OpenStack</category><category>Proxmox</category><category>OpenShift</category><category>Cozystack</category><category>KubeVirt</category><description>Private-Cloud-Plattformen 2026 im Überblick: Open Source und kommerziell, souveräne Regionen und regionale Anbieter, Auswahlkriterien und Migrationspfade.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/private-cloud-anbieter-vergleich.jpg" alt=""></p><p><strong>Überblick über Private-Cloud-Anbieter und -Plattformen im Jahr 2026 — was verfügbar ist, wer was bietet, welche architektonischen Trade-offs.</strong> Mehr dazu auf unserer Seite <a href="https://aenix.io/de/loesungen/private-cloud/">Private Cloud</a>.</p>
<p>Die Private-Cloud-Landschaft hat sich in den letzten 3 Jahren erheblich verändert. Broadcom-induzierte VMware-Migrationen, Souveränitätsmandate, KI-Workload-Ökonomie und FinOps-Druck haben alle die Bedeutung von „Private Cloud“ und ihre Anbieter neu geformt.</p>
<h2 id="zwei-verschiedene-begriffe-für-private-cloud">Zwei verschiedene Begriffe für „Private Cloud“</h2>
<ul>
<li><strong>Private-Cloud-Plattform</strong> — Software, die Sie auf Ihrer eigenen Infrastruktur deployieren. Beispiele: VMware VCF, Cozystack, OpenStack, OpenShift Virtualization, Proxmox VE.</li>
<li><strong>Private-Cloud-Anbieter</strong> — ein Anbieter, der dedizierte Infrastruktur (single-tenant) bereitstellt, die Sie konsumieren. Beispiele: IBM Cloud Private, Oracle dedizierte Regionen, Hyperscaler „souveräne“ Regionen, regionale Cloud-Anbieter.</li>
</ul>
<h2 id="open-source-plattformen">Open-Source-Plattformen</h2>
<h3 id="cozystack">Cozystack</h3>
<p>Apache-2.0-Lizenz, CNCF-Projekt. KubeVirt + Cilium + Kube-OVN + LINSTOR/DRBD + Tenant CRD + Cozystack Dashboard. <strong>Beste Wahl für</strong> Service Provider, regulierte Mandantenfähigkeit, AI/GPU-Betreiber. <strong>Stärken:</strong> Single-Stack für VMs + Container + DBs + S3 + GPU. Mandantenfähigkeit strukturell.</p>
<h3 id="openstack">OpenStack</h3>
<p>Apache-2.0-Lizenz, OpenInfra Foundation. Nova + Neutron + Cinder + Swift + Keystone. <strong>Beste Wahl für</strong> große Telekommunikations-Cluster, behördliche Clouds, OpenStack-erfahrene Teams. <strong>Stärken:</strong> Reif, breite Community, viele Vendor-Distributionen.</p>
<h3 id="proxmox-ve">Proxmox VE</h3>
<p>AGPLv3 + kommerzielle Subscription. KVM + LXC + ZFS + Ceph (Community). <strong>Beste Wahl für</strong> SMB-Virtualisierung, Labs, single-tenant. <strong>Stärken:</strong> Reif, einfach zu installieren, starke Community.</p>
<h2 id="kommerzielle-plattformen">Kommerzielle Plattformen</h2>
<h3 id="vmware-vmware-cloud-foundation">VMware (VMware Cloud Foundation)</h3>
<p>Subscription-only nach Broadcom. <strong>Wann sinnvoll:</strong> bestehende VMware-Bestände, die noch nicht durch Ökonomie aus dem Markt gedrängt sind. <strong>Limits:</strong> Subscription-Preisanstiege (2-5× beobachtet), Vendor-Lock-in, Souveränitätsbedenken.</p>
<h3 id="nutanix">Nutanix</h3>
<p>Subscription, mehrere Tarife. AHV (proprietär KVM-basiert). <strong>Wann sinnvoll:</strong> bestehende Nutanix-HCI-Kunden. <strong>Limits:</strong> Closed source, Appliance-Lock-in.</p>
<h3 id="openshift-virtualization-red-hat">OpenShift Virtualization (Red Hat)</h3>
<p>Red Hat kommerzielle Subscription. <strong>Wann sinnvoll:</strong> bestehende Red Hat / OpenShift-Kunden.</p>
<h2 id="souveräne-hyperscaler-regionen-und-regionale-anbieter">Souveräne Hyperscaler-Regionen und regionale Anbieter</h2>
<ul>
<li><strong>AWS Sovereign Cloud, Azure Sovereign, GCP</strong> — Hyperscaler-souveräne Angebote</li>
<li><strong>Hetzner</strong> (Deutschland) — Bare Metal + Cloud, beliebt in DACH</li>
<li><strong>OVHcloud</strong> (Frankreich) — starke EU-souveräne Positionierung</li>
<li><strong>Regionale Anbieter mit der Ænix Public Cloud Platform</strong> — Hosting-Anbieter, die ein souveränes Cloud-Produkt auf Basis von Cozystack verkaufen</li>
</ul>
<p><strong>Trade-off:</strong> vom Anbieter verwalteter Komfort gegen direkte Kontrolle über die Hardware.</p>
<h2 id="wie-wählen">Wie wählen</h2>
<ol>
<li><strong>Multi-Tenant + Open Source + Kubernetes-nativ + Souveränität?</strong> → Cozystack</li>
<li><strong>Bestehender VMware-Bestand mit Renewal-Druck?</strong> → VMware-Ausstieg planen, Ziel meist Cozystack oder OpenShift</li>
<li><strong>OpenStack-Expertise + große Telco/Behörden-Skala?</strong> → OpenStack bleibt valide</li>
<li><strong>Bestehende Red Hat / OpenShift-Verpflichtungen?</strong> → OpenShift Virtualization</li>
<li><strong>SMB / single-tenant?</strong> → Proxmox VE</li>
<li><strong>Plattform nicht selbst betreiben wollen?</strong> → Regionaler souveräner Cloud-Anbieter (Hetzner, OVHcloud oder ein regionaler Anbieter mit der Ænix Public Cloud Platform)</li>
<li><strong>KI/GPU im großen Maßstab, sustained utilization?</strong> → Cozystack oder OpenShift auf dediziertem GPU</li>
<li><strong>Souveränität + EU + niedriger operativer Footprint?</strong> → Cozystack mit Ænix-Support</li>
</ol>
<h2 id="migrationspfade">Migrationspfade</h2>
<ul>
<li><strong>VMware → Cozystack/OpenStack/OpenShift</strong> — KubeVirt-basierte Migration, Image-Konvertierung, Multi-Mandanten-Redesign</li>
<li><strong>Public Cloud → Private Cloud</strong> (Repatriation) — Workload-Klassifikation, ehrliche TCO, Zielarchitektur</li>
</ul>
<h2 id="nächste-schritte">Nächste Schritte</h2>
<p>Wenn Cozystack zu Ihrer Situation passt — siehe unsere Seite <strong><a href="https://aenix.io/de/loesungen/private-cloud/">Private Cloud</a></strong> oder besuchen Sie <strong><a href="https://cozystack.io">cozystack.io</a></strong>.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Private LLM Deployment — Praktischer Leitfaden für On-Premise-KI-Infrastruktur 2026</title><link>https://aenix.io/de/blog/2026/05/private-llm-deployment-leitfaden/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/private-llm-deployment-leitfaden/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Kubernetes</category><category>Cozystack</category><category>KubeVirt</category><category>Cilium</category><category>LINSTOR</category><category>Sovereignty</category><description>Private LLMs auf eigener Infrastruktur betreiben: drei typische Auslöser, die sechs Schichten eines Private-LLM-Stacks und die passenden Architekturmuster.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/private-llm-deployment-leitfaden.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/loesungen/sovereign-ai/">Sovereign AI</a></strong>.</p>
<h2 id="drei-trigger-profile-für-private-llm">Drei Trigger-Profile für Private LLM</h2>
<ol>
<li><strong>Regulierte Datenklasse</strong> — Daten unterliegen Jurisdiktions-Bindung</li>
<li><strong>Inferenz-Wirtschaftlichkeit</strong> — sustained Workloads bei stetiger Auslastung</li>
<li><strong>Auditbereitschaft und Reproduzierbarkeit</strong> — Aufsichtsdialoge erfordern dies</li>
</ol>
<h2 id="sechs-schichten-eines-private-llm-stacks">Sechs Schichten eines Private-LLM-Stacks</h2>
<ol>
<li>Hardware (GPUs, CPU, Netzwerk, Storage)</li>
<li>Plattform (Kubernetes + KubeVirt + Cilium + LINSTOR)</li>
<li>Serving (vLLM, Triton)</li>
<li>Modellschicht (Llama, Mistral, Qwen, DeepSeek, Phi, Gemma)</li>
<li>Anwendungsschicht (RAG, Agent-Frameworks, LLM-Gateway)</li>
<li>Operations (Observability, Audit, Cost Management)</li>
</ol>
<h2 id="architektonische-muster">Architektonische Muster</h2>
<ul>
<li>Single-Tenant-Inferenz-Cluster</li>
<li>Multi-Tenant-Inferenz-Flotte</li>
<li>Inferenz + Fine-Tuning + RAG (vollständige KI-Plattform)</li>
<li>Air-gapped souveräne Bereitstellung</li>
</ul>
<h2 id="wie-geht-es-weiter">Wie geht es weiter?</h2>
<p>Strukturierte Bewertung → <strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong>.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>Platform Engineering vs DevOps vs SRE — Terminologie-Leitfaden 2026</title><link>https://aenix.io/de/blog/2026/05/platform-engineering-vs-devops-vs-sre/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/platform-engineering-vs-devops-vs-sre/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cozystack</category><category>DevOps</category><category>Platform Engineering</category><category>Compliance</category><category>Observability</category><description>Platform Engineering, DevOps und SRE abgegrenzt: drei Definitionen, wo sich die Funktionen überschneiden, wo nicht und was ein Plattformteam tatsächlich baut.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/platform-engineering-vs-devops-vs-sre.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/dienstleistungen/platform-engineering/">Platform Engineering</a></strong>. Wo überlappen sich die drei Begriffe, wo nicht, was tut jede Funktion tatsächlich.</p>
<h2 id="drei-definitionen">Drei Definitionen</h2>
<p><strong>DevOps</strong> ist eine kulturelle und operative Praxis innerhalb von Produkt-Teams. Das gleiche Team baut und betreibt die Software in Produktion.</p>
<p><strong>SRE (Site Reliability Engineering)</strong> ist eine Disziplin, die Software-Engineering auf Operations anwendet — mit SLOs, Error Budgets und Toil-Begrenzung.</p>
<p><strong>Platform Engineering</strong> ist die Praxis, interne Plattformen zu bauen, die Produkt-Teams konsumieren. Eine separate Funktion, deren Kunden andere Engineering-Teams sind.</p>
<h2 id="wo-sie-sich-überlappen">Wo sie sich überlappen</h2>
<p>Alle drei kümmern sich um:</p>
<ul>
<li>Zuverlässigkeit (SLOs, Error Budgets)</li>
<li>Tooling (CI/CD, IaC, Observability, Identity)</li>
<li>Geschwindigkeit</li>
<li>Operative Exzellenz</li>
</ul>
<h2 id="wo-sie-sich-unterscheiden">Wo sie sich unterscheiden</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th>DevOps</th>
          <th>SRE</th>
          <th>Platform Engineering</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Wer</td>
          <td>Produkt-Team</td>
          <td>Reliability-Funktion</td>
          <td>Plattform-Team</td>
      </tr>
      <tr>
          <td>Kunde</td>
          <td>Das Team selbst</td>
          <td>Produkt-Teams</td>
          <td>Andere Engineering-Teams</td>
      </tr>
      <tr>
          <td>Output</td>
          <td>Software in Produktion</td>
          <td>SLO-Compliance</td>
          <td>Self-Service-Pfade</td>
      </tr>
      <tr>
          <td>Zentralisiert?</td>
          <td>Nein</td>
          <td>Manchmal</td>
          <td>Ja</td>
      </tr>
  </tbody>
</table>
<h2 id="wann-jedes-passt">Wann jedes passt</h2>
<ul>
<li><strong>DevOps allein:</strong> kleine Organisationen, 1-3 Produkt-Teams</li>
<li><strong>DevOps + SRE:</strong> mittelgroße Organisationen mit Reliability-Bedenken</li>
<li><strong>DevOps + Platform Engineering:</strong> mittlere bis große Organisationen mit Self-Service-Bedarf</li>
<li><strong>Alle drei:</strong> große Organisationen</li>
</ul>
<h2 id="was-platform-engineering-tatsächlich-baut">Was Platform Engineering tatsächlich baut</h2>
<ol>
<li>Internal Developer Platform (IDP)</li>
<li>Golden Paths</li>
<li>Operatives Modell</li>
<li>Internes Produktmanagement</li>
</ol>
<h2 id="wie-geht-es-weiter">Wie geht es weiter?</h2>
<p><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong> für eine strukturierte Bewertung.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>NIS2-Anforderungen für Cloud-Infrastruktur — Checkliste für DACH-Unternehmen</title><link>https://aenix.io/de/blog/2026/05/nis2-checkliste-cloud-architektur/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/nis2-checkliste-cloud-architektur/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>NIS2</category><category>Cozystack</category><category>Compliance</category><category>Backup and DR</category><description>NIS2-Anforderungen an die Cloud-Infrastruktur: Risikomanagement-Maßnahmen nach Artikel 21, Meldefristen nach Artikel 23 und was die Architektur leisten muss.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/nis2-checkliste-cloud-architektur.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/loesungen/nis2-compliance/">NIS2</a></strong>.</p>
<h2 id="artikel-21--risikomanagement-maßnahmen">Artikel 21 — Risikomanagement-Maßnahmen</h2>
<p>10 erforderliche Bereiche, die jede betroffene Einrichtung abdecken muss:</p>
<ol>
<li>Risikoanalyse und Informationssystem-Sicherheit</li>
<li>Vorfall-Handhabung</li>
<li>Geschäftskontinuität (Backup, DR, Krisenmanagement)</li>
<li>Lieferkette-Sicherheit</li>
<li>Sicherheit in Acquisition / Development / Maintenance</li>
<li>Effektivitäts-Bewertung</li>
<li>Cyber-Hygiene und Cybersicherheits-Training</li>
<li>Kryptographie (Verschlüsselung)</li>
<li>Personalsicherheit, Zugriffskontrolle, Asset-Management</li>
<li>MFA, sichere Kommunikation, sichere Notfall-Kommunikation</li>
</ol>
<h2 id="artikel-23--vorfall-reporting-zeitfenster">Artikel 23 — Vorfall-Reporting-Zeitfenster</h2>
<ul>
<li><strong>24 Stunden</strong> — Frühwarnung an CSIRT</li>
<li><strong>72 Stunden</strong> — vollständige Vorfall-Meldung</li>
<li><strong>1 Monat</strong> — Abschlussbericht</li>
</ul>
<p>Die Architektur muss Erkennung und Reporting innerhalb dieser Zeitfenster unterstützen.</p>
<h2 id="architektonische-anforderungen">Architektonische Anforderungen</h2>
<ul>
<li>Multi-Schicht-Datenresidenz</li>
<li>Customer-controlled Verschlüsselungsschlüssel</li>
<li>Lieferantenketten-Transparenz bis zum zweiten Hop</li>
<li>Audit-Logs in Standardformaten</li>
<li>Aufsichtszugang dokumentiert und getestet</li>
</ul>
<h2 id="wie-geht-es-weiter">Wie geht es weiter?</h2>
<p><strong><a href="https://aenix.io/de/dienstleistungen/platform-readiness-assessment/">Platform Readiness Assessment</a></strong> mit NIS2-Schwerpunkt.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item><item><title>MSP-Cloud-Plattform-Modernisierung — gebrandetes Cloud-Angebot</title><link>https://aenix.io/de/blog/2026/05/msp-cloud-plattform-modernisierung/</link><guid isPermaLink="true">https://aenix.io/de/blog/2026/05/msp-cloud-plattform-modernisierung/</guid><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><dc:creator>Aenix Team</dc:creator><category>Cozystack</category><category>Multi-tenancy</category><category>Hosting</category><description>Wie MSPs ein Cloud-Angebot unter eigener Marke aufbauen: mehrstufige Mandanten, eigenes Portal, Abrechnung, Reseller-Marge und der Ablauf des Projekts.</description><content:encoded><![CDATA[<p><img src="https://aenix.io/img/blog/covers/de/msp-cloud-plattform-modernisierung.jpg" alt=""></p><p>Dieser Beitrag vertieft das Thema unserer Seite <strong><a href="https://aenix.io/de/branchen/msp/">MSPs</a></strong>.</p>
<h2 id="architektur-muster">Architektur-Muster</h2>
<ul>
<li>Multi-Tier Tenant CRD (Root-Tenant → MSP → MSP-Kunden)</li>
<li>Pro-Tier-Isolation</li>
<li>Gebrandetes kundenorientiertes Portal</li>
<li>Abrechnung über die WHMCS-Integration (proprietäres Ænix-Modul)</li>
<li>Service-Katalog (MSP kuratiert)</li>
</ul>
<h2 id="reseller-wirtschaftlichkeit">Reseller-Wirtschaftlichkeit</h2>
<p>Mittelgroßer MSP (50-500 Kunden):</p>
<ul>
<li>Plattform-Kosten + Hardware + Operations</li>
<li>Pro-Kunde-Inkrementelle Kosten</li>
<li>MSP-Kunden-Pricing typisch 30-50% über Plattform-Rohkosten</li>
<li>Break-even: 30-50 zahlende Kunden</li>
</ul>
<h2 id="engagement-sequenz">Engagement-Sequenz</h2>
<ol>
<li>Platform Readiness Assessment (14 oder 28 Tage)</li>
<li>Plattform live über den produktisierten Installer (wenige Wochen nach Bereitstellung der Hardware), danach Pilot</li>
<li>Initiale Kunden-Kohorte (5-10 Kunden)</li>
<li>Operations-Workflow</li>
<li>Skalierung</li>
</ol>
<p>Gesamtzeit: 6-12 Monate.</p>
<hr>
<p><em>Ænix hat Cozystack entwickelt und gehört zu den Maintainern des CNCF-Projekts.</em></p>
]]></content:encoded></item></channel></rss>