Deployment-Strategien definieren systematische Ansätze für Anwendungsbereitstellung und -aktualisierung in OpenShift-Umgebungen, wobei verschiedene Trade-offs zwischen Verfügbarkeit, Risiko, Ressourcenverbrauch und Update-Geschwindigkeit balanciert werden. Diese strategischen Frameworks ermöglichen organisationsspezifische Optimierung von Change Management-Prozessen entsprechend Business-Requirements und Technical Constraints.
Jede Deployment-Strategie hat spezifische Vor- und Nachteile, die sie für unterschiedliche Anwendungsszenarien geeignet machen. Die Wahl der richtigen Strategie hängt von Faktoren wie Verfügbarkeitsanforderungen, Ressourcenbudget, Risikotoleranz und Anwendungsarchitektur ab.
[Diagramm: Deployment-Strategien-Matrix mit Downtime vs. Ressourcenverbrauch vs. Komplexität]
| Strategie | Downtime | Ressourcen | Komplexität | Rollback-Zeit | Verwendung |
|---|---|---|---|---|---|
| Rolling | Keine | Normal | Niedrig | Langsam | Standard-Deployments |
| Recreate | Kurz | Minimal | Sehr niedrig | Langsam | Legacy-Apps, Entwicklung |
| Blue-Green | Keine | Doppelt | Mittel | Sofort | Kritische Services |
| Canary | Keine | Normal+ | Hoch | Schnell | Risikoreiche Updates |
Rolling Deployment-Strategien implementieren graduelle Anwendungsaktualisierungen durch schrittweisen Austausch alter Instanzen mit neuen Versionen während kontinuierlicher Service-Verfügbarkeit. Diese inkrementelle Herangehensweise minimiert Service-Unterbrechungen und ermöglicht frühe Fehlererkennung mit begrenztem Blast-Radius.
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 6
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2 # Max 2 Pods gleichzeitig down
maxSurge: 2 # Max 2 zusätzliche Pods während Update
template:
spec:
containers:
- name: webapp
image: webapp:v2.0
readinessProbe: # Kritisch für Rolling Updates
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5Aggressive Updates (schnell, höheres Risiko):
rollingUpdate:
maxUnavailable: 50% # Hälfte der Pods kann gleichzeitig down sein
maxSurge: 50% # Doppelte Kapazität während UpdateKonservative Updates (langsam, niedriges Risiko):
rollingUpdate:
maxUnavailable: 1 # Nur 1 Pod gleichzeitig down
maxSurge: 1 # Nur 1 zusätzlicher PodZero-Downtime Updates (beste Verfügbarkeit):
rollingUpdate:
maxUnavailable: 0 # Kein Pod darf down sein
maxSurge: 2 # Neue Pods vor Terminierung alter Pods# Update-Status verfolgen
oc rollout status deployment/webapp
# Update-Historie anzeigen
oc rollout history deployment/webapp
# Laufendes Update pausieren
oc rollout pause deployment/webapp
# Update fortsetzen
oc rollout resume deployment/webapp
# Rollback zum vorherigen Stand
oc rollout undo deployment/webappRecreate-Strategien terminieren alle bestehenden Instanzen vor Erstellung neuer Versionen, wodurch temporäre Service-Unterbrechungen entstehen aber Ressourcenverbrauch minimiert wird. Diese Strategie eignet sich für Anwendungen, die gleichzeitige Versionskoexistenz nicht unterstützen oder absolute State-Konsistenz erfordern.
apiVersion: apps/v1
kind: Deployment
metadata:
name: legacy-app
spec:
strategy:
type: Recreate
template:
spec:
containers:
- name: legacy-app
image: legacy-app:v2.0
volumeMounts:
- name: shared-data
mountPath: /data
volumes:
- name: shared-data
persistentVolumeClaim:
claimName: shared-pvc # ReadWriteOnce PVCGeeignet für: - Legacy-Anwendungen ohne Clustering-Support - Anwendungen mit ReadWriteOnce-Volumes - Entwicklungs- und Testumgebungen - Single-Instance-Datenbanken - Batch-Jobs und Scheduled Tasks
Downtime-Dauer minimieren:
spec:
template:
spec:
# Schnellerer Container-Start
containers:
- name: app
image: app:v2.0
imagePullPolicy: IfNotPresent # Image bereits gecached
# Image bereits auf Nodes vorziehen
initContainers:
- name: cache-warmer
image: app:v2.0
command: ['echo', 'Image cached']Blue-Green Deployment-Pattern implementieren parallele Produktions-Environments mit instantanem Traffic-Switch zwischen Versionen. Diese Strategie eliminiert Deployment-Downtime und ermöglicht schnelle Rollbacks, erfordert jedoch doppelte Ressourcenkapazität.
# Blue Deployment (aktuelle Produktion)
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-blue
labels:
app: webapp
version: blue
spec:
replicas: 3
selector:
matchLabels:
app: webapp
version: blue
template:
metadata:
labels:
app: webapp
version: blue
spec:
containers:
- name: webapp
image: webapp:v1.9
---
# Green Deployment (neue Version)
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-green
labels:
app: webapp
version: green
spec:
replicas: 3
selector:
matchLabels:
app: webapp
version: green
template:
metadata:
labels:
app: webapp
version: green
spec:
containers:
- name: webapp
image: webapp:v2.0
---
# Service (Traffic-Switch-Point)
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
version: blue # Switch to 'green' for cutover
ports:
- port: 80
targetPort: 8080# 1. Green Environment deployen
oc apply -f webapp-green-deployment.yaml
# 2. Green Environment testen (interner Service)
oc expose deployment webapp-green --name=webapp-green-service
oc port-forward service/webapp-green-service 8081:80
# Test: curl http://localhost:8081/health
# 3. Traffic auf Green umschalten
oc patch service webapp-service -p '{"spec":{"selector":{"version":"green"}}}'
# 4. Blue Environment cleanup (nach Bestätigung)
oc delete deployment webapp-blue
# Rollback falls nötig (zurück zu Blue)
oc patch service webapp-service -p '{"spec":{"selector":{"version":"blue"}}}'# Database Migration Job vor Green Deployment
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration-v2
spec:
template:
spec:
containers:
- name: migrator
image: webapp:v2.0
command: ['npm', 'run', 'migrate-forward-compatible']
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
restartPolicy: NeverCanary-Deployment-Ansätze dirigieren schrittweise Traffic-Anteile zu neuen Versionen für risikominimierte Validierung vor vollständiger Ausrollung. Diese progressive Exposure-Strategie unterstützt A/B-Testing und Performance-Validierung mit kontrollierten User-Gruppen.
# Stable Deployment (95% Traffic)
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-stable
spec:
replicas: 19 # 95% der gewünschten Kapazität
selector:
matchLabels:
app: webapp
track: stable
template:
metadata:
labels:
app: webapp
track: stable
version: v1.9
spec:
containers:
- name: webapp
image: webapp:v1.9
---
# Canary Deployment (5% Traffic)
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-canary
spec:
replicas: 1 # 5% der gewünschten Kapazität
selector:
matchLabels:
app: webapp
track: canary
template:
metadata:
labels:
app: webapp
track: canary
version: v2.0
spec:
containers:
- name: webapp
image: webapp:v2.0
---
# Service für beide Tracks
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp # Matched beide: stable und canary
ports:
- port: 80
targetPort: 8080# Phase 1: 5% Canary Traffic
oc scale deployment webapp-stable --replicas=19
oc scale deployment webapp-canary --replicas=1
# Metriken überwachen
oc logs -l track=canary --tail=100
curl -s http://webapp-service/metrics | grep error_rate
# Phase 2: 25% Canary Traffic (bei guten Metriken)
oc scale deployment webapp-stable --replicas=15
oc scale deployment webapp-canary --replicas=5
# Phase 3: 50% Canary Traffic
oc scale deployment webapp-stable --replicas=10
oc scale deployment webapp-canary --replicas=10
# Phase 4: Vollständige Promotion
oc scale deployment webapp-stable --replicas=0
oc scale deployment webapp-canary --replicas=20
# Cleanup: Stable-Deployment entfernen
oc delete deployment webapp-stableapiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: webapp-canary
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
service:
port: 80
targetPort: 8080
analysis:
interval: 1m
threshold: 5
maxWeight: 50
stepWeight: 10
metrics:
- name: request-success-rate
thresholdRange:
min: 99
interval: 1m
- name: request-duration
thresholdRange:
max: 500
interval: 30s
webhooks:
- name: acceptance-test
type: pre-rollout
url: http://test-runner.test/
- name: load-test
url: http://load-tester.test/
timeout: 5s
metadata:
cmd: "hey -z 1m -q 10 -c 2 http://webapp.default:80/"A/B Testing erweitert Canary-Deployments um gezielte Benutzer-Segmentierung für wissenschaftliche Validierung von Features oder Änderungen.
# Istio VirtualService für A/B Testing
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: webapp-ab-test
spec:
hosts:
- webapp.company.com
http:
- match:
- headers:
user-type:
exact: "premium"
route:
- destination:
host: webapp-service
subset: v2
weight: 100
- route:
- destination:
host: webapp-service
subset: v1
weight: 90
- destination:
host: webapp-service
subset: v2
weight: 10
---
# DestinationRule für Subsets
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: webapp-destination
spec:
host: webapp-service
subsets:
- name: v1
labels:
version: v1.9
- name: v2
labels:
version: v2.0# ConfigMap für Feature Flags
apiVersion: v1
kind: ConfigMap
metadata:
name: feature-flags
data:
features.json: |
{
"new-checkout-flow": {
"enabled": true,
"rollout": 25,
"audience": ["beta-users"]
},
"improved-search": {
"enabled": false,
"rollout": 0
}
}
---
# Deployment mit Feature Flag Volume
spec:
template:
spec:
containers:
- name: webapp
volumeMounts:
- name: feature-config
mountPath: /app/config
env:
- name: FEATURE_CONFIG_PATH
value: "/app/config/features.json"
volumes:
- name: feature-config
configMap:
name: feature-flagsRobuste Deployment-Strategien erfordern automatisierte Failure-Detection und Recovery-Mechanismen für schnelle Problembehebung.
# Deployment mit automatischem Rollback
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: webapp-rollout
spec:
replicas: 20
strategy:
canary:
analysis:
templates:
- templateName: success-rate
args:
- name: service-name
value: webapp-service
steps:
- setWeight: 10
- pause: {duration: 2m}
- setWeight: 20
- pause: {duration: 2m}
- setWeight: 50
- pause: {duration: 2m}
selector:
matchLabels:
app: webapp
---
# AnalysisTemplate für Metriken
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
spec:
metrics:
- name: success-rate
interval: 10s
count: 12
successCondition: result[0] >= 0.95
failureLimit: 3
provider:
prometheus:
address: http://prometheus.monitoring:9090
query: |
sum(rate(http_requests_total{service="{{args.service-name}}",status!~"5.."}[1m])) /
sum(rate(http_requests_total{service="{{args.service-name}}"}[1m]))# Verstärkte Health Checks während Deployments
containers:
- name: webapp
livenessProbe:
httpGet:
path: /health
port: 8080
# Verschärfte Settings während Deployment
initialDelaySeconds: 10 # Statt 30
periodSeconds: 5 # Statt 15
timeoutSeconds: 2 # Statt 5
failureThreshold: 2 # Statt 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 2 # Sehr häufig während Deployment
timeoutSeconds: 1# Deployment-Metriken sammeln
# Error Rate während Deployment
sum(rate(http_requests_total{status=~"5.."}[1m])) by (version)
# Response Time P95
histogram_quantile(0.95,
sum(rate(http_request_duration_seconds_bucket[1m])) by (le, version)
)
# Pod Restart Rate
sum(increase(kube_pod_container_status_restarts_total[1m])) by (pod)
# Deployment Progress
(kube_deployment_status_replicas_ready / kube_deployment_spec_replicas) * 100Strukturierte Promotion-Pfade gewährleisten schrittweise Validierung von Changes durch verschiedene Umgebungen bis zur Produktion.
# Argo CD Application für automatische Promotion
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: webapp-promotion
spec:
project: default
source:
repoURL: https://github.com/company/webapp-config
path: environments
targetRevision: HEAD
helm:
valueFiles:
- dev/values.yaml # Start in Development
destination:
server: https://kubernetes.default.svc
namespace: webapp-dev
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
---
# Promotion-Trigger via Image Updater
apiVersion: argoproj.io/v1alpha1
kind: ImageUpdateAutomation
metadata:
name: webapp-image-update
spec:
sourceRef:
kind: GitRepository
name: webapp-config
interval: 1m
update:
strategy: Semver
path: "./environments"
commit:
author:
email: gitops@company.com
name: GitOps Bot
messageTemplate: |
Promote {{range .Updated.Images}}{{println .}}{{end}}# Development: Schnelle Rollbacks
oc rollout undo deployment/webapp -n webapp-dev
# Staging: Koordinierter Rollback mit Tests
oc rollout undo deployment/webapp -n webapp-staging
oc wait --for=condition=available deployment/webapp -n webapp-staging
./run-smoke-tests.sh staging
# Production: Mehrstufiger Rollback-Prozess
# 1. Traffic auf Previous Version umleiten
oc patch service webapp-service -p '{"spec":{"selector":{"version":"previous"}}}'
# 2. Deployment rollback
oc rollout undo deployment/webapp -n webapp-prod
# 3. Validierung
./run-production-health-check.sh
# 4. Incident Documentation
echo "Rollback completed at $(date)" >> rollback-log.txtVerschiedene Deployment-Strategien haben unterschiedliche Ressourcenanforderungen, die bei der Cluster-Kapazitätsplanung berücksichtigt werden müssen.
Rolling Updates: - Overhead: 1-2 zusätzliche Pods während Update - Dauer: 2-10 Minuten je nach maxSurge/maxUnavailable - Memory-Spike: Temporär +20-50% während Update
Blue-Green: - Overhead: 100% zusätzliche Ressourcen - Dauer: Sekunden für Switch, Stunden für Test-Phase - Memory-Spike: Dauerhaft doppelt bis Cleanup
Canary: - Overhead: 5-50% zusätzliche Ressourcen während Test - Dauer: Stunden bis Tage für vollständige Promotion - Memory-Spike: Gradueller Anstieg über Zeit
# Deployment mit Resource-Awareness
spec:
template:
spec:
containers:
- name: webapp
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2"
memory: "4Gi"
# Placement auf Nodes mit ausreichend Kapazität
nodeSelector:
node.kubernetes.io/instance-type: "m5.large"
tolerations:
- key: "deployment"
operator: "Equal"
value: "allowed"
effect: "NoSchedule"# Cluster-Kapazität vor Major Deployment prüfen
oc describe nodes | grep -A 5 "Allocated resources"
# Image-Pull-Zeit reduzieren
oc create job image-puller --image=webapp:v2.0 \
--dry-run=client -o yaml | \
sed 's/Never/IfNotPresent/' | \
oc apply -f -
# Parallel Deployment für mehrere Services
for app in frontend backend api; do
oc rollout restart deployment/$app &
done
wait
# Deployment-Completion warten
for app in frontend backend api; do
oc rollout status deployment/$app
done