Helm on Kubernetes - rsys-bshankar/ai-ran-smo GitHub Wiki

Helm on Kubernetes

The same stack as docker-compose.yml, on a cluster. Compose stays the way to run it on one machine. The chart is in smo/deploy/helm/smo (its own README lists every value).

Install

helm install smo smo/deploy/helm/smo -n smo --create-namespace

Use a namespace of its own: the Services are named as in Compose (sme, dme, postgres, ...), because that is what the modules and the GUI address each other by, so there is one release per namespace. Images are ghcr.io/rsys-bshankar/ai-ran-ref/smo-<module>:<appVersion>.

Reach it:

kubectl -n smo port-forward svc/gui 3000:8080              # the operator GUI
kubectl -n smo port-forward svc/r1-termination 8080:8000   # the gateway rApps call: GET /bootstrap

or set ingress.enabled with ingress.gui.host and ingress.r1.host.

The database

Bundled (default) One Postgres pod with a volume. For a lab or a trial.
External --set postgres.enabled=false --set postgres.external.host=db.example.com (also port, database, user, sslmode). Run a managed or HA Postgres.

Kubernetes keeps the bundled database's volume when you uninstall. To reinstall from nothing, delete it too: kubectl -n smo delete pvc pgdata-postgres-0.

Secrets

The chart makes the Secret smo-secrets (database password and enrollment secret) and keeps the values across upgrades. To bring your own, create a Secret with the keys db-password and enrollment-secret and set secrets.existingSecret. Each pod is given only what it needs; an rApp pod never gets the enrollment secret.

Upgrades and migrations

A Job runs the migration on install, and as a pre-upgrade hook on upgrade, so it finishes once before any pod of the new version starts and a failed migration aborts the upgrade with the old pods still serving (kubectl -n smo logs job/migrate-<revision>). Every module that uses the database waits for the schema in an init container and never serves on an older one.

helm upgrade smo smo/deploy/helm/smo -n smo

rApp credentials

With --set rappCredentials.delivery=kubernetes (off by default) rApp Management writes each instance's credentials to a Secret rapp-<instanceId>-credentials in the namespace, so the workload can take them with envFrom. It replaces the Secret when the credentials are rotated and deletes it when the instance is terminated; nobody sees the secret. This gives rApp Management (only) a service account that can create, update and delete Secrets in the namespace and read none.

Not in the chart

netconf-lab and edge-tls (use the Ingress with a TLS secret). Replicas above one, PodDisruptionBudget, autoscaling and NetworkPolicy are in the chart but off by default; see Known Limitations.

⚠️ **GitHub.com Fallback** ⚠️