Von Code Sentinel, Technical Project Manager bei Java Fleet Systems Consulting

Schwierigkeit: 🟡 Mittel
Lesezeit: 30 Minuten
Voraussetzungen: Blue-Green Deployments (Teil 8), Docker Basics, Kubernetes Grundkenntnisse hilfreich


📚 Was bisher geschah – Enterprise CI/CD Mastery

Bereits veröffentlicht:

  • Teil 1-4: Foundations – Pipeline, Security Gates, Coverage, Quality
  • Teil 5-6: Container – Multi-Stage Builds, Security & SBOM
  • Teil 7: Registry Integration – Image-Management richtig
  • Teil 8 : Blue-Green Deployments – Zero Downtime Basics

Heute: Teil 9 – Canary Deployments & Kubernetes

Neu in der Serie? Kein Problem!

  • 🟢 Einsteiger? Teil 8 (Blue-Green) ist Voraussetzung – dort lernst du die Basics
  • 🟡 Erfahren? Du kannst hier einsteigen, wir bauen auf Blue-Green auf

⚡ Das Wichtigste in 30 Sekunden

Dein Problem: Blue-Green ist great, aber du willst die neue Version erst mit 5% der User testen, bevor alle sie bekommen.

Die Lösung: Canary Deployment – schrittweise Traffic-Verlagerung mit echtem User-Feedback.

Heute lernst du:

  • ✅ Was Canary Deployments sind und warum sie mächtiger als Blue-Green sind
  • ✅ Traffic-Splitting mit nginx und Kubernetes
  • ✅ Automatisches Rollback basierend auf Metriken
  • ✅ Production-Ready Canary Setup mit Argo Rollouts

Für wen ist dieser Artikel?

  • 🌱 Anfänger: Du lernst das Konzept und einfache Implementierung
  • 🌿 Erfahrene: Kubernetes-native Canary mit Metriken
  • 🌳 Profis: GitOps mit Argo Rollouts und automatische Analysis

Zeit-Investment: 30 Minuten Lesen + 1-2 Stunden Hands-on


👋 Code Sentinel: „Der Kanarienvogel im Bergwerk…“

Hey! 👋

Code Sentinel hier.

Weißt du, woher der Name „Canary Deployment“ kommt? Früher nahmen Bergarbeiter Kanarienvögel mit in die Mine. Wenn der Vogel aufhörte zu singen, war Gas in der Luft – Zeit zu fliehen.

Bei Canary Deployments ist deine neue Version der Kanarienvogel. Du gibst ihr ein bisschen Traffic und beobachtest. Singt sie fröhlich? Mehr Traffic! Fällt sie um? Rollback!

Real talk: Das ist mein Lieblings-Deployment-Pattern. Warum? Weil du echte User-Daten bekommst, bevor du all-in gehst. Und als jemand, der gelernt hat, dass Kontrolle manchmal loslassen bedeutet… 😉 Canary ist der perfekte Kompromiss.

Lass uns das gemeinsam angehen! 🚀


🟢 GRUNDLAGEN

Was ist ein Canary Deployment?

Blue-Green ist ein Schalter: KLICK – 100% Traffic auf die neue Version.

Canary ist ein Dimmer: Langsam von 0% auf 100% hochdrehen.

💡 Neu hier? Was ist Traffic Split?

Traffic Split bedeutet, dass der Load Balancer Anfragen prozentual aufteilt. Bei 95/5 Split gehen 95 von 100 Anfragen zur alten Version, 5 zur neuen.

Warum? Du testest die neue Version mit echten Usern, aber limitierst das Risiko.

Warum Canary statt Blue-Green?

SzenarioBlue-GreenCanary
„Funktioniert der Code?“✅ Tests vor Switch✅ Tests vor Traffic
„Wie reagieren echte User?“❌ Erst nach 100% Switch✅ Schon bei 5%
„Performance unter Last?“❌ Erst nach 100% Switch✅ Schrittweise messen
„Rollback bei Problemen“✅ Schnell (2 Sek)✅ Noch schneller (nur 5% betroffen)

Der große Vorteil: Bei Canary merkst du Probleme, wenn nur 5% betroffen sind – nicht 100%.

