Hook‑Einleitung
Stellen Sie sich vor, Sie könnten Ihre gesamte Produktions‑Infrastruktur genauso einfach per git push aktualisieren, wie Sie einen Blog‑Post schreiben. In der Realität ist das jedoch selten so simpel – bis Sie FluxCD ins Spiel bringen. Viele Teams klammern sich noch an das altgediente kubectl apply und glauben, damit die Deployments zu steuern. Ich habe das selbst mehrfach versucht, nur um zu merken, dass diese Methode mehr Chaos als Ordnung bringt. In diesem Artikel zeige ich Ihnen, warum kubectl apply kein Deployment‑Prozess mehr sein sollte und wie FluxCD das GitOps‑Paradigma in die Praxis bringt.
Warum kubectl apply nicht reicht
Erklärung
kubectl apply – das Allheilmittel für Anfänger – führt bei jedem Aufruf ein Strategic Merge Patch aus. Das klingt zunächst nach Flexibilität, hat aber gravierende Nachteile:
- Keine Historie: Der Befehl schreibt keinen Commit, keine Versions‑ oder Auditreferenz, sodass Sie nie nachvollziehen können, wer wann was geändert hat.
-
Races und Drift: Bei mehreren Administratoren, die gleichzeitig
applyausführen, kann es zu Race‑Conditions kommen. Der Cluster‑Zustand kann vom gewünschten Zustand abweichen (Drift). - Manuelle Fehlerquellen: Typos, fehlende Ressourcen‑Definitionen oder falsche Namespace‑Angaben führen zu Deployment‑Fehlern, die erst zur Laufzeit bemerkt werden.
Beispiel
# Ein typischer manueller Deploy
kubectl apply -f deployment.yaml -n prod
Wenn Sie das jetzt auf 10 verschiedene Nodes ausführen, können Sie nie garantieren, dass alle Nodes den gleichen Zustand haben. Besonders in einem dynamischen Umfeld (Auto‑Scaling, Rolling‑Updates) wird das schnell zum Problem.
Persönliche Einschätzung
Ich habe in mehreren Projekten erlebt, dass Teams, die ausschließlich kubectl apply nutzten, bei Skalierung auf über 50 Services innerhalb von Wochen an ihre Grenzen stießen. Der Aufwand für Audits und das Nachverfolgen von Änderungen explodierte – und das bei Unternehmen, die überhaupt erst mit Kubernetes anfingen.
Grundlagen von FluxCD
Erklärung
FluxCD ist ein Operator für Kubernetes, der das gewünschte Zustandsmodell aus einem Git‑Repository ausliest und kontinuierlich mit dem Cluster synchronisiert. Kernprinzipien:
- Declarative: Alles, was Sie deployen wollen, liegt als YAML/Helm‑Chart im Repository.
- Immutable: Änderungen werden nur über git commits eingespielt, nicht per ad‑hoc CLI.
- Continuous Reconciliation: Der Operator prüft periodisch (standard 5 s) die Differenz zwischen Git und Cluster und korrigiert Abweichungen automatisch.
Beispiel – Installation von FluxCD
# 1. Installiere FluxCD via CLI (v2)
curl -s https://fluxcd.io/install.sh | sudo bash
# 2. Bootstrap eines Git‑Repos (GitHub Beispiel)
flux bootstrap github \
--owner=my-org \
--repository=prod-infra \
--branch=main \
--path=./clusters/prod
Der Befehl erstellt automatisch die nötigen CRDs, ServiceAccounts und legt das Repository‑Sync‑Objekt an. Ab jetzt ist jedes Commit ein Deploy.
Persönliche Einschätzung
Der größte Gewinn ist die Audit‑fähigkeit. In meinem letzten Projekt konnten wir rückwirkend zeigen, welcher Commit ein Sicherheits‑Patch ausgelöst hat – etwas, das mit kubectl apply praktisch unmöglich wäre.
Einrichtung eines GitOps‑Repos
Erklärung
Ein gutes GitOps‑Repo folgt einer klaren Struktur:
├─ clusters/
│ └─ prod/
│ ├─ kustomization.yaml
│ └─ base/
│ ├─ namespace.yaml
│ └─ deployment.yaml
├─ apps/
│ └─ nginx/
│ ├─ kustomization.yaml
│ └─ deployment.yaml
└─ flux-system/
└─ ... (automatisch erzeugt)
- clusters/ enthält Umgebungs‑spezifische Overlays.
- apps/ enthält wiederverwendbare Komponenten.
- kustomization.yaml definiert, welche Ressourcen zusammengeführt werden.
Beispiel – kustomization.yaml für Production
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../apps/nginx
namespace: prod
commonLabels:
environment: prod
Persönliche Einschätzung
Durch diese Trennung lassen sich Feature‑Branches für neue Services einführen, ohne die Produktions‑Umgebung zu gefährden. In meiner Praxis habe ich das Modell genutzt, um mehrere Teams gleichzeitig an unterschiedlichen Features arbeiten zu lassen – ohne dass einer das andere überschreiben konnte.
Praktisches Beispiel – Deploy einer Nginx‑App
Erklärung
Wir demonstrieren ein komplettes End‑to‑End‑Deployment mit FluxCD, von Code‑Commit bis laufender Service.
Beispiel – Schritt‑für‑Schritt
- Repository‑Struktur anlegen (lokal):
mkdir -p gitops/apps/nginx
cd gitops/apps/nginx
cat > deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
EOF
cat > kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
EOF
- Overlay für Production hinzufügen:
mkdir -p ../clusters/prod/base
cp -r * ../clusters/prod/base/
cat > ../clusters/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./base
namespace: prod
commonLabels:
app: nginx
EOF
- Commit & Push:
git init && git add . && git commit -m "Add nginx app"
git remote add origin git@github.com:my-org/prod-infra.git
git push -u origin main
FluxCD erkennt das neue Manifest – innerhalb von Sekunden erstellt Kubernetes den Deployment, den Service und das Ingress (falls konfiguriert).
Verifikation:
kubectl get deploy -n prod nginx -o wide
kubectl get pods -n prod -l app=nginx
Sie sehen drei Pods, die automatisch neu starten, falls ein Image‑Update veröffentlicht wird.
Persönliche Einschätzung
Der Unterschied zu einem manuellen kubectl apply ist enorm: Das einzige, was ich getan habe, war einen Commit. Die Wiederholbarkeit ist garantiert – kein „Ich‑hab‑es‑lokal‑getestet‑und‑es‑funktioniert“ mehr.
Bewertung und persönliche Einschätzung
Erklärung
FluxCD bringt drei wesentliche Vorteile gegenüber dem klassischen kubectl apply:
- Versionierung – jedes Deploy ist ein Git‑Commit.
- Self‑Healing – Drift wird automatisch korrigiert.
- Team‑Collaboration – Pull‑Requests ersetzen ad‑hoc CLI‑Aufrufe.
Beispiel – Audit‑Log aus Git
git log -p -S "replicas: 3" -- apps/nginx/deployment.yaml
Sie erhalten den kompletten Historien‑Eintrag, wer wann die Replica‑Zahl geändert hat. Das ist für Compliance (PCI‑DSS, ISO 27001) ein echter Game‑Changer.
Persönliche Einschätzung
Für Unternehmen mit mehr als fünf Services ist FluxCD keine „nice‑to‑have“, sondern ein Must‑have. Die Investition in die Initial‑Setup‑Zeit amortisiert sich innerhalb von Monaten durch reduzierte Incident‑Rates und klarere Verantwortlichkeiten.
Häufige Fehler und wie man sie vermeidet
-
Fehlende Namespace‑Definition – Ohne Namespace‑Deklaration landen Ressourcen im
default‑Namespace und verursachen Konflikte.-
Lösung: Setzen Sie
namespace:in jeder Kustomization oder nutzen Siekubectl create namespacevor dem Bootstrap.
-
Lösung: Setzen Sie
-
Ungezielte Image‑Tags – Das Verwenden von
latestführt zu nicht‑reproduzierbaren Deployments.-
Lösung: Taggen Sie Ihre Images mit SemVer oder SHA (
nginx@sha256:…).
-
Lösung: Taggen Sie Ihre Images mit SemVer oder SHA (
-
Zu häufige Reconciliation‑Intervalle – Das Standard‑Intervall von 5 s ist für kleine Cluster überdimensioniert und kann API‑Rate‑Limits erreichen.
-
Lösung: Passen Sie
spec.intervalimGitRepository‑Objekt an (z. B.--interval=1m).
-
Lösung: Passen Sie
-
Ignorieren von Helm‑Releases – Wenn Sie Helm-Charts benutzen, vergessen Sie nicht, das
HelmRelease‑CRD zu aktivieren.-
Lösung: Installieren Sie
flux install --components=source-controller,helm-controller.
-
Lösung: Installieren Sie
-
Keine Rollback‑Strategie – Nur weil FluxCD Änderungen automatisch ausrollt, heißt das nicht, dass Sie keinen Rollback planen müssen.
-
Lösung: Nutzen Sie
git revertodergit checkout <commit>und lassen Sie FluxCD den alten Stand wieder herstellen.
-
Lösung: Nutzen Sie
Fazit & konkreter nächster Schritt
FluxCD transformiert Ihre Deploy‑Pipeline von einem manuellen, fehleranfälligen Prozess zu einem reproduzierbaren, auditierbaren und selbstheilenden GitOps‑Workflow. Der zentrale Gedanke ist simpel: „Commit → Deploy“. Sobald Ihr Repository korrekt strukturiert ist, übernimmt FluxCD die kontinuierliche Synchronisation – Sie brauchen nur noch den Blick auf Ihre Pull‑Requests.
Ihr nächster Schritt
- Bootstrapen Sie FluxCD in einer Testumgebung (z. B. Minikube oder Kind).
- Legen Sie ein Minimal‑Repo an – ein einzelnes Nginx‑Deployment wie im Beispiel.
- Committen und beobachten Sie das automatische Deploy.
- Erweitern Sie das Repo um ein Service‑ und Ingress‑Objekt und prüfen Sie die Rollout‑Strategie.
- Implementieren Sie ein CI‑Pipeline (GitHub Actions) → Build → Push → Git‑Commit – und lassen Sie FluxCD das End‑Result übernehmen.
Damit schließen Sie die Lücke zwischen Entwicklung und Betrieb – und sagen endlich kubectl apply ade.
Hinweis: Für ein produktives Setup sollten Sie zusätzlich FluxCD‑SOPS für Secrets‑Verschlüsselung und Policy‑Engine (OPA/Gatekeeper) einsetzen, um Sicherheitsrichtlinien schon im Git‑Repo durchzusetzen.
Top comments (0)