Stand up a real O-RAN Near-RT RIC on Kubernetes
0Prerequisites
- Linux, macOS, or Windows + WSL2 (Ubuntu) — 8 GB RAM, 20 GB free disk
docker≥ 20.10 — installkubectl≥ 1.24 — installhelm≥ 3.10 — installkind≥ 0.20 — installgit
kind with the --image kindest/node:v1.27.3 flag to avoid ARM64 issues. Some O-RAN SC images are amd64-only — Docker Desktop's Rosetta emulation handles this transparently on M-series chips.1Create a local Kubernetes cluster
First, spin up a single-node Kubernetes cluster using kind:
kind create cluster --name oran-ric kubectl cluster-info
You should see:
Kubernetes control plane is running at https://127.0.0.1:<port> CoreDNS is running at ...
2Clone the O-RAN SC deployment repo
git clone "https://gerrit.o-ran-sc.org/r/it/dep" oran-dep cd oran-dep git checkout bronze ls bin/
You should see install, uninstall, and other helper scripts.
3Inspect the Bronze recipe
Open the example recipe — this is the YAML that defines which RIC components to install:
cat RECIPE_EXAMPLE/PLATFORM/example_recipe.yaml | head -80
You'll see component versions for: e2term, e2mgr, submgr, rtmgr, dbaas, appmgr, a1mediator, vesmgr, jaegeradapter, and others.
- E2 Termination →
e2term - Subscription Manager →
submgr - Conflict Mitigation →
rtmgr(routing manager handles this) - SDL (Shared Data Layer) →
dbaas - RNIB (RAN Info Base) → also
dbaas(with separate namespace) - xApp Framework →
appmgr
3Install the Bronze RIC platform
cd bin sudo ./install -f ../RECIPE_EXAMPLE/PLATFORM/example_recipe.yaml
This takes 5–10 minutes. While Helm pulls images and Kubernetes schedules pods, watch progress in a second terminal:
watch -n 2 'kubectl -n ricplt get pods'
4Verify all platform pods are running
kubectl -n ricplt get pods
Expected output (abridged):
NAME READY STATUS RESTARTS deployment-ricplt-a1mediator-... 1/1 Running 0 deployment-ricplt-appmgr-... 1/1 Running 0 deployment-ricplt-dbaas-... 1/1 Running 0 deployment-ricplt-e2mgr-... 1/1 Running 0 deployment-ricplt-e2term-alpha-... 1/1 Running 0 deployment-ricplt-rtmgr-... 1/1 Running 0 deployment-ricplt-submgr-... 1/1 Running 0 ...
5Probe the SDL (data layer)
Confirm SDL is reachable:
kubectl -n ricplt exec deployment/deployment-ricplt-dbaas -- redis-cli ping
Should respond PONG.
6Inspect the E2 Termination port
E2 Nodes (gNBs) connect to the Near-RT RIC via SCTP on port 36422. Verify it's listening:
kubectl -n ricplt get svc | grep e2term
You'll see a NodePort or ClusterIP service exposing 36422.
Checkpoint
- All
ricpltnamespace pods STATUS =Running dbaasresponds toPINGe2termservice is exposed- You can
curl -k https://<node-ip>:<port>/healthchecktoa1mediator
7Cleanup (when you're done)
cd bin sudo ./uninstall -f ../RECIPE_EXAMPLE/PLATFORM/example_recipe.yaml kind delete cluster --name oran-ric
!Troubleshooting
| Symptom | Fix |
|---|---|
Pod stuck Pending | Run kubectl describe pod <pod>. Usually insufficient memory — bump to 12 GB. |
e2term CrashLoopBackOff | Check kubectl logs deployment/deployment-ricplt-e2term-alpha. Frequent cause: dbaas not ready before e2term started. Restart it. |
ImagePullBackOff | O-RAN SC nexus3 registry rate-limit. Wait 60 s and retry, or pre-pull: docker pull nexus3.o-ran-sc.org:10002/o-ran-sc/ric-plt-e2term:5.5.0 |
| Apple Silicon Mac stuck | Force amd64: docker buildx use desktop-linux and re-pull images. |