Canary Deployment
Eine Deployment-Strategie, bei der neue Modellversionen zunächst nur einem kleinen Teil der Nutzer ausgeliefert werden, um Probleme früh zu erkennen.
Eine Deployment-Strategie mit zwei identischen Produktionsumgebungen – schneller Wechsel zwischen Versionen ohne Downtime und einfaches Rollback.
Blue-Green Deployment nutzt zwei identische Produktionsumgebungen. Eine ist live (Blue), die andere wird vorbereitet (Green). Bei einem Release wird der Traffic umgeschaltet – in Sekunden, ohne Downtime.
Der Ablauf:
Zustand 1: Blue ist live
┌─────────────┐ ┌─────────────┐
│ BLUE │ ←── │ Router │ ←── Traffic
│ v1.0 │ └─────────────┘
│ (live) │
└─────────────┘
┌─────────────┐
│ GREEN │ (idle)
│ v1.0 │
└─────────────┘
Zustand 2: Deploy auf Green
┌─────────────┐ ┌─────────────┐
│ BLUE │ ←── │ Router │ ←── Traffic
│ v1.0 │ └─────────────┘
│ (live) │
└─────────────┘
┌─────────────┐
│ GREEN │ ← Deploy v2.0, Tests
│ v2.0 │
└─────────────┘
Zustand 3: Switch zu Green
┌─────────────┐
│ BLUE │ (standby für Rollback)
│ v1.0 │
└─────────────┘
┌─────────────┐ ┌─────────────┐
│ GREEN │ ←── │ Router │ ←── Traffic
│ v2.0 │ └─────────────┘
│ (live) │
└─────────────┘
# Blue Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-blue
spec:
replicas: 3
selector:
matchLabels:
app: myapp
version: blue
template:
metadata:
labels:
app: myapp
version: blue
spec:
containers:
- name: app
image: myapp:1.0
---
# Green Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-green
spec:
replicas: 3
selector:
matchLabels:
app: myapp
version: green
template:
metadata:
labels:
app: myapp
version: green
spec:
containers:
- name: app
image: myapp:2.0
---
# Service (Switch durch Selector-Änderung)
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
version: blue # Ändern zu "green" für Switch
ports:
- port: 80
Switch durchführen:
kubectl patch service myapp -p '{"spec":{"selector":{"version":"green"}}}'
upstream blue {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
upstream green {
server 10.0.0.3:8080;
server 10.0.0.4:8080;
}
# Aktive Umgebung (ändern für Switch)
upstream active {
server 10.0.0.1:8080; # Blue
server 10.0.0.2:8080;
}
server {
location / {
proxy_pass http://active;
}
}
resource "aws_lb_listener_rule" "blue_green" {
listener_arn = aws_lb_listener.main.arn
priority = 100
action {
type = "forward"
target_group_arn = var.active_color == "blue" ?
aws_lb_target_group.blue.arn :
aws_lb_target_group.green.arn
}
condition {
path_pattern {
values = ["/*"]
}
}
}
# Switch: terraform apply -var="active_color=green"
| Strategie | Beschreibung | Komplexität |
|---|---|---|
| Shared DB | Beide Versionen nutzen dieselbe DB | Niedrig |
| Backward-Compatible Migrations | Neue Spalten optional, alte bleiben | Mittel |
| Expand-Contract | Erst erweitern, dann alte Spalten entfernen | Hoch |
| Separate DBs | Daten-Sync zwischen Blue und Green | Sehr hoch |
# Problem erkannt? Sofort zurück zu Blue:
kubectl patch service myapp -p '{"spec":{"selector":{"version":"blue"}}}'
# Oder mit AWS:
aws elbv2 modify-listener --listener-arn $ARN \
--default-actions Type=forward,TargetGroupArn=$BLUE_TG
Rollback in Sekunden – kein Re-Deployment nötig.
Blue-Green Deployment ist wie zwei identische Bühnen im Theater: Während auf der blauen Bühne die Show läuft, wird die grüne vorbereitet. Bei Showwechsel dreht sich die Bühne – das Publikum merkt nichts vom Umbau.
Zwei identische Produktionsumgebungen (Blue und Green)
Traffic-Switch in Sekunden, Zero Downtime
Sofortiges Rollback durch Zurückschalten
Zero-Downtime Releases
Neue Version deployen ohne Unterbrechung
Schnelles Rollback
Bei Problemen sofort zur alten Version zurück
Disaster Recovery
Zweite Umgebung als Backup
Sicherheit
Alte Version für Audits verfügbar halten
Blue-Green: 100% Traffic-Switch auf einmal. Canary: Gradueller Rollout (1% → 10% → 50% → 100%). Blue-Green ist schneller, Canary ist vorsichtiger.
Ja, aber nicht permanent. Green kann nach erfolgreichem Switch heruntergefahren oder für das nächste Release vorbereitet werden. Cloud macht das flexibel.
Bestehende Connections bleiben auf der alten Umgebung bis sie abgeschlossen sind (Connection Draining). Neue Requests gehen zur neuen Umgebung.
Schwierigster Teil! Backward-compatible Migrations, Feature Flags, oder kurze Maintenance-Fenster. Beide Versionen müssen mit dem DB-Schema arbeiten können.