Self-hosted multi-tenant serverless platform on Kubernetes. Push a container image, get a URL.
Built as a learning project — no backup strategy, no monitoring, error handling that's optimistic at best. Complete enough to deploy and poke at. Read the blog post for context.
operator/— watches Tenant and App CRDs; creates namespaces, Knative Services, CiliumNetworkPolicies, ResourceQuotas, Capsule Tenants, DomainMappingsapiserver/— REST API (Go + chi); auth, tenant/app/env/domain CRUD, syncs to CRDs and PostgreSQLcli/— CLI client (Go + Cobra)frontend/— Next.js dashboard
- Kubernetes cluster with Cilium >= 1.15 as CNI
justtask runner- cert-manager, Knative Serving, Capsule, and PostgreSQL — installed separately via
just deploy-prereqs
just deploy-prereqs
just deploy-kuberless HOST=kuberless.example.com ADMIN_PASSWORD=yourpasswordOr with helm directly:
helm install kuberless deploy/helm/kuberless \
-n kuberless-system --create-namespace \
-f my-values.yamlThe JWT signing secret is auto-generated on first install and preserved across upgrades.
just deploy-upgrade
just deploy-teardown # removes kuberless, keeps prereqs
just deploy-teardown-all # removes everythingjust openshift-deploy
just openshift-teardownjust kind-dev # one-shot: cluster + prereqs + images + deploy
just kind-redeploy # rebuild and restart after code changes
just kind-teardown
kubectl port-forward -n kuberless-system svc/kuberless-apiserver 8080:8080
kubectl port-forward -n kuberless-system svc/kuberless-frontend 3000:3000just build-all # Go binaries → bin/
just test # go test with envtest
just lintkuberless login
kuberless tenant create my-org --plan starter
kuberless deploy ghcr.io/myorg/myapp:latest --name myapp --port 8080
kuberless apps list
kuberless logs myapp --follow
kuberless env set myapp KEY=value
kuberless domains add myapp api.example.com
kuberless apps pause myappApache 2.0