RAN Scheduler on Kubernetes — Dockerized microservice + Helm chart
Published:
A cloud-native deployment of my RAN MAC Scheduler: the C++ simulator is wrapped in a small HTTP microservice, containerized with a multi-stage Docker build, and deployed to Kubernetes (minikube) with a production-shaped Helm chart. It demonstrates the full path from a single binary to a probeable, autoscalable, observable service.
🔗 Source code: github.com/nerostamas/ran-scheduler-k8s-helm
Why this shows depth
The first project proved the C++ and the RAN modelling. This one proves I can operate that code the way a real platform does: turn a batch CLI into a long-running service, containerize it cleanly, and express the whole deployment as declarative, parameterized Helm templates — with the health probes, resource limits, autoscaling, and metrics that production Kubernetes expects.
Crucially, the simulation engine (ran_core) is reused unchanged — the service is a thin HTTP layer on top. That separation (library vs. transport vs. deployment) is itself a design signal.
What it deploys
A C++ HTTP service (built on cpp-httplib) exposing:
| Method | Path | Purpose |
|---|---|---|
GET | /healthz | Liveness probe |
GET | /readyz | Readiness probe |
POST | /simulate | Run a simulation with JSON params → KPIs as JSON |
GET | /metrics | Prometheus exposition (throughput, fairness, HARQ retx) |
Kubernetes & Helm skills demonstrated
- Docker — multi-stage build (compile with CMake in a build image, ship a slim non-root runtime image).
- Kubernetes — Deployment with liveness/readiness probes, resource requests/limits, a read-only root filesystem and dropped capabilities, a Service, a ConfigMap for default simulation parameters, and an optional HorizontalPodAutoscaler.
- Helm — a standard chart with
values.yaml, templated manifests,_helpers.tpl, a config checksum annotation for rollout-on-config-change, aNOTES.txt, and ahelm testhook. - minikube — a one-shot script that builds the image into minikube’s Docker daemon and installs the release.
- Observability — Prometheus metrics endpoint plus an optional
ServiceMonitorfor the Prometheus Operator.
Deploy it (minikube)
minikube start
eval $(minikube docker-env)
docker build -t ran-sim-service:0.1.0 .
helm install ran-sim ./helm/ran-sim --set image.pullPolicy=Never
kubectl port-forward svc/ran-sim 8080:8080
curl -X POST localhost:8080/simulate \
-H 'content-type: application/json' \
-d '{"ues":10,"rbs":50,"ttis":1000,"scheduler":"pf"}'
curl localhost:8080/metrics
Or run the one-shot helper: ./scripts/deploy-minikube.sh.
CI/CD
.github/workflows/ci.yml runs on every push and PR:
- Build + smoke test — compile the service, start it, and hit every endpoint.
- Docker — build the multi-stage image.
- Helm —
helm lint, render the manifests, and validate them against Kubernetes schemas with kubeconform (including the autoscaling + ServiceMonitor variant).
