Racora Architecture
Racora installs as one Helm release that brings the whole RAN with it. You operate it
through two resources, NRCell and Subscriber; two controllers reconcile those
declarations into running network functions, each in its own namespace; and everything
runs on two kinds of node, a control node and radio nodes.
What Runs Where
The chart creates six namespaces and fills them from its subcharts:
| Namespace | What runs there | Subchart |
|---|---|---|
racora-system | racora-controller (cells), racora-core-controller (subscribers), the USRP and NVIDIA device plugins | racora-controller, racora-node |
centralized-unit | CU-CP with its RANN-P forwarder sidecar, CU-UP, CU-IP | racora-cu |
distributed-unit | one DU Deployment per declared cell, generated by the controller | none: written by racora-controller at runtime |
5g-core | the selected core provider: Open5GS as one hostNetwork pod by default, nothing for an external core | racora-core-open5gs |
monitoring | the OpenTelemetry collector, ClickHouse, Tempo, Grafana | racora-monitoring |
user-equipment | supporting pods for UEs, empty by default | racora-base |
The CU planes are dormant until the first cell: their Deployments sit at zero replicas and the controller scales them to one when a cell is declared, and back to zero when the last cell is deleted.
Two Controllers
racora-controller is the RAN-side controller. It watches NRCell resources, assigns each
cell its identity, generates the DU configuration and Deployment,
regenerates the CU-CP's mobility overlay, pushes mobility changes to the running CU-CP over
its runtime-command interface, and applies the decisions CU-IP makes.
It runs on every platform unchanged.
racora-core-controller is the core-side controller. It owns Subscriber resources and
provisions each one into the selected core provider through the adapter the provider
declares. The two are separate images with separate rights: the RAN controller never holds
exec access into the core or reads SIM secrets, and neither branches on which core runs.
How a subscriber reaches a core is on How Core Providers Work.
Three Layers, One Contract
Racora is organised so the same RAN runs on any Kubernetes:
- The network layer: the
NRCellandSubscriberAPIs, the two controllers, the CU planes, the Intelligence Plane, the core provider, and the telemetry schema. Identical on every platform; the only surface an operator or a builder ever touches. - The node layer: what a host must provide for real radios and GPUs (a real-time kernel, isolated cores, device plugins, labels). Published as the node contract; Racora ships one implementation, its provisioner, and each platform binds it its own way.
- The cluster layer: the Kubernetes underneath, a pluggable platform.
k3sis the default and the only one that installs a cluster for you; on a cluster you already run, Racora lays the same RAN onto it.
Racora always ships the network layer itself and is assembled with what you run underneath and around it: today k3s or your own Kubernetes, the Open5GS core provider or your own AMF, and USRP B210 radios. The 5G core is a pluggable provider behind one contract, so another core plugs into the same Racora with the same operational experience.
Scope and Limits
What a Racora deployment is today, stated as facts of v0.8.0:
- One gNB per cluster. The chart sets one
gnbId(411 by default) and one CU; every cell is a sector of that gNB. One control node runs the CU planes, the core and the controllers; there is no CU redundancy. - Radios. The DU drives a USRP B210 over UHD (
ruType: uhd);zmqanddummyare virtual backends for simulation and tests. TheNRCellAPI accepts no other backend, and there is no Open Fronthaul. - Hosts. The k3s platform installs amd64 binaries only. Hosts Racora provisions run Ubuntu 24.04.
- The Open5GS provider serves the tracking areas and slice its image fixes
(Open5GS); a
global.networkoutside that set fails the render. An external core serves whatever it serves. - Decisions. CU-IP ships two Intelligence Functions, PCI assignment and ANR
(
racora-cu.cuIp.engines, defaultpci,anr). - Telemetry is kept for 24 hours by default, on emptyDir unless persistence is turned on; Grafana is anonymous (Viewer) by default.