Generated at build time from
charts/racora-cu/README.md(helm-docs:values.yaml+README.md.gotmpl); edit the source, not this page.
racora-cu
The three CU planes of the Racora gNB packaged together. All three
deploy into the centralized-unit namespace.
What this installs
| Plane | Resources |
|---|---|
| CU-CP | cu-cp Deployment (with optional RANN-P sidecar) · cu-cp Service (F1AP, E1AP, metrics-ws). Its runtime config is the controller-generated nrcell-cu-cp-config ConfigMap (AMF address, max_nof_dus, mobility, admin intent) on top of the vendored base ocudu-base-configs |
| CU-UP | cu-up-config ConfigMap · cu-up Deployment |
| CU-IP | cuip ServiceAccount + ClusterRole + ClusterRoleBinding (read NRCells) · cuip-env ConfigMap · cuip Deployment (GPU, Flight on port 8815) · cuip Service |
CU-CP and CU-UP are independently togglable (cuCp.enabled,
cuUp.enabled — both default true); CU-IP is integral to the
distribution and always renders (no enable flag). The AMF the CU-CP
dials is the umbrella's global.core.amfAddr (an external core), rendered
into the overlay by the controller — this chart carries no AMF value.
All three planes ship dormant (replicaCount: 0): the controller
scales the CU plane to 1 when the first NRCell is declared and dissolves
it back to 0 when the last cell is deleted.
Requires
racora-crds— NRCell CRD (CU-IP reads this)racora-base—centralized-unitnamespaceracora-controller— generates thenrcell-cu-cp-configConfigMap that CU-CP's init container waits on (without the controller, CU-CP boots are blocked indefinitely on the wait-for-cu-cp-config init)
Install
helm install racora-cu ./charts/racora-cu
Values
| Key | Type | Default | Description |
|---|---|---|---|
| namespace | string | "centralized-unit" | Namespace the three CU planes are deployed into. Must already exist (racora-base creates it). |
| imageRegistry | string | "" | Standard image registry for the gNB and CU-IP images. Empty = registry-agnostic (bare image names per workspace convention). Override per-environment to point at the registry you publish to. |
| cuCp.enabled | bool | true | Render the CU-CP plane. |
| cuCp.image.repository | string | "gnb" | gNB image name. |
| cuCp.image.tag | string | "v0.4.6" | gNB image tag; pinned from gnb in versions.yaml at bake time (the tree carries a fallback). One image runs CU-CP, CU-UP and every DU. |
| cuCp.image.pullPolicy | string | "IfNotPresent" | Image pull policy — IfNotPresent, because the images ship with the distribution. |
| cuCp.replicaCount | int | 0 | Replicas at install: 0, dormant. The controller owns this field and scales the plane 0↔1 with cell existence — do not set it. |
| cuCp.substrateAddr | string | "cuip.centralized-unit.svc.cluster.local:8815" | Service DNS for the CU-IP substrate (Flight server). Used by the RANN-P forwarder sidecar AND CU-CP itself when RANN-P is enabled. |
| cuCp.initWaitForAmfSeconds | int | 15 | Init delay before cu-cp tries to reach the AMF. SCTP can't be probed by a port probe, so this is a fixed sleep matching the open5gs boot time. |
| cuCp.baseConfigHostPath | string | "" | OCUDU base config source. By default the chart ships its own ocudu-base-configs ConfigMap with cu_cp.yml + cu_up.yml vendored from upstream OCUDU configs/ (BSD-3-Clause-Open-MPI) and mounts it at /etc/ocudu. Zero host-side prep needed for a default install. Set this to a non-empty path to mount /etc/ocudu from a host directory instead — escape hatch for operators who want to fully replace the chart-provided defaults. |
| cuCp.rannP.enabled | bool | true | Enable the RANN-P sidecar that ships measurements from CU-CP's file sink to the CU-IP substrate via Arrow Flight do_put. |
| cuCp.rannP.image.repository | string | "rann-p-forwarder" | RANN-P forwarder sidecar image name. |
| cuCp.rannP.image.tag | string | "v0.1.1" | RANN-P forwarder sidecar image tag; pinned from rann_p_forwarder in versions.yaml. |
| cuCp.rannP.image.pullPolicy | string | "IfNotPresent" | Image pull policy — IfNotPresent, because the images ship with the distribution. |
| cuCp.rannP.batchSize | int | 50 | RANN-P batch size, shared by the CU-CP's own sink and the forwarder sidecar (both read it from this one value). |
| cuCp.resources | object | {} | Pod resources for the CU-CP container. |
| cuUp.enabled | bool | true | Render the CU-UP plane. |
| cuUp.image.repository | string | "gnb" | gNB image name. |
| cuUp.image.tag | string | "v0.4.6" | gNB image tag; pinned from gnb in versions.yaml at bake time; keep equal to cuCp.image.tag. |
| cuUp.image.pullPolicy | string | "IfNotPresent" | Image pull policy — IfNotPresent, because the images ship with the distribution. |
| cuUp.replicaCount | int | 0 | Replicas at install: 0, dormant. The controller owns this field and scales the plane 0↔1 with cell existence — do not set it. |
| cuUp.cuCpAddrs | string | "cu-cp.centralized-unit.svc.cluster.local" | CU-CP service DNS — CU-UP connects to this on E1AP. |
| cuUp.initWaitForCuCpSeconds | int | 20 | Init delay before cu-up tries to reach cu-cp (which itself waits for AMF). |
| cuUp.baseConfigHostPath | string | "" | Same as cuCp.baseConfigHostPath — defaults to empty (chart-shipped ConfigMap from files/cu_up.yml). Set a host path to override. |
| cuUp.resources | object | {} | Pod resources for the CU-UP container. |
| cuIp.runtimeClassName | string | "nvidia" | Container runtime that injects the NVIDIA driver. k3s registers the "nvidia" RuntimeClass automatically when the NVIDIA container toolkit is present on the node. Override for distributions that name it differently. |
| cuIp.image.repository | string | "cuip" | CU-IP image name. |
| cuIp.image.tag | string | "v0.3.0" | CU-IP image tag; pinned from cuip in versions.yaml at bake time. |
| cuIp.image.pullPolicy | string | "IfNotPresent" | Image pull policy — IfNotPresent, because the images ship with the distribution. |
| cuIp.replicaCount | int | 0 | Replicas at install: 0, dormant. The controller owns this field and scales the plane 0↔1 with cell existence — do not set it. |
| cuIp.crdNamespace | string | "racora-system" | Where the substrate watches for NRCell CRs. Matches the controller's crdNamespace. |
| cuIp.gpuCount | int | 1 | CU-IP runs on GPU. nvidia.com/gpu resource. Set to 0 to disable GPU (useful for batch-mode standalone substrate testing). |
| cuIp.mode | string | "streaming" | Streaming mode is the primary path (V2: live RANN-P + CRD watcher). Set to "batch" + provide UE_REPORTS_PATH / CELL_POSITIONING_PATH via extraEnv to run offline against Parquet files. |
| cuIp.flightPort | int | 8815 | Arrow Flight port the substrate serves on (FLIGHT_PORT); the cuip Service exposes it and cuCp.substrateAddr must match. |
| cuIp.graphAlpha | string | "0.1" | Graph edge-weight smoothing factor (GRAPH_ALPHA), as a string. |
| cuIp.streamGraphMode | string | "time_ema" | Streaming graph update mode (STREAM_GRAPH_MODE); time_ema decays edges with the half-life below. |
| cuIp.streamHalfLifeS | string | "60.0" | Edge-weight half-life in seconds for time_ema (STREAM_HALF_LIFE_S), as a string. |
| cuIp.reportsWindowSize | string | "50000" | Number of measurement reports kept in the streaming window (REPORTS_WINDOW_SIZE), as a string. |
| cuIp.engines | string | "pci,anr" | Intelligence functions the substrate runs (CUIP_ENGINES, comma- separated; unknown names fail the pod fast). Matches the image default — listed here so an operator can disable a function (e.g. "pci" alone) without image knowledge. |
| cuIp.engineConfig | object | {} | Per-function engine config, keyed by function name; rendered as the CUIP_ENGINE_CONFIG JSON env when non-empty. Example: engineConfig: anr: theta_add: 0.4 ownership: report-only |
| cuIp.dataHostPath | string | "" | Substrate /data path source. Empty by default — the public substrate doesn't ship with any baked /data content. Set this to a non-empty host path to mount your own /data directory via hostPath when your intelligence functions need data files. |
| cuIp.serviceAccount.create | bool | true | Create the cuip ServiceAccount, ClusterRole and binding (read NRCells). |
| cuIp.serviceAccount.name | string | "" | ServiceAccount name; empty = the chart-generated default. |
| cuIp.extraEnv | list | [] | Extra env vars for substrate — useful for batch mode or for overriding any of the substrate-tunable knobs not surfaced above. |
| cuIp.resources | object | {} | Pod resources for the CU-IP container (the GPU request comes from gpuCount). |
| controlPlanePin | bool | true | Pod scheduling (applied to every plane unless overridden per-plane). The CU plane pins to the control node: Racora's model is "first node is the brain" (CU + core), additional nodes are DU/RF capacity — so the CU plane must not drift onto an RT-tuned DU worker. controlPlanePin adds node-role.kubernetes.io/control-plane=true to every plane's nodeSelector; the k3s platform labels its server that way (schedulable, untainted), so on a single-node cluster this is a no-op. Platforms whose control planes are tainted NoSchedule (kubeadm/CAPI, OpenShift) set it false and pin with nodeSelector instead (platforms/kubernetes/values.yaml). cuip additionally merges racora.io/gpu-ready when gpuCount>0. |
| nodeSelector | object | {} | Node selector for the CU planes (every plane unless overridden per plane). |
| tolerations | list | [] | Tolerations for the CU planes (every plane unless overridden per plane). |
| affinity | object | {} | Affinity rules for the CU planes (every plane unless overridden per plane). |
hostPath caveat
CU-CP and CU-UP mount the OCUDU base configs from cuCp.baseConfigHostPath
(empty by default; the chart ships an ocudu-base-configs ConfigMap with
upstream OCUDU defaults). Set this to a host path to override.
cuIp.dataHostPath is empty by default. Set it to a host path when your
intelligence functions need data files mounted into the substrate's /data directory.
Verify
kubectl get pods -n centralized-unit
# Expected once the controller has reconciled at least one NRCell:
# cu-cp-xxx Running
# cu-up-xxx Running
# cuip-xxx Running
kubectl exec -n centralized-unit deploy/cuip -- ss -tlnp | grep 8815