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
- The latest release: leave
INSTALL_RACORA_VERSIONout and the front door resolves it; pinning keeps the provisioner and the install on the same release. The same command, with anyINSTALL_K3S_*orK3S_*flags you gave the first time, re-run later upgrades in place. - Your own 5G core:
INSTALL_RACORA_CORE=external INSTALL_RACORA_AMF_ADDR=<amf>(Configure the 5G Core). - A second host for a radio: Add a Radio Node.
- No internet on the host: the offline bundle (Use Your Own Registry or Install Offline).
- A cluster you run: Install onto an Existing Kubernetes Cluster.
- See the plan without changing anything:
RACORA_DRY_RUN=1.
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
- Declare a cell and watch the RAN come up: Bring Up Your First Cell.
- Join a second host with a radio: Add a Radio Node.