Dein erstes Canary Setup (nginx)

Wir erweitern das Blue-Green Setup aus Teil 8:

# nginx.conf - Canary mit Weight-based Routing
upstream backend {
    # Stable: 95% des Traffics
    server stable:8080 weight=95;
    
    # Canary: 5% des Traffics
    server canary:8080 weight=5;
}

server {
    listen 80;
    
    location / {
        proxy_pass http://backend;
        
        # Header zeigt, welche Version geantwortet hat
        add_header X-Served-By $upstream_addr;
    }
}

Was macht dieser Code?

ZeileErklärung
weight=9595 von 100 Requests gehen zu Stable
weight=55 von 100 Requests gehen zu Canary
X-Served-ByHeader für Debugging – zeigt welcher Server geantwortet hat

Traffic schrittweise erhöhen:

# Phase 1: 5% Canary
upstream backend {
    server stable:8080 weight=95;
    server canary:8080 weight=5;
}

# Phase 2: 25% Canary (wenn Phase 1 gut war)
upstream backend {
    server stable:8080 weight=75;
    server canary:8080 weight=25;
}

# Phase 3: 50% Canary
upstream backend {
    server stable:8080 weight=50;
    server canary:8080 weight=50;
}

# Phase 4: 100% Canary → Canary wird neues Stable
upstream backend {
    server canary:8080 weight=100;
}

💡 Du kennst die Basics schon? → Spring direkt zu PROFESSIONALS


🟡 PROFESSIONALS

Canary mit Kubernetes

In Kubernetes wird Canary eleganter – mit Labels und Service Selectors:

# stable-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-stable
spec:
  replicas: 9  # 90% der Pods
  selector:
    matchLabels:
      app: myapp
      version: stable
  template:
    metadata:
      labels:
        app: myapp
        version: stable
    spec:
      containers:
      - name: myapp
        image: myapp:1.0.0
        ports:
        - containerPort: 8080
---
# canary-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-canary
spec:
  replicas: 1  # 10% der Pods
  selector:
    matchLabels:
      app: myapp
      version: canary
  template:
    metadata:
      labels:
        app: myapp
        version: canary
    spec:
      containers:
      - name: myapp
        image: myapp:1.1.0
        ports:
        - containerPort: 8080
---
# service.yaml - Routet zu BEIDEN Deployments!
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp  # Matcht stable UND canary!
  ports:
  - port: 80
    targetPort: 8080

Der Trick: Der Service selektiert nach app: myapp – das matcht BEIDE Deployments. Kubernetes verteilt automatisch nach Replica-Count.

Traffic-Prozent ändern:

# 10% Canary (1 von 10 Pods)
kubectl scale deployment myapp-stable --replicas=9
kubectl scale deployment myapp-canary --replicas=1

# 30% Canary (3 von 10 Pods)
kubectl scale deployment myapp-stable --replicas=7
kubectl scale deployment myapp-canary --replicas=3

# 50% Canary
kubectl scale deployment myapp-stable --replicas=5
kubectl scale deployment myapp-canary --replicas=5

# 100% Canary → Rollout complete
kubectl scale deployment myapp-stable --replicas=0
kubectl scale deployment myapp-canary --replicas=10

Automatisches Rollback mit Metriken

Das manuelle Skalieren ist okay zum Lernen, aber in Production willst du Automatisierung:

# canary-analysis.yaml (Konzept - Details in BONUS)
apiVersion: monitoring/v1
kind: CanaryAnalysis
metadata:
  name: myapp-canary-check
spec:
  # Wann analysieren?
  interval: 60s
  
  # Wie lange beobachten?
  duration: 10m
  
  # Erfolgskriterien
  metrics:
  - name: error-rate
    threshold: 1%      # Max 1% Fehler
    
  - name: latency-p99
    threshold: 500ms   # Max 500ms für 99% der Requests
    
  - name: success-rate
    threshold: 99%     # Min 99% erfolgreiche Requests
  
  # Was tun bei Failure?
  onFailure:
    action: rollback
    notify:
      - slack: #deployments
      - email: ops@company.com

Stolperfallen vermeiden

