Skip to main content

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​

PlaneResources
CU-CPcu-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-UPcu-up-config ConfigMap · cu-up Deployment
CU-IPcuip 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-unit namespace
  • racora-controller — generates the nrcell-cu-cp-config ConfigMap 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​

KeyTypeDefaultDescription
namespacestring"centralized-unit"Namespace the three CU planes are deployed into. Must already exist (racora-base creates it).
imageRegistrystring""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.enabledbooltrueRender the CU-CP plane.
cuCp.image.repositorystring"gnb"gNB image name.
cuCp.image.tagstring"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.pullPolicystring"IfNotPresent"Image pull policy — IfNotPresent, because the images ship with the distribution.
cuCp.replicaCountint0Replicas at install: 0, dormant. The controller owns this field and scales the plane 0↔1 with cell existence — do not set it.
cuCp.substrateAddrstring"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.initWaitForAmfSecondsint15Init 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.baseConfigHostPathstring""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.enabledbooltrueEnable 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.repositorystring"rann-p-forwarder"RANN-P forwarder sidecar image name.
cuCp.rannP.image.tagstring"v0.1.1"RANN-P forwarder sidecar image tag; pinned from rann_p_forwarder in versions.yaml.
cuCp.rannP.image.pullPolicystring"IfNotPresent"Image pull policy — IfNotPresent, because the images ship with the distribution.
cuCp.rannP.batchSizeint50RANN-P batch size, shared by the CU-CP's own sink and the forwarder sidecar (both read it from this one value).
cuCp.resourcesobject{}Pod resources for the CU-CP container.
cuUp.enabledbooltrueRender the CU-UP plane.
cuUp.image.repositorystring"gnb"gNB image name.
cuUp.image.tagstring"v0.4.6"gNB image tag; pinned from gnb in versions.yaml at bake time; keep equal to cuCp.image.tag.
cuUp.image.pullPolicystring"IfNotPresent"Image pull policy — IfNotPresent, because the images ship with the distribution.
cuUp.replicaCountint0Replicas at install: 0, dormant. The controller owns this field and scales the plane 0↔1 with cell existence — do not set it.
cuUp.cuCpAddrsstring"cu-cp.centralized-unit.svc.cluster.local"CU-CP service DNS — CU-UP connects to this on E1AP.
cuUp.initWaitForCuCpSecondsint20Init delay before cu-up tries to reach cu-cp (which itself waits for AMF).
cuUp.baseConfigHostPathstring""Same as cuCp.baseConfigHostPath — defaults to empty (chart-shipped ConfigMap from files/cu_up.yml). Set a host path to override.
cuUp.resourcesobject{}Pod resources for the CU-UP container.
cuIp.runtimeClassNamestring"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.repositorystring"cuip"CU-IP image name.
cuIp.image.tagstring"v0.3.0"CU-IP image tag; pinned from cuip in versions.yaml at bake time.
cuIp.image.pullPolicystring"IfNotPresent"Image pull policy — IfNotPresent, because the images ship with the distribution.
cuIp.replicaCountint0Replicas at install: 0, dormant. The controller owns this field and scales the plane 0↔1 with cell existence — do not set it.
cuIp.crdNamespacestring"racora-system"Where the substrate watches for NRCell CRs. Matches the controller's crdNamespace.
cuIp.gpuCountint1CU-IP runs on GPU. nvidia.com/gpu resource. Set to 0 to disable GPU (useful for batch-mode standalone substrate testing).
cuIp.modestring"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.flightPortint8815Arrow Flight port the substrate serves on (FLIGHT_PORT); the cuip Service exposes it and cuCp.substrateAddr must match.
cuIp.graphAlphastring"0.1"Graph edge-weight smoothing factor (GRAPH_ALPHA), as a string.
cuIp.streamGraphModestring"time_ema"Streaming graph update mode (STREAM_GRAPH_MODE); time_ema decays edges with the half-life below.
cuIp.streamHalfLifeSstring"60.0"Edge-weight half-life in seconds for time_ema (STREAM_HALF_LIFE_S), as a string.
cuIp.reportsWindowSizestring"50000"Number of measurement reports kept in the streaming window (REPORTS_WINDOW_SIZE), as a string.
cuIp.enginesstring"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.engineConfigobject{}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.dataHostPathstring""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.createbooltrueCreate the cuip ServiceAccount, ClusterRole and binding (read NRCells).
cuIp.serviceAccount.namestring""ServiceAccount name; empty = the chart-generated default.
cuIp.extraEnvlist[]Extra env vars for substrate — useful for batch mode or for overriding any of the substrate-tunable knobs not surfaced above.
cuIp.resourcesobject{}Pod resources for the CU-IP container (the GPU request comes from gpuCount).
controlPlanePinbooltruePod 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.
nodeSelectorobject{}Node selector for the CU planes (every plane unless overridden per plane).
tolerationslist[]Tolerations for the CU planes (every plane unless overridden per plane).
affinityobject{}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