Skip to content

Kubernetes Deployments

A Deployment manages a set of identical pod replicas. It ensures the desired number of pods are running, handles rolling updates, and enables rollback.

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: myrepo/my-app:1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
Terminal window
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods

The default strategy replaces pods gradually with zero downtime:

strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # max pods that can be down during update
maxSurge: 1 # max extra pods above desired count

Recreate is the alternative — it kills all old pods before starting new ones (causes downtime, useful when you cannot run two versions simultaneously).

Update the image tag in the manifest and apply, or use kubectl set image:

Terminal window
kubectl set image deployment/my-app my-app=myrepo/my-app:2.0
# Watch the rollout progress
kubectl rollout status deployment/my-app
Terminal window
# Undo to the previous version
kubectl rollout undo deployment/my-app
# Undo to a specific revision
kubectl rollout history deployment/my-app
kubectl rollout undo deployment/my-app --to-revision=2
Terminal window
# Scale to 5 replicas
kubectl scale deployment my-app --replicas=5
# Or update replicas in the manifest and re-apply

Automatically scale based on CPU/memory:

Terminal window
kubectl autoscale deployment my-app --min=2 --max=10 --cpu-percent=70

Or in YAML:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70

Useful when applying multiple changes at once:

Terminal window
kubectl rollout pause deployment/my-app
kubectl set image deployment/my-app my-app=myrepo/my-app:2.0
kubectl set env deployment/my-app ENVIRONMENT=production
kubectl rollout resume deployment/my-app
Terminal window
kubectl get deployments
kubectl describe deployment my-app
kubectl delete deployment my-app
kubectl rollout history deployment/my-app
kubectl rollout status deployment/my-app