Multi-Cluster mit Flux konfigurieren
Mehrere Cluster aus einem Repository verwalten, mit gemeinsamer Infrastruktur und Unterschieden pro Cluster.
Flux skaliert auf viele Cluster, indem in jedem Cluster ein Satz Controller läuft, die alle demselben Git-Repository an unterschiedlichen Pfaden folgen. Es gibt keinen zentralen Hub, bei dem man Cluster registrieren müsste. Diese Anleitung zeigt, wie du ein einzelnes Repository für Staging und Produktion aufbaust, jeden Cluster bootstrapst, Infrastruktur vor Anwendungen ordnest und wann du stattdessen ein Remote-Cluster-Setup nutzt.
Ein Repository, ein Pfad pro Cluster
Flux folgt einer einfachen Regel: Jeder Cluster wird gegen seinen eigenen Ordner unter clusters/ gebootstrapt. Ein Repository für zwei Cluster sieht so aus:
fleet-infra/
├── clusters/
│ ├── staging/
│ │ ├── flux-system/ # von Bootstrap erzeugt
│ │ ├── infrastructure.yaml
│ │ └── apps.yaml
│ └── production/
│ ├── flux-system/
│ ├── infrastructure.yaml
│ └── apps.yaml
├── infrastructure/
│ ├── base/ # gemeinsam: Ingress, cert-manager, Monitoring
│ ├── staging/
│ └── production/
└── apps/
├── base/
├── staging/
└── production/
Gemeinsame Definitionen liegen in base/-Ordnern, und jeder Umgebungsordner enthält das Kustomize-Overlay für das, was sich unterscheidet (siehe die Anleitung zu Overlays).
Jeden Cluster bootstrappen
Wechsle nacheinander den kubectl-Kontext auf jeden Cluster und bootstrappe gegen dasselbe Repository mit einem anderen Pfad:
kubectl config use-context staging
flux bootstrap github --owner=<user> --repository=fleet-infra \
--branch=main --path=clusters/staging --personal
kubectl config use-context production
flux bootstrap github --owner=<user> --repository=fleet-infra \
--branch=main --path=clusters/production --personal
Jeder Cluster hat nun seine eigene Flux-Installation und seinen eigenen flux-system-Ordner in Git. Einen dritten Cluster später hinzuzufügen ist ein weiterer Bootstrap-Befehl mit neuem Pfad.
Jeden Cluster auf seine eigenen Overlays ausrichten
clusters/production/apps.yaml wendet das Produktions-Overlay an:
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
interval: 10m
dependsOn:
- name: infrastructure
sourceRef:
kind: GitRepository
name: flux-system
path: ./apps/production
prune: true
wait: true
clusters/staging/apps.yaml ist identisch bis auf path: ./apps/staging. Die Kustomization infrastructure zeigt ebenso auf ./infrastructure/<env> und hat wait: true, sodass Anwendungen erst starten, wenn der Ingress-Controller, der Zertifikatsmanager und ähnliche Komponenten bereit sind. Das Feld dependsOn erzwingt diese Reihenfolge.
Über Cluster hinweg prüfen
Flux hat kein zentrales Dashboard, prüfe also jeden Cluster aus seinem eigenen Kontext:
flux get kustomizations --context staging
flux get kustomizations --context production
Beide sollten Ready zeigen. Vergleiche mit flux tree und flux get all -A, was laut Git deployt ist, mit dem, was jeder Cluster meldet. Für flottenweite Sichtbarkeit sammeln Teams oft Fluxs Prometheus-Metriken in Grafana.
Von Staging in die Produktion befördern
Weil beide Cluster dasselbe Repository lesen, ist Promotion ein Commit. Ein üblicher Ablauf ist:
- Ändere
apps/stagingund lass Flux es auf den Staging-Cluster anwenden. - Teste und prüfe.
- Mache dieselbe Änderung in
apps/productionin einem geprüften Pull Request, oder tagge ein Release, dem dieGitRepositoryder Produktion folgt (siehe die Anleitung zu Overlays).
Alternative: ein Steuer-Cluster, viele Remote-Cluster
Statt Flux in jedem Cluster zu betreiben, kannst du es an einer Stelle betreiben und seine Kustomizations und HelmReleases auf andere Cluster anwenden lassen. Setze spec.kubeConfig der Ressource auf ein Secret, das die kubeconfig des Remote-Clusters enthält:
spec:
kubeConfig:
secretRef:
name: production-kubeconfig
Das zentralisiert die Kontrolle, legt aber auch die Zugangsdaten jedes Clusters im Steuer-Cluster ab. Das unterscheidet sich vom üblichen Flux-Modell, bei dem Zugangsdaten nie einen Cluster verlassen und ein kompromittierter Cluster die anderen nicht erreichen kann. Bevorzuge eine Flux-Installation pro Cluster, sofern du keinen klaren Grund zur Zentralisierung hast, etwa leichtgewichtige Edge-Cluster. Gehst du diesen Weg, nutze statt langlebiger kubeconfigs Cloud Workload Identity, wo deine Plattform das unterstützt, und sieh dir den Flux Operator an, um Flotten im großen Maßstab zu verwalten.
Gute Gewohnheiten
- Halte den
flux-system-Ordner jedes Clusters aus gemeinsamen Overlays heraus. Bootstrap besitzt ihn. - Nutze
dependsOn, damit Infrastruktur, CRDs und Controller vor den Anwendungen installiert werden, die sie brauchen. - Gib jedem Cluster einen eigenen SOPS-Schlüssel (siehe die Anleitung zu Secrets), damit Staging die Secrets der Produktion nicht entschlüsseln kann.
- Upgrade Flux einen Cluster nach dem anderen, beginnend mit einem Nicht-Produktions-Cluster, indem du
flux bootstrapmit einer neueren CLI erneut ausführst.
Beliebte Anleitungen
-
Push vs. Pull: Wie Flux auf Kubernetes ausliefert Warum pull-basierte, Git-gesteuerte Auslieferung verändert, wie du Cluster deployst, absicherst und wiederherstellst. -
Deine erste Anwendung mit GitRepository und Kustomization deployen Richte Flux mit einer Kustomization-Ressource auf Manifeste in Git aus und sieh dem Sync zu. -
Sync-Verhalten steuern: Intervalle, Prune, Drift-Korrektur und Rollback Entscheide, wann Flux Änderungen anwendet, was es löscht, wie du es pausierst und wie du ein fehlerhaftes Deployment rückgängig machst. -
Image-Updates mit Flux Image Automation automatisieren Lass Flux neue Container-Image-Tags erkennen und in Git zurückcommitten. -
Flux CD vs. Argo CD: Ein GitOps-Werkzeug wählen Vergleiche Architektur, UI, Helm, Secrets, Mandantenfähigkeit und Image-Automatisierung, um das richtige Werkzeug zu wählen.