❌ Fehler #1: Canary ohne Monitoring

# SCHLECHT - blind hoffen
kubectl scale deployment myapp-canary --replicas=5
sleep 300
kubectl scale deployment myapp-canary --replicas=10
# Keine Ahnung ob es funktioniert 💥

✅ Besser:

# GUT - Metriken beobachten
kubectl scale deployment myapp-canary --replicas=1

# Warte und prüfe Error Rate
error_rate=$(curl -s prometheus:9090/api/v1/query?query=error_rate | jq '.data.result[0].value[1]')
if (( $(echo "$error_rate > 0.01" | bc -l) )); then
    echo "❌ Error rate too high: $error_rate"
    kubectl scale deployment myapp-canary --replicas=0
    exit 1
fi

echo "✅ Error rate OK: $error_rate"
kubectl scale deployment myapp-canary --replicas=3

❌ Fehler #2: Zu schnelles Hochskalieren

# SCHLECHT - zu schnell
kubectl scale deployment myapp-canary --replicas=1
sleep 60
kubectl scale deployment myapp-canary --replicas=10  # 💥 0 auf 100 in 1 Minute

✅ Besser:

# GUT - schrittweise mit Pausen
for replicas in 1 3 5 7 10; do
    kubectl scale deployment myapp-canary --replicas=$replicas
    echo "⏳ Waiting 5 minutes at $replicas replicas..."
    sleep 300
    
    # Check metrics
    if ! check_metrics; then
        echo "❌ Metrics failed at $replicas replicas"
        kubectl scale deployment myapp-canary --replicas=0
        exit 1
    fi
done

❌ Fehler #3: Sticky Sessions ignorieren

Wenn User an eine bestimmte Version „kleben“, verfälscht das deine Metriken:

# Problem: User A bekommt IMMER Canary
upstream backend {
    ip_hash;  # ← Sticky! Nicht gut für Canary
    server stable:8080 weight=95;
    server canary:8080 weight=5;
}

# Lösung: Kein ip_hash, dafür Session-Store teilen
upstream backend {
    # Kein ip_hash - jeder Request wird neu geroutet
    server stable:8080 weight=95;
    server canary:8080 weight=5;
}

💡 Du willst mehr? → Im BONUS findest du Argo Rollouts und GitOps


🔵 BONUS

Argo Rollouts – GitOps Canary

Argo Rollouts ist der Goldstandard für Canary in Kubernetes:

# rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: myapp
spec:
  replicas: 10
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.1.0
        ports:
        - containerPort: 8080
  strategy:
    canary:
      # Schrittweise Traffic-Erhöhung
      steps:
      - setWeight: 5
      - pause: {duration: 5m}
      
      - setWeight: 25
      - pause: {duration: 5m}
      
      - setWeight: 50
      - pause: {duration: 5m}
      
      - setWeight: 75
      - pause: {duration: 5m}
      
      # Automatische Metriken-Analyse
      - analysis:
          templates:
          - templateName: success-rate
          args:
          - name: service-name
            value: myapp
      
      - setWeight: 100
      
      # Traffic Management mit Istio
      trafficRouting:
        istio:
          virtualService:
            name: myapp-vsvc
          destinationRule:
            name: myapp-destrule
            canarySubsetName: canary
            stableSubsetName: stable

AnalysisTemplate für automatische Entscheidungen:

# analysis-template.yaml
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  args:
  - name: service-name
  metrics:
  - name: success-rate
    interval: 1m
    count: 5
    successCondition: result[0] >= 0.99
    failureLimit: 3
    provider:
      prometheus:
        address: http://prometheus:9090
        query: |
          sum(rate(
            http_requests_total{
              service="{{args.service-name}}",
              status=~"2.."
            }[5m]
          )) / sum(rate(
            http_requests_total{
              service="{{args.service-name}}"
            }[5m]
          ))

Header-basiertes Routing für Testing

Manchmal willst du die Canary-Version gezielt testen:

# istio-virtualservice.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
  - myapp
  http:
  # QA Team bekommt IMMER Canary
  - match:
    - headers:
        x-canary:
          exact: "true"
    route:
    - destination:
        host: myapp
        subset: canary
  
  # Normaler Traffic: Weight-based
  - route:
    - destination:
        host: myapp
        subset: stable
      weight: 95
    - destination:
        host: myapp
        subset: canary
      weight: 5

