OpenKeel: die souveräne französische Cloud-Lösung mit europäischer Reichweite der inherent-Gruppe inherent entdecken

Komponenten · Compute und Kapazität

Zun

Containers as a Service: ein Pod pro Container, isoliert in einer eigenen Kata-MicroVM, mit seinem Neutron-Port als einzigem Netz.

Go Kata-Podsopenkeel-zun

Das Modul

OpenKeel implementation in Go of OpenStack Zun (containers service), generated from the reverse-specification of branch stable/2026.2 (reverse-spec-zun/) by the generate-go-from-spec skill. The Zun v1 API (microversions 1.1 to 1.40) is kept byte-compatible, so python-zunclient, openstack appcontainer, Skyline, Heat and gophercloud keep working unchanged. The node side is replaced: containers run as Kubernetes Pods, isolated in Kata Containers VMs by default, on the node that Placement chose, as openkeel-nova runs VMs on KubeVirt.

What is reproduced and what differs is in docs/CONFORMANCE.md and in § Compatibility gaps below; the security checklist is docs/SECURITY.md.

  • Go module: github.com/openkeel/openkeel-zun
  • One image, four executables:
ExecutableKubernetes objectRolePython process it replaces
zun-apiDeployment (port 9517, admin 9090)REST API, scheduling through Placement, synchronous Kubernetes calls (logs, exec, top, stats, archives)zun-api
zun-computeDeployment, one active replica (Lease)runs the queued operations: Neutron ports, Cinder attachments, Pods; state syncthe container work of zun-compute
zun-compute-agentDaemonSetzun-compute service heartbeat, compute_node row, Placement inventory of its nodethe inventory and service parts of zun-compute
zun-wsproxyDeployment (port 6784)attach and interactive exec WebSocketszun-wsproxy

zun-cni, zun-cni-daemon, Docker, containerd CRI and kuryr-libnetwork are gone. There is no RabbitMQ: the API queues each asynchronous operation in the openkeel_task table, which zun-compute claims by compare-and-set.

  • Configuration: YAML, see config/config.example.yaml (dropped oslo options and why: config/dropped-options.md)
  • Development environment, database and tests: docs/GETTING-STARTED.md
  • Database schema, migrations and upgrades: docs/DATABASE.md
  • Integration with openkeel-nova (one change to its agent): docs/NOVA-INTEGRATION.md

Auszug aus openkeel-zun/README.md (auf Englisch).

REST-API

73 Operationen der Original-REST-API (Routen und Body-Aktionen) und ihr Status in OpenKeel.

  • 69Implementiert
  • 4Teilweise

Wie die Kompatibilität getestet wird

Aus den API-Tests von Python-Zun aufgezeichnete Austausche und Sonden der echten Pecan-Anwendung werden gegen den Go-Dienst wiedergegeben, ergänzt durch Algorithmus-Vektoren und einen Controller-Test auf einem Fake-Cluster.

Replay aufgezeichneter Austausche

E2E-Replay der aufgezeichneten API-Tests

Die 256 Austausche aus 221 Python-API-Tests liefern denselben Status und Body, jeweils auf einer Datenbank, die so befüllt ist, wie der aufgezeichnete Test es voraussetzte.

Ausführung

make e2e (test/e2e), Bericht in report.json; make e2e-strict schlägt bei jedem nicht in known-differences.txt aufgeführten Unterschied fehl.

Letztes Ergebnis 223 / 256 identisch; der Strict-Modus besteht, die 35 Unterschiede sind mit ihrer Begründung aufgeführt.

Quelle: openkeel-zun/docs/CONFORMANCE.md

Replay aufgezeichneter Austausche

Sonden der echten Pecan-Anwendung

An die echte Python-Anwendung gesendete Anfragen außerhalb ihrer Unit-Tests erhalten vom Go-Dienst dieselben Antworten.

Ausführung

Replay von test/e2e/testdata/zun.probes.json in der e2e-Suite.

Letztes Ergebnis 30 / 32; die 2 übrigen sind absichtlich behobene Python-Fehler (Fallen T7, T13).

Quelle: openkeel-zun/docs/CONFORMANCE.md

Unit- und Golden Tests

Algorithmus-Vektoren aus Python

Parsing von Image-Namen, Pull-Entscheidungen, Zuordnung der Docker-Zustände, Placement-Abfragen, Neustartrichtlinie und Portregeln entsprechen den Python-Funktionen.

Ausführung

internal/zun/vectors_test.go auf _rewrite/vectors_stable-2026.2.json.

Letztes Ergebnis 8 / 8 Familien, 307 Fälle.

Quelle: openkeel-zun/docs/CONFORMANCE.md

Unit- und Golden Tests

Container-Lebenszyklus auf einem Fake-Cluster

Erstellen, Scheduling, Claim, Neutron-Ports, Kata-Pod, Stoppen und Löschen hinterlassen dieselben Datensätze wie in Python, einschließlich Ports und Allokationen.

Ausführung

internal/compute/manager_test.go mit Kubernetes-Fakes.

Letztes Ergebnis Bestanden.

Quelle: openkeel-zun/docs/CONFORMANCE.md

Im Rewrite ausgelassen

