GitLab CE on Kubernetes Playground
A multi-node kubeadm cluster that installs GitLab CE with the official Helm chart at startup, with in-cluster PostgreSQL, Redis, RustFS object storage, Container Registry, and an Envoy HTTPS Gateway.

- eth0
- /
- k8s-omni-dev-machine
- eth0
- /
- k8s-omni-cplane
- eth0
- /
- k8s-omni-node
- eth0
- /
- k8s-omni-node
A fresh kubeadm cluster (one control plane, two workers, and a dev machine) that installs GitLab CE with the official Helm chart when it starts. Nothing to run by hand: when the playground opens, GitLab is up.
Startup
Startup takes about 10 minutes. The init tasks build the cluster, then deploy GitLab in the same stages as make deploy-lab:
- In-cluster PostgreSQL and Redis, with freshly generated credentials, plus the Gateway API CRDs.
- RustFS object storage and its buckets.
- The full GitLab release: object storage, Container Registry, Prometheus, and the HTTPS Gateway.
- A standalone GitLab Runner in the
runnernamespace, with one job at a time.
Sign in
- Click the GitLab tab. It opens GitLab in a new browser tab.
- Sign in as
root. The generated password is in the dev-machine terminal:cat ~/gitlab-root-password
The lab files are in /opt/gitlab-k8s on the dev machine, with kubectl and helm set up. Run make -C /opt/gitlab-k8s status to see the release and pods.
How the GitLab tab connects
The chart serves GitLab over HTTPS at gitlab.gitlab.local through Envoy Gateway, with a self-signed certificate. That hostname cannot match the playground's own address, so the tab goes to a small nginx proxy on NodePort 30080 that forwards to GitLab Workhorse and keeps redirects on the tab's address. GitLab still uses https://gitlab.gitlab.local in clone URLs and emails.
To use the Gateway itself, run labctl kube-proxy on your machine, then port-forward the envoy-gitlab-gitlab-gw-* service in the gitlab namespace to local port 8080 (kubectl -n gitlab port-forward svc/<name> 8080:443). Map gitlab.gitlab.local to 127.0.0.1 in /etc/hosts, and visit https://gitlab.gitlab.local:8080.
Limits
Starting this playground needs a paid iximiuz plan. On the free tier, its machines are scaled down to 5 vCPU and 8 GiB in total, which is too small for GitLab.
This is a disposable evaluation lab. PostgreSQL, Redis, RustFS, and Gitaly use emptyDir volumes, so their data is lost when their pods are recreated. The cluster has about 11 GiB of allocatable memory, well below GitLab's sizing guidance. The runner executes one untagged job at a time in its own namespace.
A real VM, not a container
Get root on a VM with its own kernel, so Docker, Kubernetes, and systemd just work.
Read the docs →
SSH from browser or CLI
Use the built-in web terminal, or connect with labctl ssh, plain ssh, scp, or rsync.
Read the docs →
Drive it with AI
Let Claude, Codex, or any MCP client start this playground and run commands in it.
Read the docs →
Expose HTTP(S) ports
Give any web app running inside the VM a public URL - for yourself or to share with others.
Read the docs →
Share terminals
Invite others into your terminal session, or open it yourself from another device.
Read the docs →
Customize with init scripts
Add shell scripts that run at boot to install packages, clone repos, or seed test data.
Read the docs →
Private networking
VMs reach the internet via NAT with no public IP; several VMs share bridge networks.
Read the docs →
Ephemeral or persistent
By default, VMs are destroyed when the session ends; enable persistence to keep the disks for next time.
Read the docs →
Built-in container registry
A private registry.iximiuz.com for every playground to share images across services and VMs.
Read the docs →