Amazon EKS — Blue/Green & Canary Deployments

1 minute read

Blue/Green & Canary Deployments

Rolling updates are good, but sometimes you need more control: instant rollback (blue/green) or gradual traffic shifting (canary).


Blue/Green Deployment

Blue/Green Strategy
┌─────────────────────────────────────────────────┐
│                                                 │
│  Service (selector: version=blue)               │
│       │                                         │
│  ┌────▼────┐  ┌─────────┐                      │
│  │ Blue v1 │  │ Green v2│  ← Green deployed     │
│  │ (live)  │  │ (idle)  │    but no traffic      │
│  └─────────┘  └─────────┘                       │
│                                                 │
│  Test Green → Switch Service selector → Done    │
│       │                                         │
│  ┌─────────┐  ┌────▼────┐                      │
│  │ Blue v1 │  │ Green v2│  ← Instant switch     │
│  │ (idle)  │  │ (live)  │    by changing selector│
│  └─────────┘  └─────────┘                       │
│                                                 │
│  Rollback: Switch selector back to blue         │
└─────────────────────────────────────────────────┘

Blue/Green with Services

# Blue deployment (current)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
      version: blue
  template:
    metadata:
      labels:
        app: web
        version: blue
    spec:
      containers:
        - name: web
          image: myapp:v1

---
# Green deployment (new)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
      version: green
  template:
    metadata:
      labels:
        app: web
        version: green
    spec:
      containers:
        - name: web
          image: myapp:v2

---
# Service — switch selector to cutover
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
    version: blue    # Change to "green" to switch
  ports:
    - port: 80
# Switch traffic from blue to green
$ kubectl patch service web -p '{"spec":{"selector":{"version":"green"}}}'

# Rollback
$ kubectl patch service web -p '{"spec":{"selector":{"version":"blue"}}}'

Canary Deployment

Send a small percentage of traffic to the new version:

Canary Strategy
─────────────────
Step 1: 95% v1, 5% v2   ← Deploy 1 canary pod
Step 2: Monitor errors, latency
Step 3: 75% v1, 25% v2  ← If OK, increase
Step 4: 50% v1, 50% v2
Step 5: 0% v1, 100% v2  ← Full rollout

With ALB Ingress annotations you can set exact traffic weights.


Strategy Comparison

Strategy Rollback Speed Resource Cost Risk
Rolling Update Slow (undo) 1x + surge Medium
Blue/Green Instant 2x Low
Canary Fast 1x + canary Lowest

What’s Next?

Package apps: Helm Deployments.