Testen mit Header:

# Normal: 95% Chance auf Stable
curl http://myapp/api/health

# QA: Garantiert Canary
curl -H "x-canary: true" http://myapp/api/health

Performance-Vergleich: Deployment-Strategien

StrategieRollback-ZeitRisk ExposureKomplexitätResource-Overhead
Recreate5-15 Min100%Niedrig
Rolling2-5 MinVariable⭐⭐Niedrig
Blue-Green2-5 Sek100% (aber instant rollback)⭐⭐⭐2x Ressourcen
Canary2-5 Sek5-50% (kontrolliert)⭐⭐⭐⭐1.1-2x Ressourcen

💡 Praxis-Tipps

Für Einsteiger 🌱

  1. Starte mit nginx: Bevor du Kubernetes und Argo Rollouts lernst, verstehe das Konzept mit einfachem nginx Weight-Routing.
  2. Definiere „Erfolg“: Was bedeutet „die Canary-Version funktioniert“? Error Rate < 1%? Latency < 500ms? Schreib es auf, BEVOR du startest.

Für den Alltag 🌿

  1. Mindestens 5 Minuten pro Phase: Dein Monitoring braucht Zeit, um aussagekräftige Daten zu sammeln. 1 Minute ist zu kurz.
  2. Alerting VOR Automatisierung: Erst manuell mit Alerts, dann automatisieren. Du musst verstehen, was schiefgehen kann.

Für Profis 🌳

  1. Segment-basiertes Canary: Statt random 5% – schick erst interne User, dann Beta-User, dann alle.
  2. A/B Testing kombinieren: Canary für technische Stabilität, A/B für Feature-Validierung. Nicht vermischen!

🛠️ Tools & Extensions

Für Einsteiger 🌱

ToolWarum?Link
nginxSimples Weight-Routingnginx.org
Docker ComposeLokales Testingdocs.docker.com

Für den Alltag 🌿

ToolWarum?Link
KubernetesContainer Orchestrationkubernetes.io
PrometheusMetriken sammelnprometheus.io
GrafanaMetriken visualisierengrafana.com

Für Profis 🌳

ToolWarum?Link
Argo RolloutsGitOps Canaryargoproj.github.io
IstioService Mesh mit Traffic Controlistio.io
FlaggerAutomated Canary mit Istio/Linkerdflagger.app

❓ FAQ (Häufige Fragen)

Frage 1: Wann Canary vs Blue-Green?

Antwort: Blue-Green für schnelles Switching ohne Metriken-Overhead. Canary wenn du echte User-Daten brauchst oder das Risiko minimieren willst. In der Praxis: Starte mit Blue-Green, upgrade zu Canary wenn du Monitoring hast.

Frage 2: Wie klein kann der Canary-Traffic sein?

Antwort: Technisch 1 Request. Praktisch brauchst du genug Traffic für statistische Signifikanz. Bei 1000 Requests/Minute sind 1% (10 Requests/Minute) oft zu wenig. 5% ist ein guter Start.

Frage 3: Was ist der Unterschied zwischen Canary und A/B Testing?

Antwort: Canary testet technische Stabilität (Fehler, Performance). A/B Testing testet User-Verhalten (Conversion, Engagement). Canary ist DevOps, A/B ist Product. Beides kann parallel laufen.

Frage 4: Brauche ich Kubernetes für Canary?

Antwort: Nein! nginx mit Weight-Routing funktioniert super. Kubernetes macht es eleganter und skalierbarer, ist aber nicht Pflicht. Starte einfach, upgrade wenn nötig.

Frage 5: Was wenn die Canary-Version Daten schreibt?

Antwort: Gute Frage! Datenbank-Änderungen sind permanent – auch wenn du Canary rollbackst. Lösung: Feature Flags für schreibende Features, Canary nur für lesende Operationen, oder Expand-Contract Pattern (siehe Teil 8).

Frage 6: Wie automatisiere ich den Rollback?

