K8s Deployment Rolling Update Strategy
Configure Kubernetes Deployment rolling updates with maxSurge and maxUnavailable. Rollback, revision history, blue-green, and canary deployment patterns.
π‘ Quick Answer: Kubernetes rolling updates replace pods gradually:
maxSurge: 25%allows 25% extra pods during update,maxUnavailable: 25%allows 25% pods to be unavailable. Default strategy creates new pods before killing old ones. Rollback withkubectl rollout undo deployment/<name>. SetrevisionHistoryLimit: 10to keep rollback history.
The Problem
Updating a deployment without downtime requires careful orchestration:
- All pods updated at once = downtime
- No rollback capability = stuck with broken versions
- Slow rollouts waste time; fast rollouts risk stability
- Need to verify new version before fully committing
The Solution
Rolling Update Strategy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 10
revisionHistoryLimit: 10 # Keep 10 rollback versions
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # Allow 25% extra pods (3 extra)
maxUnavailable: 25% # Allow 25% unavailable (2 down)
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: myapp:v2
ports:
- containerPort: 8080
readinessProbe: # Critical for safe rollouts
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 5How Rolling Update Works
Initial state (10 replicas, v1):
v1 v1 v1 v1 v1 v1 v1 v1 v1 v1
Step 1: Create 3 new (maxSurge 25%), kill 2 old (maxUnavailable 25%):
v1 v1 v1 v1 v1 v1 v1 v1 v2 v2 v2 (13 total, 2 terminating)
Step 2: As v2 pods become Ready, more v1 are terminated:
v1 v1 v1 v1 v1 v2 v2 v2 v2 v2 v2 (continuing...)
Step 3: Complete:
v2 v2 v2 v2 v2 v2 v2 v2 v2 v2Trigger and Monitor Rollouts
# Update image (triggers rolling update)
kubectl set image deployment/web-app web=myapp:v2
# Or edit directly
kubectl edit deployment web-app
# Watch rollout progress
kubectl rollout status deployment/web-app
# Waiting for deployment "web-app" rollout to finish: 5 of 10 updated replicas are available...
# deployment "web-app" successfully rolled out
# Check rollout history
kubectl rollout history deployment/web-app
# REVISION CHANGE-CAUSE
# 1 kubectl set image deployment/web-app web=myapp:v1
# 2 kubectl set image deployment/web-app web=myapp:v2
# Pause rollout (for manual verification)
kubectl rollout pause deployment/web-app
# Resume rollout
kubectl rollout resume deployment/web-appRollback
# Rollback to previous version
kubectl rollout undo deployment/web-app
# Rollback to specific revision
kubectl rollout undo deployment/web-app --to-revision=1
# Check what's in a specific revision
kubectl rollout history deployment/web-app --revision=2maxSurge and maxUnavailable Patterns
# Zero-downtime (slower): extra pods before killing old
maxSurge: 1
maxUnavailable: 0
# Never below 10 pods, creates 1 extra at a time
# Fast rollout: allow some downtime
maxSurge: 50%
maxUnavailable: 50%
# Quick update, but 5 of 10 pods may be unavailable
# Absolute values
maxSurge: 3
maxUnavailable: 2
# At most 13 pods total, at least 8 available
# Recreate strategy (NOT rolling β full downtime)
strategy:
type: Recreate
# All old pods killed, then all new pods created
# Use for: databases, stateful apps that can't run two versionsCanary Deployment Pattern
# Manual canary: scale down main, create canary
kubectl scale deployment web-app --replicas=9
kubectl create deployment web-app-canary --image=myapp:v2 --replicas=1
# Both deployments behind same service (matching labels)
# Monitor canary metrics, then promote:
kubectl set image deployment/web-app web=myapp:v2
kubectl delete deployment web-app-canaryCommon Issues
Rollout stuck β new pods not becoming Ready
Readiness probe failing on new version. Check: kubectl describe pod <new-pod>. Rollback: kubectl rollout undo deployment/web-app.
βdeadline exceededβ error
Set progressDeadlineSeconds (default 600s). If rollout takes longer, itβs marked failed but continues.
Old ReplicaSets consuming resources
Set revisionHistoryLimit to limit kept ReplicaSets. Old pods are already scaled to 0 but ReplicaSet objects remain.
Best Practices
- Always set readinessProbe β rolling updates rely on Ready status
- Start with
maxSurge: 25%, maxUnavailable: 0β zero-downtime default - Use
Recreatefor databases β two versions of a DB can corrupt data - Set
revisionHistoryLimit: 5-10β keep rollback options without clutter - Annotate changes β
kubectl annotate deployment web-app kubernetes.io/change-cause="v2 security patch"
Key Takeaways
- Rolling updates replace pods gradually with configurable surge and unavailability
maxSurgecontrols how many extra pods;maxUnavailablecontrols minimum availablekubectl rollout undorolls back to previous revision instantly- Readiness probes are essential β without them, bad pods receive traffic
- Use
Recreatestrategy for stateful apps that canβt run two versions simultaneously

Recommended
Kubernetes Recipes β The Complete Book100+ production-ready patterns with detailed explanations, best practices, and copy-paste YAML. Everything in one place.
Get the Book βLearn by Doing
CopyPasteLearn β Hands-on Cloud & DevOps CoursesMaster Kubernetes, Ansible, Terraform, and MLOps with interactive, copy-paste-run lessons. Start free.
Browse Courses βπ Deepen Your Skills β Hands-on Courses
Courses by CopyPasteLearn.com β Learn IT by Doing
