Uninstall Racora
Racora removes only what Racora installed. Three nested scopes, and the default is what the platform owns:
| Scope | Removes | Never touches | Default on |
|---|---|---|---|
ran | the 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 racora | the cluster, the host | a cluster you run |
host | ran, 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.env | node provisioning | |
cluster | host, plus the k3s cluster Racora installed | anything on a cluster Racora did not install: refused | k3s |
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.