Blue-Green/Canary Deploy
Strategy Comparison
| Strategy | How It Works | Rollback | Cost | Risk |
|---|---|---|---|---|
| Recreate | Stop old, start new | Redeploy old version | Low | High (downtime) |
| Rolling Update | Gradually replace pods | Kubernetes rollout undo | Low | Medium |
| Blue-Green | Two identical envs, switch traffic | Instant (switch back) | High (2x infra) | Low |
| Canary | Gradual traffic shift (1% โ 10% โ 100%) | Route 0% to new version | Medium | Low |
| Shadow | Mirror traffic to new version; no user impact | N/A (not live) | High | Very low |
| A/B Testing | Route specific users to different versions | Change routing rules | Medium | Low |
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