Training Module
GitLab auf Kubernetes betreiben — Helm-Deployment, Backup/Restore & Runner-Skalierung
In diesem 210-Minuten-Aufbaumodul betreibt ihr eine echte GitLab-Instanz über den offiziellen
gitlab/gitlab-Helm-Chart auf Kubernetes statt über Docker Compose. Ihr startet mit der
zentralen Tatsache, die den ganzen Kurs prägt: Seit Chart-Version 10.0.0 sind PostgreSQL und Redis
nicht mehr optional bundlebar, seit GitLab 19.0 gilt dasselbe für Object Storage (die bundled MinIO
wurde entfernt) – für jedes Deployment ist heute alles drei zwingend extern anzubinden, die
Entscheidung “Bundled vs. extern” gibt es nicht mehr, nur noch “welches externe Postgres/Redis/Object Storage”.
Ihr bringt dafür schlanke Trainings-Instanzen im Cluster mit und verdrahtet sie über
global.psql.host, global.redis.host und die Object-Storage-Connection-Secrets.
Danach deployt ihr GitLab mit reduzierten Replica-Werten, ordnet Gitalys persistente
Repository-Storage als StatefulSet-PVC ein (Namenskonvention, StorageClass-Wahl, Reclaim Policy),
übt ein vollständiges Backup/Restore über den Toolbox-Pod inklusive separat gesicherter Rails-Secrets,
installiert GitLab Runner als eigenständige Kubernetes-Executor-Workloads – jeder CI-Job bekommt seinen
eigenen, kurzlebigen Pod statt eines Docker-Containers auf dem Host – und ordnet zum Abschluss
Zero-Downtime-Upgrade-Konfiguration (RollingUpdate, maxSurge/maxUnavailable)
sowie Registry-Readiness-/Liveness-Checks als Konzept-Block ein. Die komplette Session läuft lokal über
Minikube, ohne Cloud-Account und ohne Kostenwirkung.
Format
3 Stunden 30 Minuten, live (remote oder vor Ort), Input & vier Hands-on-Blöcke
Teilnehmende
DevOps-/Platform-Engineers, die GitLab künftig als Kubernetes-Workload statt als VM/Docker-Host betreiben wollen
Voraussetzungen
Abgeschlossene Module Helm — Paketmanagement, Kubernetes Storage und Kubernetes Administration. Minikube mit mindestens 4 CPU/10 GB RAM, kein Cloud-Account nötig.
Warum dieses Training für deine Organisation wirkt
Kein Bundled-Irrtum mehr
Wer eine ältere GitLab-Chart-Anleitung googelt, stößt oft auf ein “Bundled PostgreSQL/Redis” von
vor Chart-Version 10.0.0. Teilnehmende verdrahten die aktuelle, zwingend externe Anbindung selbst
und wissen danach, warum ein helm install ohne global.psql.host heute
mit einer klaren Fehlermeldung abbricht statt einfach durchzulaufen.
Backup/Restore vor dem Ernstfall geübt
Der Toolbox-Pod, die separat zu sichernden Rails-Secrets und der komplette Restore-Ablauf mit Skalierung auf 0 Replicas sind Dinge, die im Ernstfall unter Zeitdruck stattfinden – hier laufen sie einmal geübt und mit echtem Datenintegritäts-Nachweis ab.
Runner, der mitskaliert statt zu blockieren
Statt eines Docker-Executors auf einem festen Host bekommt jeder CI-Job seinen eigenen, kurzlebigen Kubernetes-Pod – Teilnehmende sehen live, wie mehrere Jobs parallel eigene Pods bekommen und wieder verschwinden, statt sich einen Runner zu teilen.
Was Teilnehmende mitnehmen
- Einordnen, warum PostgreSQL und Redis seit Chart v10.0.0 und Object Storage seit GitLab 19.0 für jedes GitLab-Helm-Deployment zwingend extern sind, und den
gitlab/gitlab-Chart überglobal.psql.//Object-Storage-Connection-Secrets an schlanke Trainings-Instanzen im Cluster anbinden.global.redis. - GitLab mit reduzierten Replica-Werten (Minikube-tauglich) per
helm upgrade –installdeployen, den Rollout mitkubectl get podsverfolgen und das automatisch generierte Root-Passwort aus dem Kubernetes-Secret auslesen. - Gitalys Git-Repository-Persistenz als StatefulSet-PVC einordnen: Namenskonvention
repo-data-<statefulset>-<index>, Default-Größe, StorageClass-Empfehlungen (SSD,reclaimPolicy: Retain) und dynamische vs. statische Provisionierung. - Ein vollständiges Backup über den Toolbox-Pod (
backup-utility) fahren, die Rails-Secrets separat sichern und einen kompletten Restore-Ablauf inklusive Herunter-/Hochskalieren der Datenbank-Clients durchführen. - GitLab Runner über den eigenständigen
gitlab-runner-Helm-Chart mit Kubernetes-Executor installieren, RBAC-Minimalrechte verstehen und live beobachten, wie jeder CI-Job einen eigenen, temporären Pod bekommt. - Die Konfiguration für Zero-Downtime-Upgrades (
RollingUpdate,maxSurge/maxUnavailable,terminationGracePeriodSeconds) sowie Registry-Readiness-/Liveness-Checks als Cluster-seitiges Betriebskonzept einordnen.
Für wen dieses Modul ideal ist
- • DevOps-/Platform-Engineers, die eine selbstgehostete GitLab-Instanz aus Docker Compose oder VM-Betrieb nach Kubernetes migrieren wollen
- • Teams, die GitLab Runner statt als Docker-Executor auf einem festen Host als skalierende Kubernetes-Workloads betreiben wollen
- • Alle, die vor dem ersten produktiven GitLab-auf-Kubernetes-Betrieb Backup/Restore und Storage-Entscheidungen einmal komplett durchgespielt haben wollen
Rahmendaten
- • Dauer: 3 Stunden 30 Minuten live (remote oder vor Ort)
- • Format: Input, Live-Demo, vier vollständige Hands-on-Blöcke
- • Voraussetzungen: abgeschlossene Module Helm — Paketmanagement, Kubernetes Storage und Kubernetes Administration; Minikube mit mindestens 4 CPU/10 GB RAM; keine Cloud-Kostenwirkung
Modulaufbau & Agenda
Vorbereitung & Architekturüberblick (15 min): Minikube mit mindestens 4 CPU/10 GB RAM starten,
helm repo add gitlab https://charts.gitlab.io/, Kernaussage vorweg: seit Chart v10.0.0 sind externe PostgreSQL/Redis Pflicht, seit GitLab 19.0 gilt das auch für Object Storage – kein Bundled-Betrieb mehr für keins der drei.Hands-on 1: Fundament — Postgres/Redis/Object Storage im Cluster (30 min): schlanke, nicht-produktive PostgreSQL- und Redis-Pods samt Secrets als Ersatz für Managed-Services, MinIO als S3-kompatibles Object Storage samt Bucket für Backups, Registry und Artefakte.
Hands-on 2: Helm-Chart-Deployment (40 min): offizielle
values-minikube-minimum.yamlals Ausgangspunkt, Anpassung an die aktuelle Chart-Version (Gateway-API-Pfad deaktivieren), Verdrahtung mitglobal.psql.//Object-Storage-Connection-Secrets,global.redis.helm upgrade –install, Rollout verfolgen, Root-Passwort auslesen.Persistenter Storage vertiefen (20 min): Gitaly als StatefulSet mit PVC-Namenskonvention
repo-data-<statefulset>-<index>, Default-Größe und AccessMode, StorageClass-Empfehlungen (SSD,reclaimPolicy: Retain), dynamische vs. statische Provisionierung.Hands-on 3: Backup/Restore (40 min): Toolbox-Pod identifizieren,
backup-utilityausführen, Tarball im Object Storage prüfen, Rails-Secrets separat sichern, vollständiger Restore-Ablauf inklusive Herunter-/Hochskalieren der Datenbank-Clients, Datenintegritäts-Nachweis.Hands-on 4: GitLab-Runner-Skalierung (35 min): Abgrenzung Docker-Executor (Vorwissen aus “GitLab & Container-Registry selbst hosten mit Docker”) vs. Kubernetes-Executor, eigenständiger
gitlab-runner-Helm-Chart mit RBAC-Minimalrechten, Job-Pods live beobachten, Skalierung überconcurrent.Zero-Downtime-Upgrade & Health-Checks (25 min, Konzept- und Konfigurationsblock):
RollingUpdate-Einstellungen (maxSurge/maxUnavailable/terminationGracePeriodSeconds) für Webservice/Sidekiq/Registry, Registry-Readiness-/Liveness-Probe als Beispiel,kubectl rollout pause/status.Aufräumen & Abschluss (5 min):
helm uninstall,minikube delete, offene Fragen.
Hands-on Inhalte (Auszug)
Fundament: Postgres/Redis/Object Storage
- Schlanke PostgreSQL-/Redis-Pods samt Kubernetes-Secrets für
global.psql.password.secret/global.redis.auth.secret - MinIO als S3-kompatibles Object Storage, Bucket für Backups/Registry/Artefakte anlegen
- Bewusst als Trainings-Ersatz für Managed-Services markiert, nicht produktionsreif
Helm-Chart-Deployment
helm upgrade –install gitlab gitlab/gitlab -n gitlab -f values.yamlmit reduzierten Replica-Wertenkubectl get pods -n gitlab -wwährend des Rolloutskubectl get secret gitlab-gitlab-initial-root-password -o jsonpath=‘{.data.password}’ | base64 –decode
Backup/Restore
kubectl exec <toolbox-pod> -it – backup-utilitykubectl get secrets | grep rails-secret, Secret als YAML sichernkubectl scale deploy -l app=sidekiq,release=gitlab –replicas=0, dannbackup-utility –restore -t <backup_ID>
Runner-Skalierung
helm install –namespace gitlab-runner gitlab-runner -f runner-values.yaml gitlab/gitlab-runnergitlabUrl,runnerToken,rbac.create: trueinrunner-values.yamlkubectl get pods -n gitlab-runner -wwährend ein CI-Job läuft – ein eigener Pod pro Job
Dieses Modul ist Teil unserer Pilotphase. Gemeinsam mit euch definieren wir passende Metriken (z. B. Zeit bis zum ersten funktionierenden Deployment, Ergebnis der Restore-Übung) und werten sie im Anschluss transparent aus. Ergebnisse veröffentlichen wir, sobald sie belastbar sind.
Explizit nicht Teil dieses Kurses
- • Produktive Cloud-Managed-Anbindung (AWS RDS, Cloud SQL, ElastiCache, echte S3-Buckets) – hier ausschließlich Trainings-Instanzen im Cluster als Platzhalter für die zwingend externen Abhängigkeiten.
- • Reference-Architecture-Sizing für Produktivlast und Multi-Node-HA-Betrieb von GitLab selbst – dafür verweisen wir auf die offizielle GitLab-Reference-Architecture-Dokumentation.
- • etcd-Backup/Restore und Cluster-Recovery des Kubernetes-Clusters selbst – Thema von Kubernetes Cluster-Recovery — etcd Backup & Restore.
- • Vertiefte Docker-Executor-Praxis – Thema von GitLab & Container-Registry selbst hosten mit Docker, hier nur als Abgrenzungsfolie zum Kubernetes-Executor.
- • GitOps-gesteuertes Deployment von GitLab selbst (ArgoCD/Flux auf diesen Helm-Chart angewendet) – Thema der GitOps-Module, z. B. Kubernetes GitOps — Deklaratives Deployment mit ArgoCD.
- • Chart-interne Templating-Vertiefung (eigene Subcharts schreiben, Go-Template-Debugging) – Thema von Helm — Paketmanagement für Kubernetes.
Bereit, das Modul zu buchen?
Wir passen die Hands-on-Übungen auf euren Erfahrungsstand und eure Zielumgebung an.
Academy Briefing anfragen