Flux CD Flux CD

Deine erste Anwendung mit GitRepository und Kustomization deployen

Richte Flux mit einer Kustomization-Ressource auf Manifeste in Git aus und sieh dem Sync zu.

12 min Anfänger

Flux wird wie alles andere im Cluster mit Kubernetes-Ressourcen konfiguriert. Zwei davon erledigen den Großteil der Arbeit: Eine Source wie ein GitRepository sagt, wo die Konfiguration liegt, und eine Kustomization sagt „nimm die Manifeste unter diesem Pfad in dieser Source und halte sie auf diesem Cluster angewendet“. Diese Anleitung deployt eine kleine Anwendung und ändert dann Git, um den Sync zu beobachten. Sie setzt voraus, dass Flux gegen ein Repository fleet-infra gebootstrapt ist (siehe die vorherige Anleitung).

Die Manifeste vorbereiten

Füge in deinem fleet-infra-Clone neben dem von Bootstrap erzeugten Ordner clusters einen Anwendungsordner hinzu:

fleet-infra/
├── clusters/
│   └── dev/
│       ├── flux-system/        # von Bootstrap erzeugt
│       └── webapp.yaml         # die Flux-Kustomization (nächster Abschnitt)
└── apps/
    └── webapp/
        ├── namespace.yaml
        ├── deployment.yaml
        └── service.yaml

apps/webapp/namespace.yaml:

apiVersion: v1
kind: Namespace
metadata:
  name: webapp

apps/webapp/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  namespace: webapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
        - name: webapp
          image: nginx:1.25
          ports:
            - containerPort: 80

apps/webapp/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: webapp
  namespace: webapp
spec:
  selector:
    app: webapp
  ports:
    - port: 80
      targetPort: 80

Anders als bei manchen Werkzeugen nennen die Manifeste hier ihren Namespace explizit, und der Ordner enthält das Namespace-Objekt, damit Flux ihn erstellt. Eine kustomization.yaml ist nicht nötig: Wenn ein Ordner keine enthält, baut Flux eine Liste aller YAML-Dateien darin.

Die Flux-Kustomization schreiben

Bootstrap hat bereits ein GitRepository namens flux-system erstellt, das auf dasselbe Repository zeigt, du kannst es also wiederverwenden. clusters/dev/webapp.yaml:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: webapp
  namespace: flux-system
spec:
  interval: 10m
  sourceRef:
    kind: GitRepository
    name: flux-system
  path: ./apps/webapp
  prune: true
  wait: true
  timeout: 2m

Die wichtigen Teile:

  • sourceRef ist die Herkunft des Soll-Zustands. Hier ist es das flux-system-Repository, das Bootstrap eingerichtet hat.
  • path ist der Ordner in der Source, der angewendet wird.
  • interval gibt an, wie oft Flux die Manifeste erneut anwendet und Drift korrigiert, auch wenn sich Git nicht geändert hat.
  • prune: true bedeutet, dass Objekte, die aus Git entfernt wurden, auch aus dem Cluster entfernt werden. Es ist aus, wenn du es nicht setzt.
  • wait und timeout lassen Flux warten, bis die angewendeten Ressourcen bereit sind, bevor es Erfolg meldet.

Du kannst dieses YAML statt von Hand mit der CLI erzeugen:

flux create kustomization webapp \
  --source=GitRepository/flux-system \
  --path=./apps/webapp \
  --prune=true --wait=true --timeout=2m --interval=10m \
  --export > clusters/dev/webapp.yaml

Committen und Flux es aufgreifen lassen

git add -A
git commit -m "Add webapp"
git push

Die Kustomization flux-system beobachtet bereits ./clusters/dev und entdeckt die neue Kustomization webapp daher bei ihrem nächsten Lauf. Du führst nie kubectl apply für die Anwendung aus. Um das Warten zu überspringen, bitte Flux, sofort in Git nachzusehen:

flux reconcile source git flux-system
flux get kustomizations --watch

Das Deployment bestätigen

Die Kustomization webapp erscheint und wechselt zu Ready mit einer Nachricht, die die angewendete Revision nennt. Prüfe den Cluster und lass dir von Flux zeigen, was es besitzt:

kubectl get all -n webapp
flux tree kustomization webapp

Git ändern und den Sync beobachten

Bearbeite apps/webapp/deployment.yaml, ändere das Image auf nginx:1.26, committe und pushe. Flux holt Repositories im GitRepository-Intervall ab (nach Bootstrap standardmäßig eine Minute) und wendet die Änderung dann an. Ein neues ReplicaSet wird ausgerollt. Prüfe:

flux reconcile kustomization webapp --with-source
kubectl get deploy webapp -n webapp \
  -o jsonpath='{.spec.template.spec.containers[0].image}'; echo

Das ist der ganze Kreislauf: Git bearbeiten, Flux bringt den Cluster auf diesen Stand. Die nächste Anleitung behandelt, wie du dieses Verhalten steuerst.

Ein anderes Repository verwenden

Du musst Anwendungsmanifeste nicht im Bootstrap-Repository halten. Um aus einem anderen zu deployen, erstelle ein GitRepository dafür und verweise in der Kustomization darauf:

flux create source git webapp-config \
  --url=https://github.com/your-org/webapp-config \
  --branch=main --interval=1m \
  --export > clusters/dev/webapp-source.yaml

Für ein privates Repository füge Zugangsdaten mit flux create secret git hinzu und referenziere sie mit --secret-ref, oder nutze einen SSH Deploy Key. Setze dann sourceRef.name: webapp-config in der Kustomization.

Beliebte Anleitungen