Skip to main content

Install the Control Node

The control node is the centralized-unit node: the host with the GPU that runs the CU-CP, the CU-UP and CU-IP, the 5G core and the two controllers. This page turns a stock Ubuntu host into one, with the default k3s platform underneath. If the host also has a radio, it becomes a radio node in the same steps. At the end the RAN is dormant: the centralized-unit deployments sit at zero replicas until you declare a cell.

You need a host that meets the Requirements: amd64, Ubuntu 24.04, an NVIDIA GPU, Secure Boot off, no other Kubernetes on it, and an Ubuntu Pro token unless the host is already attached.

1. Provision the Host​

Racora's provisioner converts the host: real-time kernel, isolated cores, the TuneD profile, UHD for the radio, and the NVIDIA driver and container toolkit for CU-IP. It runs in phases, reboots the host by itself between them, and is idempotent.

curl -sfL https://get.racora.io | INSTALL_RACORA_MODE=provision-rf INSTALL_RACORA_VERSION=vX.Y.Z INSTALL_RACORA_PRO_TOKEN=<your-pro-token> sh -

vX.Y.Z is the release you are about to install (Release History lists them); INSTALL_RACORA_VERSION pins the provisioner to it, and without it provisioning runs the scripts from the repository's main branch. Walk away; the host comes back RF-ready. When it does, the capabilities file it writes says so:

sudo cat /etc/racora/node-capabilities
# rf_ready=true
# gpu_ready=true
# fronthaul_ready=false

gpu_ready=true is the line that matters for the control node: CU-IP schedules only on a node that reports it. If it reads false, the GPU driver did not come up: fix the driver, re-run the provisioner (it is idempotent; Node Provisioner), and relabel the node once it reports gpu_ready=true (Relabel a Node).

2. Install​

curl -sfL https://get.racora.io | INSTALL_RACORA_VERSION=vX.Y.Z sh -

The command served at get.racora.io downloads that release's own installer package (checksum-verified) and runs it, so what runs on your host is the installer that shipped with the release, the same one that provisioned the host. It installs an unmodified upstream k3s release, labels the node from the capabilities file, loads sctp, installs the Open5GS provider's host units, stages the RAN as a k3s HelmChart, and copies the cluster's kubeconfig to your ~/.kube/config unless you already have one (then export KUBECONFIG=/etc/rancher/k3s/k3s.yaml, or merge it). That file is a cluster-admin credential whose server address is the loopback: for another machine, copy it and set server: to the control node's address, or give the operator a user of their own, which is the cluster's business, not Racora's. The lines to look for:

[INFO] running the vX.Y.Z installer (from its release package)
[INFO] node labels from capabilities: rf-ready=true gpu-ready=true fronthaul-ready=false
[INFO] core provider open5gs host units installed + (re)started: egress-nat.service fix-resolved-loopback.service nat-sanitize.service
[INFO] RAN payload staged in /var/lib/rancher/k3s/server/manifests/racora (CRDs + HelmChart racora from racora-X.Y.Z.tgz)

To read the script before running it:

curl -sfL https://get.racora.io -o install-racora.sh
sh install-racora.sh

3. Check That the RAN Is Up and Dormant​

kubectl get nodes # your host, Ready
kubectl get pods -n racora-system # the two controllers and the device plugins, Running
kubectl get deploy -n centralized-unit # cu-cp, cu-up and cuip (CU-IP), all at 0/0
kubectl get pods -n 5g-core # the Open5GS core, Running

The helm release is installed by k3s's helm-controller a few seconds after the installer returns; if the deployments are not there yet, give it a moment.

The centralized-unit namespace holds the three centralized-unit functions: the CU-CP (control plane), the CU-UP (user plane) and CU-IP (the Intelligence Plane). All three scale up together when the first cell is declared.

Variations​

Every operator variable the installer reads is in the installer reference; what the k3s platform puts on the host is on its page.

What's Next​