Zun behält seine v1-API, betreibt Container aber als Kubernetes-Pods in Kata-VMs; damit entfallen Docker-spezifische Operationen und der Knoten-Stack aus Docker, CNI und Kuryr.

Von der Cloud-Native-Plattform übernommen

Docker-Daemon, zun-cni und kuryr-libnetwork

Übernommen von Kubernetes-Pods, Kata Containers

Warum es ausgelassen wurde

Container sind Pods, die von Placement platziert und in Kata-VMs isoliert werden; Neutron-Ports werden über das OVN-CNI angebunden, und das kubelet zieht die Images und bindet die Cinder-PVCs ein.

Warum die Lösung nicht beeinträchtigt ist

python-zunclient, openstack appcontainer, Skyline und Heat funktionieren weiterhin mit derselben API; der Knoten-Stack ist der des Clusters.

Quelle: openkeel-zun/README.md

Von der Cloud-Native-Plattform übernommen

Pause, unpause und commit

Übernommen von Kubernetes

Warum es ausgelassen wurde

Kubernetes hat keine Freezer- oder Commit-API; sie hinzuzufügen würde einen Knoten-Agenten mit Root-Zugriff auf containerd oder cgroups erfordern, was OpenKeel ablehnt (Entscheidung vom 2026-11-02).

Warum die Lösung nicht beeinträchtigt ist

Diese Aktionen antworten 409 container.operation-not-supported. Images werden in einer Registry gebaut; laufende Container sind nicht betroffen.

Quelle: openkeel-zun/docs/CONFORMANCE.md

Von der Cloud-Native-Plattform übernommen

Beschreibbare Schicht über stop hinweg erhalten

Übernommen von Kubernetes

Warum es ausgelassen wurde

Kubernetes kennt keinen gestoppten Pod, der wieder starten kann: stop löscht den Pod und start erzeugt einen neuen.

Warum die Lösung nicht beeinträchtigt ist

Dateisystem und Logs des Containers gehen beim Stoppen verloren. In Cinder-Volumes abgelegte Daten überstehen stop, start, reboot und rebuild, was die dokumentierte Praxis ist.

Quelle: openkeel-zun/README.md

Von der Cloud-Native-Plattform übernommen

Docker-Image-Suche, docker load, Docker-Netzwerke

Übernommen von Kubernetes (kubelet)

Warum es ausgelassen wurde

Es gibt keinen Daemon zum Suchen, Laden von Archiven oder Anlegen von Netzwerken; kubelets ziehen aus Registries, und Pods binden Neutron-Ports direkt an.

Warum die Lösung nicht beeinträchtigt ist

Die Image-Suche liefert nur exakte Referenzen, Glance-Images benötigen eine OCI-Referenz, und das Anlegen eines Netzwerks speichert nur eine Zeile. Die Vernetzung der Container selbst übernimmt Neutron.

Quelle: openkeel-zun/README.md

Von der Cloud-Native-Plattform übernommen

DISK_GB-Claim in Placement

Übernommen von Kubernetes (ephemeral-storage)

Warum es ausgelassen wurde

Kein OpenKeel-Provider veröffentlicht DISK_GB, da Root-Disks PVCs sind; der Claim würde jeden Container mit Disk in Error versetzen.

Warum die Lösung nicht beeinträchtigt ist

Die Disk wird zu Request und Limit des ephemeral-storage des Pods: Das kubelet platziert und begrenzt sie, wie es storage-opt bei Docker tat. CPU und Speicher werden weiterhin in Placement beansprucht.

Quelle: openkeel-zun/docs/CONFORMANCE.md

Vereinfachte interne Mechanik

RabbitMQ-RPC zu zun-compute

Warum es ausgelassen wurde

Die API stellt jede asynchrone Operation in eine Datenbanktabelle ein, die zun-compute per Compare-and-Set beansprucht; ein einziges aktives zun-compute hält einen Lease.

Warum die Lösung nicht beeinträchtigt ist

Für Zun ist kein RabbitMQ erforderlich und die API bleibt unverändert; der Task eines abgestürzten Workers wird übernommen.

Quelle: openkeel-zun/README.md

Hier ist nur aufgeführt, was bewusst ausgelassen wurde; noch nicht erledigte Arbeit steht in den Known gaps der docs/CONFORMANCE.md des Moduls. Alle Module

Zun-Interaktionen

Dienstansicht, vom Diagramm-Skill aus dem OpenKeel-Modell generiert.

Diagramm openkeel-zun.svg Vollbild
Die 8 Interaktionen des Modells
VonNachProtokollWas
Zun APIPlacementREST-APIallocation candidates, claims
Zun APIKubernetes API serverKubernetes-APIlogs, exec, top, resize, metrics
Zun computeNeutron serverREST-APIports bound to host (compute:zun)
Zun computeCinder APIREST-APIattachments → kubernetes_pvc
Zun computeKubernetes API serverKubernetes-APIPods (Kata RuntimeClass), NADs, Secrets
Zun compute agentPlacementREST-APIinventory (Node UID provider)
Zun compute agentKubernetes API serverKubernetes-APINode allocatable, Pods
Zun wsproxyKubernetes API serverKubernetes-APIattach, exec (WebSockets)

Spezifikationen