Change What a Deployment Runs
A Racora release is a baseline, not a boundary. A deployment is that baseline plus what you declared on top of it, and the ways to declare are the ones Kubernetes gives you: the release's values, its custom resources, and whatever you run alongside. None of it needs a new release, and a release upgrade carries all of it forward (Upgrade Racora).
Through Values
Every value is in the one HelmChartConfig on the k3s platform or your values file on a
cluster you run (Override Chart Values):
- A component's image.
global.components.<name>moves one component to another version, from the release's registry or from where its project publishes it (Update a Component). A newer gNB, CU-IP or O1 adapter is one line. - The 5G core.
global.core.providerselects the bundled Open5GS orexternalwith the AMF you run; the RAN side never learns which (The 5G Core). - Placement, the registry, persistence, monitoring, probes: every component's chart values (Chart Values).
Through Cells and Subscribers
Cells are NRCell objects, SIMs are Subscriber objects, radios are radio-profile
ConfigMaps a cell refers to (Deploy Cells, Add Subscribers,
Radios). They are durable across upgrades.
Alongside
Anything else is plain Kubernetes: your own workloads, in their own namespaces and their own Helm releases, next to Racora's. The seven namespaces the release creates and the objects the charts and the controller render belong to the release; edit those through values and cells, not in place, because helm re-applies the chart's objects on the next upgrade and the controller re-asserts a cell's DU Deployment on its next reconcile.
A Changed Chart
When a change is to what the deployment is made of rather than to a value, a new service, a sidecar, a template, a core provider module, the chart itself changes, and the deployment takes your chart the way it takes a release. From a checkout of the repository with your change:
bash scripts/package-chart.sh # dist/racora-<version>.tgz, pins baked
sh scripts/build-crds.sh dist/racora-crds.yaml
Images the tree changed are built with their component's Dockerfile and tagged as
versions.yaml names them; put them where the nodes pull from, or import them on each node
(sudo k3s ctr images import on the k3s platform).
k3s platform, on the control node, from that checkout:
INSTALL_RACORA_VERSION=vX.Y.Z RACORA_CHART_TGZ=dist/racora-<version>.tgz \
RACORA_CRD_FILE=dist/racora-crds.yaml sh install-racora.sh
INSTALL_RACORA_VERSION names the baseline release (its k3s pin and installer package);
RACORA_CHART_TGZ and RACORA_CRD_FILE carry your payload instead of the release's. The run
is an in-place upgrade like any other: the pre-flight dry-runs your chart in the cluster,
reports what rolls, and helm-controller applies it with the same failure semantics
(Upgrade Racora).
A cluster you run: the platform's command with your package in place of the OCI chart and version:
helm upgrade --install racora dist/racora-<version>.tgz --namespace default --reset-values \
-f installer/platforms/kubernetes/values.yaml -f installer/cores/<provider>/values.yaml -f my-values.yaml
Going back is installing the release again.
What Stays Compatible
Racora drives the interfaces the pinned components offer: the gNB's configuration schema and the runtime commands the controller sends the CU-CP, the O1 adapter's provisioning file, the core provider's subscriber adapter. A newer component that keeps those interfaces and adds to them, a faster protocol layer, more runtime commands, keeps working as a component update, and the deployment gets the improvement; Racora drives the new capabilities once a release adds that. A component that renames or removes an interface Racora drives needs a Racora release, which is what a release absorbs.