Antwort: Definiere Schwellwerte (Error Rate > 1%, Latency > 500ms). Wenn überschritten: automatisch Traffic auf 0% setzen. Argo Rollouts und Flagger machen das out-of-the-box.

Frage 7: Wie balancierst du Kontrolle und Loslassen beim Deployment? 🤔

Antwort: lächelt Früher wollte ich ALLES kontrollieren. Jede Metrik, jede Phase, jedes Detail. Heute? Ich definiere klare Grenzen und lasse die Automatisierung arbeiten. Das hat mir jemand beigebracht – dass Vertrauen manchmal mehr wert ist als Kontrolle. Aber das gehört zu private logs. 📝

Frage 8: Kann ich Canary für Datenbank-Migrationen nutzen?

Antwort: Vorsicht! DB-Migrationen sollten Blue-Green-kompatibel sein (beide Versionen müssen mit dem Schema arbeiten). Canary ersetzt das nicht. Nutze Expand-Contract aus Teil 8.


📖 Enterprise CI/CD Mastery – Alle Teile

Für Einsteiger empfohlen: Starte bei Teil 1! ⭐

TeilThemaLevelStatus
1Erste Pipeline🟢✅ Veröffentlicht
2Security Gates (OWASP + Trivy)🟢✅ Veröffentlicht
3Coverage Gates (JaCoCo)🟢✅ Veröffentlicht
4Quality Gates (SonarQube)🟡✅ Veröffentlicht
5Multi-Stage Builds🟡✅ Veröffentlicht
6Container Security (SBOM)🟡✅ Veröffentlicht
7Registry Integration🟡✅ Veröffentlicht
8Blue-Green Deployments🟡✅ Veröffentlicht
→ 9Canary & Kubernetes🟡📍 Du bist hier!
10GitOps & Environments🔴📅 19.12.2025
11Jenkins Enterprise🔴📅 Coming Soon
12Multi-Platform & Finale🔴📅 Coming Soon

💬 Real Talk: Der Canary fliegt

Java Fleet Büro, Freitag 15:00 Uhr. Deployment-Fenster.


Nova: „Okay, Canary ist bei 5%. Ich bin nervös.“

Code Sentinel: „Schau auf die Metriken. Error Rate?“

Nova: „0.2%. Normal ist 0.15%.“

Kofi: „Ist das schlimm?“

Code Sentinel: „Nope. Das ist statistisches Rauschen bei so wenig Traffic. Warte noch 3 Minuten.“

3 Minuten später

Nova: „0.14%! Sogar besser als Stable!“

Code Sentinel: „Siehst du? Der Kanarienvogel singt. Geh auf 25%.“

Elyndra: „Ich muss sagen, mir gefällt dieser entspannte Code. Früher hättest du bei 0.2% Error Rate den Alarm ausgelöst.“

Code Sentinel: schmunzelt „Früher hätte ich auch keinen Canary gemacht. 100% oder nichts. Aber manchmal ist schrittweise besser als perfekt sofort.“

Kat: tippt auf ihrem Laptop „Die Latency auf Canary ist sogar 20ms niedriger. Die neue Version ist schneller!“

Nova: „Sollen wir direkt auf 100% gehen?“

Code Sentinel: „Nein. 25%, dann 50%, dann 100%. Geduld. Der Kanarienvogel hat uns gute Nachrichten gebracht – jetzt lassen wir ihn noch ein bisschen singen.“

Franz-Martin: kommt vorbei „Sieht gut aus. Code, du wirkst… gelassen.“

Code Sentinel: „Hab gelernt, dass gute Systeme Vertrauen verdienen. Und gute Menschen auch.“ 😉

Kat: flüstert zu Nova „Ich schwöre, er wird rot.“


🎁 Cheat Sheet

🟢 Basics (Zum Nachschlagen)

# Canary Konzept
STABLE = Aktuelle Production (90-95%)
CANARY = Neue Version (5-10%)
PROMOTE = Canary wird neues Stable
ROLLBACK = Canary Traffic auf 0%

# nginx Weight-based Routing
upstream backend {
    server stable:8080 weight=95;
    server canary:8080 weight=5;
}

🟡 Patterns (Für den Alltag)

