Generated at build time from
charts/racora/README.md(helm-docs:values.yaml+README.md.gotmpl); edit the source, not this page.
racora
The umbrella chart for the racora distribution. One Helm release, the entire Racora system.
What this installs
| Subchart | What |
|---|---|
racora-crds | NRCell CRD |
racora-base | Workload namespaces |
racora-node | USRP + NVIDIA device plugins, optional nvidia RuntimeClass (racora-system) |
racora-controller | NRCell reconciler (racora-system) |
racora-cu | CU-CP + CU-UP + CU-IP (centralized-unit) |
racora-monitoring | OTel + ClickHouse + Tempo + Grafana |
racora-core-open5gs | the Open5GS core provider (cores/open5gs), rendered when global.core.provider is open5gs (the default) |
Install
# Default: everything on (RAN + 5GC + observability)
helm install racora ./charts/racora
# Bring your own 5G core: no core renders, the CU-CP dials your AMF
helm install racora ./charts/racora \
--set global.core.provider=external \
--set global.core.amfAddr=amf.my-5gc.example.com
# Edge install without observability
helm install racora ./charts/racora \
--set monitoring.enabled=false
Values
| Key | Type | Default | Description |
|---|---|---|---|
| global.systemDefaultRegistry | string | "registry.gitlab.com/cognitive-network-solutions/racora" | Registry every component image is pulled from ( |
| global.core.provider | string | "open5gs" | The 5G core provider: open5gs (the bundled reference core, default) or external (bring your own AMF: set amfAddr). Exactly one core renders. |
| global.core.amfAddr | string | "" | external only: the AMF the CU-CP dials (DNS name or IP the cluster reaches over SCTP). The controller renders it into the CU-CP overlay; a change takes effect at the next cu-cp restart. In-cluster providers expose their AMF as the Service amf.<racora-controller.coreNamespace>.svc.cluster.local and leave this empty. |
| global.network.plmn | string | "90170" | PLMN the network serves (MCC+MNC, 5 or 6 digits). The reference deployment's 90170 (the range test SIMs are issued in). |
| global.network.tacs | list | [7] | Tracking area codes the network serves; the core provider must serve every one of them. |
| global.network.slices | list | [{"sst":1}] | Network slices (sst, optional sd) the CU-CP advertises for every tracking area. |
| crds.enabled | bool | true | Ship the NRCell CRD inside the release (the kubernetes platform). The k3s platform applies it out-of-band and sets this false. |
| base.enabled | bool | true | Create the six workload namespaces (racora-base). |
| node.enabled | bool | true | Hardware enablement DaemonSets (USRP + NVIDIA device plugins) and the optional nvidia RuntimeClass — the node contract's cluster-side half. |
| controller.enabled | bool | true | Deploy the NRCell controller (racora-controller). |
| cu.enabled | bool | true | Deploy the CU planes: CU-CP, CU-UP and CU-IP (racora-cu). |
| monitoring.enabled | bool | true | Default true — observability is part of the distribution story. Disable on resource-constrained edge installs where logs go elsewhere. |
Per-subchart values are accessible via the subchart's name as a
top-level key (matches Helm's dependency-values convention); each subchart's
README lists its own. See values.yaml for examples of common overrides.
After install
Watch the system come up:
kubectl get pods -A -l app.kubernetes.io/part-of=racora -w
Apply a cell and verify reconciliation (see the repo README for the full walkthrough):
cat <<'EOF' | kubectl apply -f -
apiVersion: racora.io/v1alpha1
kind: NRCell
metadata:
name: cell-1
namespace: racora-system
spec:
band: 78
dlArfcn: 632628
channelBandwidthMHz: 10
commonScs: 30
plmn: "90170"
tac: 7
radioBackend:
ruType: dummy
EOF
kubectl get nrcells -n racora-system # identity + NCI assigned, ConfigGenerated
kubectl get pods -n distributed-unit # DU pod created by controller
Order of installation
Helm renders all subchart templates together and applies them as one manifest sorted by kind (Namespaces, then CRDs, RBAC, ConfigMaps, Services, workloads) — no subchart declares a dependency on another. The actual subchart-to-subchart runtime ordering (e.g., wait for controller before applying CRs) is handled by each workload's init containers:
cu-cpblocks untilracora-controllerwritesnrcell-cu-cp-config(no CR → no overlay → cu-cp stays Init)cu-upsleeps 20s waiting for cu-cpcuiphas no init gating — once the controller scales the CU plane up it starts immediately (substrate boots empty, populates when NRCells appear)
This means a fresh helm install puts everything into the right
sequence on its own — no --wait or post-install hooks needed.
Note: ogstun on hostNetwork
Open5GS uses hostNetwork: true (needed for SCTP NGAP), so the TUN
device it creates (ogstun) lives on the host kernel and would persist
across pod restarts. The chart handles this automatically: the open5gs
container resets any leftover ogstun/loopback/NAT state before every
start, and on the k3s platform racora-uninstall.sh (scope host or
cluster) clears it from the host on uninstall — no manual cleanup needed.
How a platform delivers this chart
Delivery is the platform module's job (docs/platforms/index.md), never the
chart's. The k3s platform writes the released chart package as a k3s
HelmChart resource on the server at install time (with
platforms/k3s/values.yaml as its values and the NRCell CRD applied
out-of-band); an existing cluster installs it with helm and
platforms/kubernetes/values.yaml. Image pins are baked into the released
chart; chart-values.yaml carries them for installs from source.