Zum Inhalt

Lab 06: Übungsaufgabe: GitOps mit Flux auf AKS

Erzeuge dir für diese Übung einen Cluster wie in Aufgabe 1 und setze dir Umgebungsvariablen wie dort beschrieben.

Hintergrund: Was ist GitOps?

GitOps ist ein Deployment-Paradigma, bei dem Git als Single Source of Truth für den gewünschten Cluster-Zustand dient. Ein GitOps-Operator (wie Flux) läuft im Cluster und überwacht das Git-Repository kontinuierlich:

┌─────────────────┐         ┌─────────────────┐         ┌─────────────────┐
│   Git Repo      │◄────────│     Flux        │────────►│   Kubernetes    │
│  (Helm Charts)  │  watch  │  (im Cluster)   │  sync   │    Cluster      │
└─────────────────┘         └─────────────────┘         └─────────────────┘
        ▲                                                       │
        │                     Drift Detection                   │
        └───────────────────────────────────────────────────────┘

Vorteile gegenüber Push-basierten Pipelines:

  • Deklarativ: Der gewünschte Zustand ist im Git definiert
  • Drift-Erkennung: Manuelle Änderungen im Cluster werden erkannt und korrigiert
  • Audit-Trail: Jede Änderung ist ein Git-Commit
  • Sicherheit: Keine externen Credentials für Cluster-Zugriff nötig
  • Rollback: Git-Revert = automatisches Rollback

Teil 1: Repository-Struktur anlegen

Flux erwartet eine bestimmte Struktur. Lege folgende Verzeichnisse an. Du kannst für den Inhalt des Verzeichnisses charts/nginx das bei der Helm-Übungsaufgabe erstellte Chart verwenden.

/
├── charts/
│   └── nginx/ # Dein Helm Chart
│       ├── Chart.yaml
│       ├── values.yaml
│       └── templates/
│           ├── deployment.yaml
│           └── service.yaml
└── releases/
    └── helmrelease.yaml

Erstelle die Datei releases/helmrelease.yaml mit folgendem Inhalt:

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: nginx
  namespace: flux-system
spec:
  interval: 1m
  releaseName: nginx
  driftDetection:
    mode: enabled

  chart:
    spec:
      chart: ./charts/nginx
      sourceRef:
        kind: GitRepository
        name: nginx
        namespace: flux-system
      interval: 1m

  targetNamespace: nginx

  install:
    createNamespace: true
    remediation:
      retries: 3

  upgrade:
    remediation:
      retries: 3

  values:
    containerPort: 80
    replicaCount: 1
    image:
      tag: "1.29"
    service:
      type: LoadBalancer

Commite und pushe danach die Änderungen:

git add .
git commit -m "feat: implement helmrelease for nginx"
git push origin main

Teil 2: Flux auf AKS aktivieren

Aufgabe 2.1: Azure CLI Extension installieren

Stelle sicher, dass die benötigte CLI-Extension installiert ist:

# Extension installieren/aktualisieren
az extension add --name k8s-configuration --upgrade

# Prüfen, ob die Extension verfügbar ist
az extension show --name k8s-configuration

Aufgabe 2.2: Kubernetes-Credentials abrufen

Verbinde dich mit deinem AKS-Cluster:

export RG="DEINE_RESOURCE_GROUP"
export CLUSTER_NAME="DEIN_AKS_CLUSTER"

az aks get-credentials \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME

# Verbindung testen
kubectl get nodes

Aufgabe 2.3: Flux-Extension aktivieren und Namespace einrichten

Aktiviere Flux als AKS-Extension und verbinde es mit deinem Git-Repository. Die URL des Git-Repositories und das Token erhältst du bei deinem Trainer.

kubectl create namespace nginx
az k8s-configuration flux create \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --cluster-type managedClusters \
  --name nginx \
  --namespace flux-system \
  --scope cluster \
  --url <DEINE-URL> \
  --branch main \
  --https-user "gitlab-group-token" \
  --https-key "<DEIN-GROUP-ACCESS-TOKEN>" \
  --kustomization name=releases path=./releases prune=true

Teil 3: Deployment verifizieren

Flux-Synchronisation prüfen

Warte ca. 1-2 Minuten, bis Flux die Änderungen erkennt:

# HelmReleases anzeigen
kubectl get helmreleases -A

# Status der HelmReleases prüfen
kubectl describe helmrelease nginx -n flux-system

Deployments prüfen

# Pods in beiden Namespaces prüfen
kubectl get pods -n nginx

# Services prüfen (für externe IPs)
kubectl get svc -n nginx

# Helm Releases prüfen
helm list -n nginx

GitOps in Aktion testen

Teste das GitOps-Prinzip, indem du eine Änderung im Git vornimmst:

  1. Ändere im HelmRelease den replicaCount von 1 auf 2
  2. Committe und pushe die Änderung
  3. Warte ca. 1 Minute
  4. Prüfe, ob nun 2 Pods im nginx-Namespace laufen:
kubectl get pods -n nginx -w

Teil 5: Drift-Erkennung testen

Manuelle Änderung im Cluster

Simuliere eine manuelle Änderung (Drift) im Cluster:

# Skaliere das Deployment manuell herunter
kubectl scale deployment nginx-nginx-deployment -n nginx --replicas=1

Drift-Korrektur beobachten

Flux erkennt die Abweichung und korrigiert sie automatisch:

# Beobachte, wie Flux die Pods wieder hochskaliert
kubectl get pods -n nginx -w

Nach kurzer Zeit sollten wieder 2 Pods laufen (entsprechend der Git-Konfiguration).