WZ-IT unterstützt Sie mit dem passenden Angebot: Docker Compose zu Kubernetes migrieren mit Kompose.
Kompose kann eine Compose-Datei in Kubernetes-Ressourcen übersetzen. Damit entsteht ein Ausgangspunkt, keine abgenommene Produktionsumgebung (Kubernetes-Anleitung). Entscheidend bleiben Daten, Abhängigkeiten und der kontrollierte Wechsel des Traffics. Dieser Artikel führt an einem Beispiel mit Webanwendung und PostgreSQL durch Erfassung, Konvertierung, Nachbearbeitung der Manifeste, Datenübernahme und Umschaltung. Stand: Oktober 2026.
Inhaltsverzeichnis
- 1. Anwendung und Zielcluster erfassen
- 2. Kompose ausführen und Manifeste überarbeiten
- 3. Daten und Secrets getrennt migrieren
- 4. Abnehmen und kontrolliert umschalten
- Wann Kompose nicht passt
1. Anwendung und Zielcluster erfassen
Erfassen Sie Images, Ports, Umgebungsvariablen, Volumes und externe Dienste. Prüfen Sie zuerst, ob Kubernetes statt Compose oder Coolify zum Betrieb passt. Voraussetzung für diesen Ablauf: erreichbarer Zielcluster, passender kubectl-Kontext, Namespace und ein dokumentierter Rückweg zur bisherigen Umgebung.
Als Beispiel dient diese compose.yaml mit einer Webanwendung und einer Datenbank (Image-Namen und Werte sind Platzhalter):
services:
web:
image: registry.example.com/shop:1.4.2
ports:
- "8080:8080"
environment:
DB_HOST: db
DB_NAME: shop
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_DB: shop
POSTGRES_USER: shop
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
| Compose-Bestand | Im Kubernetes-Ziel prüfen |
|---|---|
| Ports | Service und gegebenenfalls externer Zugang (Ingress) |
| Volumes | PVC, StorageClass, Zugriffsmodus und Datenübernahme |
| environment und env_file | ConfigMap oder Secret nach Inhalt |
| depends_on | Wiederholungslogik und Bereitschaft der Anwendung |
| Lokaler Image-Build | Veröffentlichbares Image und Registry-Zugriff |
| Secrets-Dateien | Kubernetes-Secret, getrennt von den Manifesten |
Die Kompose-Konversionsmatrix dokumentiert unterstützte und nicht unterstützte Compose-Felder. Eine semantische Eins-zu-eins-Übertragung ist nicht vorauszusetzen.
2. Kompose ausführen und Manifeste überarbeiten
Installieren Sie Kompose nach der offiziellen Installationsanleitung. Arbeiten Sie auf einer Kopie ohne produktive Zugangsdaten:
mkdir k8s-output
kompose convert -f compose.yaml -o k8s-output/
Kompose erzeugt je Service ein Deployment, je veröffentlichtem Port einen Service und je Volume eine PersistentVolumeClaim. Bei Volumes setzt es die Strategie Recreate. Unterstriche in Servicenamen werden zu Bindestrichen, weil Kubernetes sie nicht akzeptiert. Die Kompose-Anleitung nennt Optionen, die das Ergebnis steuern:
| Option | Wirkung |
|---|---|
--controller statefulset |
StatefulSet oder DaemonSet statt Deployment |
--volumes |
Volume-Typ: persistentVolumeClaim, emptyDir, hostPath oder configMap |
--build, --push-image |
Image bauen und in eine Registry übertragen |
-f mehrfach |
Mehrere Compose-Dateien zusammenführen |
Label kompose.service.expose |
Ingress mit Domain erzeugen |
Label kompose.service.type |
Service-Typ (nodeport, clusterip, loadbalancer, headless) |
Label kompose.volume.size |
Größe der PVC, etwa 10Gi |
Lesen Sie jede Warnung und jedes erzeugte Objekt. Für das Beispiel sind mindestens diese Anpassungen nötig:
- Datenbank als StatefulSet führen oder bewusst als Deployment mit einer Replik belassen und dokumentieren.
- Ressourcen setzen:
requestsundlimitsfür CPU und Speicher je Container. - Probes ergänzen: Liveness-, Readiness- und Startup-Probes. Readiness steuert die Bereitschaft für Traffic; eine ungeeignete Liveness-Prüfung kann Neustarts verursachen.
- Zugangsdaten aus Secrets beziehen statt aus Klartext-Variablen im Manifest.
- Ingress ergänzen, wenn die Anwendung extern erreichbar sein soll.
Beispiel für Probes am Webcontainer:
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 20
Ein erfolgreich konvertiertes YAML beweist keine erreichbare Anwendung.
3. Daten und Secrets getrennt migrieren
Ein PVC überträgt keine vorhandenen Daten. Wählen Sie ein zum Datenbanksystem passendes Sicherungs- und Wiederherstellungsverfahren, prüfen Sie die Zielversion und planen Sie eine Schreibsperre oder ausdrücklich unterstützte Replikation. Bestätigen Sie den Wiederherstellungsweg vor der Umschaltung (Persistent Volumes).
Für das PostgreSQL-Beispiel, bei gestoppter Anwendung und gleicher Hauptversion:
# Auf dem Compose-Host: Dump im Custom-Format
docker compose exec -T db pg_dump -U shop -Fc shop > shop.dump
# In den Datenbank-Pod kopieren und wiederherstellen
kubectl -n migration-check cp shop.dump db-0:/tmp/shop.dump
kubectl -n migration-check exec db-0 -- pg_restore -U shop -d shop --clean --if-exists /tmp/shop.dump
Danach Zeilenzahlen wichtiger Tabellen und einen Anwendungstest gegen Quelle und Ziel vergleichen.
Kubernetes-Secrets sind keine automatische Verschlüsselungslösung: Base64-Kodierung schützt keine Zugangsdaten. Prüfen Sie Verschlüsselung im Ruhezustand und minimale Zugriffsrechte (Secrets). Legen Sie echte Werte nicht in das Beispielverzeichnis oder in Git. Ein Secret aus einer lokalen Datei, die nicht versioniert wird:
kubectl -n migration-check create secret generic db-credentials --from-env-file=.env.k8s
4. Abnehmen und kontrolliert umschalten
Prüfen Sie vor jeder Anwendung den aktuellen Kontext. Ersetzen Sie migration-check durch den vorgesehenen, bereits angelegten Test-Namespace. Die serverseitige Trockenprüfung ändert keine Ressourcen; das anschließende Apply schon (kubectl apply).
kubectl config current-context
kubectl apply --dry-run=server -n migration-check -f k8s-output/
# Erst nach Review im vorgesehenen Test-Namespace anwenden:
kubectl apply -n migration-check -f k8s-output/
kubectl get pods,svc,pvc -n migration-check
kubectl rollout status deployment/web -n migration-check
Nehmen Sie Anmeldung, Schreib- und Lesevorgänge, Neustart, Persistenz und Backup-Restore ab. Dokumentieren Sie Umschaltpunkt und Abbruchkriterien:
| Schritt | Prüfung |
|---|---|
| Vor der Umschaltung | DNS-TTL gesenkt, Schreibsperre am alten System, letzter Dump übernommen |
| Umschaltung | DNS oder Load Balancer auf das neue System, Anwendungstest sofort danach |
| Beobachtung | Fehlerrate, Probes, Speicherverbrauch, Datenbankverbindungen |
| Rückweg | Altes System unverändert halten, bis neue Schreibzugriffe abgesichert sind |
Nach Schreibzugriffen auf dem neuen System ist Rückkehr nicht nur eine DNS-Änderung: Datenstände müssen zusammenpassen. WZ-IT ordnet diesen Weg in die Anwendungsmodernisierung ein.
Wann Kompose nicht passt
Kompose ist ein Übersetzer, keine Plattformentscheidung. Prüfen Sie Alternativen, wenn die Compose-Datei viele nicht unterstützte Felder nutzt, Builds im Compose-Kontext hängen, mehrere Umgebungen mit Varianten gepflegt werden müssen (dann Helm oder Kustomize) oder wenn die Anwendung ohne Kubernetes-Funktionen wie Skalierung und Rollouts auskommt. In dem Fall bleibt Compose oder Coolify die einfachere Wahl, und die Frage, ob Sie Kubernetes überhaupt brauchen, beantwortet Brauchen wir Kubernetes?.
Weiterlesen
Zum passenden Angebot: Docker Compose zu Kubernetes migrieren mit Kompose.










