OpenKeel: la soluzione Cloud sovrana, francese e di portata europea, del gruppo inherent Scopri inherent

Componenti · Calcolo e capacità

Zun

Containers as a Service: un Pod per container, isolato nella propria microVM Kata, con la sua porta Neutron come unica rete.

Go Pod Kataopenkeel-zun

Il modulo

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

Estratto da openkeel-zun/README.md (in inglese).

API REST

73 operazioni dell'API REST originale (route e azioni nel corpo) e il loro stato in OpenKeel.

  • 69Implementato
  • 4Parziale

Come viene testata la compatibilità

Gli scambi registrati dai test API di Zun Python e le sonde dell'applicazione Pecan reale vengono riprodotti sul servizio Go, con vettori di algoritmo e un test del controller su un cluster simulato.

Replay degli scambi registrati

Replay E2E dei test API registrati

I 256 scambi di 221 test API Python restituiscono lo stesso stato e lo stesso corpo, ciascuno su un database popolato come previsto dal test registrato.

Esecuzione

make e2e (test/e2e), report in report.json; make e2e-strict fallisce su qualsiasi differenza non elencata in known-differences.txt.

Ultimo risultato 223 / 256 identici; la modalità strict è superata, con le 35 differenze elencate insieme alla loro motivazione.

Fonte: openkeel-zun/docs/CONFORMANCE.md

Replay degli scambi registrati

Sonde dell'applicazione Pecan reale

Le richieste inviate all'applicazione Python reale, al di fuori dei suoi test unitari, ottengono le stesse risposte dal servizio Go.

Esecuzione

Replay di test/e2e/testdata/zun.probes.json nella suite e2e.

Ultimo risultato 30 / 32; gli altri 2 sono difetti di Python corretti di proposito (trappole T7, T13).

Fonte: openkeel-zun/docs/CONFORMANCE.md

Test unitari e golden test

Vettori di algoritmo ricavati da Python

L'analisi dei nomi delle immagini, le decisioni di pull, la mappatura degli stati Docker, le query a Placement, la policy di riavvio e le regole delle porte corrispondono alle funzioni Python.

Esecuzione

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

Ultimo risultato 8 / 8 famiglie, 307 casi.

Fonte: openkeel-zun/docs/CONFORMANCE.md

Test unitari e golden test

Ciclo di vita dei container su un cluster simulato

Creazione, scheduling, claim, porte Neutron, Pod Kata, arresto ed eliminazione lasciano gli stessi record di Python, porte e allocazioni incluse.

Esecuzione

internal/compute/manager_test.go con simulatori Kubernetes.

Ultimo risultato Superato.

Fonte: openkeel-zun/docs/CONFORMANCE.md

Escluso dal rewrite

Zun mantiene la sua API v1 ma esegue i container come Pod Kubernetes in VM Kata, per cui scompaiono le operazioni specifiche di Docker e lo stack di nodo Docker, CNI e Kuryr.

Gestito dalla piattaforma Cloud Native

Daemon Docker, zun-cni e kuryr-libnetwork

Gestito da Pod Kubernetes, Kata Containers

Perché è stato escluso

I container sono Pod posizionati da Placement e isolati in VM Kata; le porte Neutron si collegano tramite il CNI OVN, e il kubelet scarica le immagini e monta i PVC Cinder.

Perché la soluzione non ne risente

python-zunclient, openstack appcontainer, Skyline e Heat continuano a funzionare con la stessa API; lo stack di nodo è quello del cluster.

Fonte: openkeel-zun/README.md

Gestito dalla piattaforma Cloud Native

Pause, unpause e commit

Gestito da Kubernetes

Perché è stato escluso

Kubernetes non ha API di freeze né di commit; aggiungerle richiederebbe un agente di nodo con accesso root a containerd o ai cgroup, cosa che OpenKeel rifiuta (decisione del 2026-11-02).

Perché la soluzione non ne risente

Queste azioni rispondono 409 container.operation-not-supported. Le immagini si costruiscono in un registry; i container in esecuzione non sono interessati.

Fonte: openkeel-zun/docs/CONFORMANCE.md

Gestito dalla piattaforma Cloud Native

Livello scrivibile conservato dopo stop

Gestito da Kubernetes

Perché è stato escluso

Kubernetes non prevede un Pod arrestato che possa ripartire: stop elimina il Pod e start ne crea uno nuovo.

Perché la soluzione non ne risente

Il filesystem e i log del container vanno persi all'arresto. I dati conservati nei volumi Cinder sopravvivono a stop, start, reboot e rebuild, che è la prassi documentata.

Fonte: openkeel-zun/README.md

Gestito dalla piattaforma Cloud Native

Ricerca di immagini Docker, docker load, reti Docker

Gestito da Kubernetes (kubelet)

Perché è stato escluso

Non c'è alcun daemon per cercare, caricare archivi o creare reti; i kubelet scaricano dai registry e i Pod si collegano direttamente alle porte Neutron.

Perché la soluzione non ne risente

La ricerca di immagini restituisce solo riferimenti esatti, le immagini Glance richiedono un riferimento OCI, e la creazione di una rete registra solo una riga. La rete dei container stessa è compito di Neutron.

Fonte: openkeel-zun/README.md

Gestito dalla piattaforma Cloud Native

Claim DISK_GB in Placement

Gestito da Kubernetes (ephemeral-storage)

Perché è stato escluso

Nessun provider OpenKeel pubblica DISK_GB, essendo i dischi root dei PVC; il claim metterebbe in Error ogni container dotato di disco.

Perché la soluzione non ne risente

Il disco diventa la request e il limit di ephemeral-storage del Pod: il kubelet lo posiziona e lo limita, come faceva storage-opt di Docker. CPU e memoria restano oggetto di claim in Placement.

Fonte: openkeel-zun/docs/CONFORMANCE.md

Meccanismi interni semplificati

RPC RabbitMQ verso zun-compute

Perché è stato escluso

L'API accoda ogni operazione asincrona in una tabella del database che zun-compute acquisisce con compare-and-set; un unico zun-compute attivo detiene un Lease.

Perché la soluzione non ne risente

Zun non richiede RabbitMQ e l'API resta invariata; il task di un worker in crash viene ripreso.

Fonte: openkeel-zun/README.md

Qui è elencato solo ciò che è stato escluso per scelta progettuale; il lavoro non ancora svolto si trova nei Known gaps del docs/CONFORMANCE.md del modulo. Tutti i moduli

Interazioni Zun

Vista del servizio generata dalla skill dei diagrammi a partire dal modello OpenKeel.

Diagramma openkeel-zun.svg Schermo intero
Le 8 interazioni del modello
DaAProtocolloCosa
Zun APIPlacementAPI RESTallocation candidates, claims
Zun APIKubernetes API serverAPI Kuberneteslogs, exec, top, resize, metrics
Zun computeNeutron serverAPI RESTports bound to host (compute:zun)
Zun computeCinder APIAPI RESTattachments → kubernetes_pvc
Zun computeKubernetes API serverAPI KubernetesPods (Kata RuntimeClass), NADs, Secrets
Zun compute agentPlacementAPI RESTinventory (Node UID provider)
Zun compute agentKubernetes API serverAPI KubernetesNode allocatable, Pods
Zun wsproxyKubernetes API serverAPI Kubernetesattach, exec (WebSockets)

Specifiche