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:

MethodPathPurpose
GET/healthzLiveness probe
GET/readyzReadiness probe
POST/simulateRun a simulation with JSON params → KPIs as JSON
GET/metricsPrometheus 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, a NOTES.txt, and a helm test hook.
  • 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 ServiceMonitor for 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:

  1. Build + smoke test — compile the service, start it, and hit every endpoint.
  2. Docker — build the multi-stage image.
  3. Helm — helm lint, render the manifests, and validate them against Kubernetes schemas with kubeconform (including the autoscaling + ServiceMonitor variant).
Direct Link