# Kubernetes: Traffic über Replica-Count
kubectl scale deployment myapp-stable --replicas=9
kubectl scale deployment myapp-canary --replicas=1
# = 10% Canary

# Traffic erhöhen
kubectl scale deployment myapp-canary --replicas=3
# = 30% Canary (3 von 10 Pods)

🔵 Advanced (Für Profis)

# Argo Rollouts - automatisches Canary
strategy:
  canary:
    steps:
    - setWeight: 5
    - pause: {duration: 5m}
    - analysis:
        templates:
        - templateName: success-rate
    - setWeight: 50
    - pause: {duration: 10m}
    - setWeight: 100

🎨 Challenge für dich!

Wähle dein Level:

🟢 Level 1 – Einsteiger

  • [ ] Erweitere dein Blue-Green Setup aus Teil 8 zu Canary
  • [ ] Implementiere nginx Weight-Routing
  • [ ] Mache einen manuellen Traffic-Shift von 5% auf 100%

Geschätzte Zeit: 30-45 Minuten

🟡 Level 2 – Fortgeschritten

  • [ ] Deploye das Canary-Setup auf Kubernetes
  • [ ] Implementiere Health-Check basiertes Scaling
  • [ ] Baue ein Bash-Script für schrittweises Promotion

Geschätzte Zeit: 1-2 Stunden

🔵 Level 3 – Profi

  • [ ] Installiere Argo Rollouts
  • [ ] Implementiere Prometheus-basierte Analysis
  • [ ] Baue automatischen Rollback bei hoher Error Rate

Geschätzte Zeit: 3-4 Stunden

Teile dein Ergebnis! 🎉


📦 Downloads

Alle Code-Beispiele zum Herunterladen:

ProjektFür wen?Download
canary-nginx-basic.zip🟢 Einsteiger⬇️ Download
canary-kubernetes.zip🟡 Alle Levels⬇️ Download
canary-argo-rollouts.zip🔵 Profis⬇️ Download

Quick Start:

# Option 1: Lokales nginx Setup
unzip canary-nginx-basic.zip
cd canary-nginx-basic
docker-compose up -d

# Option 2: Kubernetes
unzip canary-kubernetes.zip
cd canary-kubernetes
kubectl apply -f .

Probleme? → Troubleshooting-Guide | → FAQ


🔗 Weiterführende Links

📚 Für Einsteiger

RessourceBeschreibung
Kubernetes BasicsOffizieller Einstieg
nginx Load BalancingWeight-based Routing verstehen

🛠️ Tools & Extensions

ToolBeschreibung
Argo RolloutsProgressive Delivery für K8s
FlaggerAutomated Canary mit Service Mesh

📖 Für Fortgeschrittene

RessourceBeschreibung
Canary Release (Martin Fowler)Der Klassiker
Progressive Delivery (RedHat)Enterprise-Perspektive

🔧 Offizielle Dokumentation


💬 Geschafft! 🎉

Was du heute gelernt hast:

✅ Canary Deployment Konzept vs Blue-Green verstanden ✅ Traffic-Splitting mit nginx und Kubernetes ✅ Metriken-basierte Entscheidungen ✅ Argo Rollouts für automatisiertes Canary

Egal ob du heute zum ersten Mal davon gehört hast oder dein Wissen vertieft hast – du hast etwas Neues gelernt. Das zählt!

Fragen? Schreib mir:

  • Code Sentinel: code.sentinel@java-developer.online

Nächster Teil: GitOps & Environments – Deine Infrastruktur als Code 🚀

Keep deploying, keep learning! 💚


Tags: #CICD #Canary #Kubernetes #Deployment #ArgoRollouts #DevOps #ProgressiveDelivery

© 2025 Java Fleet Systems Consulting | java-developer.online

Autor

  • Code Sentinel

    32 Jahre alt, Technical Project Manager und Security-Experte bei Java Fleet Systems Consulting. Code ist ein erfahrener Entwickler, der in die Projektleitung aufgestiegen ist, aber immer noch tief in der Technik verwurzelt bleibt. Seine Mission: Sicherstellen, dass Projekte termingerecht, sicher und wartbar geliefert werden.