Blue-Green/Canary Deploy

Strategy Comparison

StrategyHow It WorksRollbackCostRisk
RecreateStop old, start newRedeploy old versionLowHigh (downtime)
Rolling UpdateGradually replace podsKubernetes rollout undoLowMedium
Blue-GreenTwo identical envs, switch trafficInstant (switch back)High (2x infra)Low
CanaryGradual traffic shift (1% โ†’ 10% โ†’ 100%)Route 0% to new versionMediumLow
ShadowMirror traffic to new version; no user impactN/A (not live)HighVery low
A/B TestingRoute specific users to different versionsChange routing rulesMediumLow

Blue-Green with Kubernetes

# blue-deployment.yaml (current production) apiVersion: apps/v1 kind: Deployment metadata: name: app-blue labels: version: blue spec: replicas: 3 selector: matchLabels: app: myapp version: blue template: metadata: labels: app: myapp version: blue spec: containers: - image: myapp:v1.0.0 # service.yaml โ€” points to blue apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp version: blue # <-- switch to "green" to cut over # Steps: # 1. Deploy green (version: green, image: v2.0.0) # 2. Test green internally # 3. Update service selector to version: green # 4. Monitor # 5. Delete blue if green is stable

Canary with Nginx Ingress

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-canary annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" # 10% traffic # OR target specific header: # nginx.ingress.kubernetes.io/canary-by-header: "X-Canary" # nginx.ingress.kubernetes.io/canary-by-header-value: "true" spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: myapp-v2 port: number: 80