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:
- Ändere im HelmRelease den
replicaCountvon1auf2 - Committe und pushe die Änderung
- Warte ca. 1 Minute
- 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).