Skip to main content

Uninstall Racora

Racora removes only what Racora installed. Three nested scopes, and the default is what the platform owns:

ScopeRemovesNever touchesDefault on
ranthe RAN from the cluster: cells and subscribers first, then the release, the CRDs, the namespaces and their claims (unless kept), and on k3s the HelmChartConfig racorathe cluster, the hosta cluster you run
hostran, plus Racora's own artifacts on this node: the core provider's host units and /etc/racora/core-support.env, /opt/racora/installer and /opt/racora/core-support, the sctp module config, the node-label config, the provider's host teardown (Open5GS: the ogstun device and the UE-pool NAT), /etc/racora/install.envnode provisioning
clusterhost, plus the k3s cluster Racora installedanything on a cluster Racora did not install: refusedk3s

No scope reverses node provisioning. The real-time kernel, isolated cores, TuneD profile, UHD, the NVIDIA driver, the PTP units and /etc/racora/node-capabilities stay, so a host can be joined again without provisioning (The Node Contract).

k3s Platform​

On the control node, the wrapper the installer generated:

sudo racora-uninstall.sh # default scope: cluster
sudo racora-uninstall.sh --scope ran # the RAN only
sudo racora-uninstall.sh --scope host --dry-run # print what host scope would remove
sudo racora-uninstall.sh --scope ran --keep-crd --keep-data # the RAN only, keeping the CRDs, the namespaces and their claims

--keep-crd and --keep-data keep the CRDs, the namespaces and their claims, nothing more: every ran uninstall deletes the NRCells and the Subscribers first, and the core controller deprovisions each Subscriber from the core as it goes, so the kept claim holds no declared SIM afterwards. The HelmChartConfig racora goes too. Save what you will declare again:

kubectl -n kube-system get helmchartconfig racora -o yaml > racora-helmchartconfig.yaml
kubectl -n racora-system get nrcell,subscriber,secret -o yaml > racora-declarations.yaml

The files are for reference; declare again from the manifests you applied in the first place. A get -o yaml dump carries status, uid and resourceVersion, which a fresh cluster refuses on apply unless you strip them, the cells get new identities either way, and the Secrets hold the SIM keys in plain text: keep the file where such keys belong. To declare again on a non-default identity, apply the HelmChartConfig first and let the release settle, then the cells and subscribers. A dump can be applied once its server-side fields are stripped, for example with yq; note that it also carries what the controller wrote into spec (a temporary or retuned spec.pci, neighbors ANR added), which a re-apply turns into your declarations, another reason to prefer the original manifests:

yq 'del(.items[].status, .items[].metadata.uid, .items[].metadata.resourceVersion, .items[].metadata.creationTimestamp, .items[].metadata.managedFields)' racora-declarations.yaml | kubectl apply -f -

On a joined worker, sudo racora-node-uninstall.sh on that node, then kubectl delete node <hostname> on the control node. ran is refused on a worker: the RAN lives on the control node. The scope decision comes from the ownership record /etc/racora/install.env: a server that installed the cluster records RACORA_CLUSTER_OWNER=racora, and cluster is refused without it.

A Cluster You Run​

Only the RAN is Racora's to remove. The ran scope deletes the NRCells and Subscribers here too, so save them first as above:

curl -sfL https://get.racora.io | INSTALL_RACORA_PLATFORM=kubernetes INSTALL_RACORA_MODE=uninstall sh -
# keep the CRDs, or the namespaces and their claims:
curl -sfL https://get.racora.io | RACORA_UNINSTALL_KEEP_CRD=1 RACORA_UNINSTALL_KEEP_DATA=1 INSTALL_RACORA_PLATFORM=kubernetes INSTALL_RACORA_MODE=uninstall sh -

INSTALL_RACORA_UNINSTALL_SCOPE=host and cluster are refused: Racora did not install this cluster, and there is no wrapper script on this platform. The host artifacts you created for the existing-cluster checklist are yours to remove.