Workloads & Controllers
Deployments, ReplicaSets, DaemonSets, StatefulSets, Jobs, and CronJobs for managing application workloads.
Deployments
Deployment Operations
# Create deployment
kubectl create deployment nginx --image=nginx:1.20
kubectl create deployment web --image=nginx --replicas=3
# Get deployments
kubectl get deployments
kubectl get deploy
kubectl get deploy -o wide
# Scale deployment
kubectl scale deployment nginx --replicas=5
kubectl scale deploy nginx --replicas=3
# Update deployment image
kubectl set image deployment/nginx nginx=nginx:1.21
kubectl set image deploy/nginx nginx=nginx:1.21 --record
# Rollout operations
kubectl rollout status deployment/nginx
kubectl rollout history deployment/nginx
kubectl rollout undo deployment/nginx
kubectl rollout undo deployment/nginx --to-revision=2
# Delete deployment
kubectl delete deployment nginx
kubectl delete deploy nginx
Deployment YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
resources:
requests:
memory: '128Mi'
cpu: '100m'
limits:
memory: '256Mi'
cpu: '200m'
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
Advanced Deployment Strategies
apiVersion: apps/v1
kind: Deployment
metadata:
name: rolling-update-deployment
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.20
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: recreate-deployment
spec:
replicas: 3
strategy:
type: Recreate
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: myapp:v1
ReplicaSets
ReplicaSet Operations
# Get ReplicaSets
kubectl get replicasets
kubectl get rs
kubectl get rs -o wide
# Describe ReplicaSet
kubectl describe rs replicaset-name
# Scale ReplicaSet
kubectl scale rs replicaset-name --replicas=5
# Delete ReplicaSet
kubectl delete rs replicaset-name
ReplicaSet YAML
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
DaemonSets
DaemonSet Operations
# Get DaemonSets
kubectl get daemonsets
kubectl get ds
kubectl get ds -n kube-system
# Describe DaemonSet
kubectl describe ds daemonset-name
# Update DaemonSet
kubectl set image ds/daemonset-name container-name=new-image:tag
# Delete DaemonSet
kubectl delete ds daemonset-name
DaemonSet YAML
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-collector
labels:
app: log-collector
spec:
selector:
matchLabels:
app: log-collector
template:
metadata:
labels:
app: log-collector
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: log-collector
image: fluentd:latest
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
StatefulSets
StatefulSet Operations
# Get StatefulSets
kubectl get statefulsets
kubectl get sts
kubectl get sts -o wide
# Scale StatefulSet
kubectl scale sts statefulset-name --replicas=5
# Update StatefulSet
kubectl patch sts statefulset-name -p '{"spec":{"template":{"spec":{"containers":[{"name":"container-name","image":"new-image:tag"}]}}}}'
# Delete StatefulSet
kubectl delete sts statefulset-name
# Delete StatefulSet but keep pods
kubectl delete sts statefulset-name --cascade=orphan
StatefulSet YAML
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-statefulset
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-storage
spec:
accessModes: ['ReadWriteOnce']
resources:
requests:
storage: 10Gi
Jobs
Job Operations
# Create Job
kubectl create job pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'
# Get Jobs
kubectl get jobs
kubectl get job
kubectl get job -o wide
# Describe Job
kubectl describe job job-name
# Get Job logs
kubectl logs job/job-name
# Delete Job
kubectl delete job job-name
# Delete Job and its pods
kubectl delete job job-name --cascade=foreground
Job YAML
apiVersion: batch/v1
kind: Job
metadata:
name: pi-calculation
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ['perl', '-Mbignum=bpi', '-wle', 'print bpi(2000)']
restartPolicy: Never
backoffLimit: 4
completions: 1
parallelism: 1
activeDeadlineSeconds: 300
---
apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job
spec:
parallelism: 3
completions: 6
template:
metadata:
name: parallel-job
spec:
containers:
- name: worker
image: busybox
command: ['sh', '-c', 'echo Processing item $HOSTNAME && sleep 30']
restartPolicy: Never
CronJobs
CronJob Operations
# Create CronJob
kubectl create cronjob hello --image=busybox --schedule="*/1 * * * *" -- echo hello
# Get CronJobs
kubectl get cronjobs
kubectl get cj
kubectl get cj -o wide
# Describe CronJob
kubectl describe cronjob cronjob-name
# Suspend/Resume CronJob
kubectl patch cronjob cronjob-name -p '{"spec":{"suspend":true}}'
kubectl patch cronjob cronjob-name -p '{"spec":{"suspend":false}}'
# Delete CronJob
kubectl delete cronjob cronjob-name
CronJob YAML
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup-job
spec:
schedule: '0 2 * * *' # Daily at 2 AM
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
env:
- name: BACKUP_PATH
value: '/data'
command:
- /bin/sh
- -c
- |
echo "Starting backup at $(date)"
# Backup commands here
echo "Backup completed at $(date)"
restartPolicy: OnFailure
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
concurrencyPolicy: Forbid
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-job
spec:
schedule: '0 0 * * 0' # Weekly on Sunday
jobTemplate:
spec:
template:
spec:
containers:
- name: cleanup
image: alpine:latest
command: ['sh', '-c', 'find /tmp -type f -mtime +7 -delete']
restartPolicy: Never
concurrencyPolicy: Replace
Resource Management
Resource Limits and Requests
apiVersion: apps/v1
kind: Deployment
metadata:
name: resource-demo
spec:
replicas: 2
selector:
matchLabels:
app: resource-demo
template:
metadata:
labels:
app: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: '128Mi'
cpu: '100m'
limits:
memory: '256Mi'
cpu: '200m'
ports:
- containerPort: 80
Horizontal Pod Autoscaler (HPA)
# Create HPA
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
# Get HPA
kubectl get hpa
kubectl get hpa -o wide
# Describe HPA
kubectl describe hpa hpa-name
# Delete HPA
kubectl delete hpa hpa-name
HPA YAML
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
Vertical Pod Autoscaler (VPA)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: nginx-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
updatePolicy:
updateMode: 'Auto'
resourcePolicy:
containerPolicies:
- containerName: nginx
maxAllowed:
cpu: 1
memory: 500Mi
minAllowed:
cpu: 100m
memory: 50Mi
Pod Disruption Budgets
PodDisruptionBudget YAML
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: nginx-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: nginx
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api-pdb
spec:
maxUnavailable: 25%
selector:
matchLabels:
app: api
PDB Operations
# Get PodDisruptionBudgets
kubectl get pdb
kubectl get poddisruptionbudgets
# Describe PDB
kubectl describe pdb pdb-name
# Delete PDB
kubectl delete pdb pdb-name
Init Containers
Init Container Example
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
initContainers:
- name: install
image: busybox
command:
- wget
- '-O'
- '/work-dir/index.html'
- 'http://example.com'
volumeMounts:
- name: workdir
mountPath: '/work-dir'
- name: setup
image: busybox
command: ['sh', '-c', 'echo "Setup complete" > /work-dir/setup.txt']
volumeMounts:
- name: workdir
mountPath: '/work-dir'
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
volumes:
- name: workdir
emptyDir: {}
Quick Reference
Workload Commands
kubectl create deployment name --image=image- Create deploymentkubectl scale deployment name --replicas=N- Scale deploymentkubectl rollout status deployment/name- Check rollout statuskubectl rollout undo deployment/name- Rollback deploymentkubectl get all- List all workload resources
Resource Types
- Deployment - Manages ReplicaSets and rolling updates
- ReplicaSet - Ensures specified number of pod replicas
- DaemonSet - Runs pod on every node
- StatefulSet - Manages stateful applications
- Job - Runs pods to completion
- CronJob - Runs jobs on schedule
Common Patterns
# Quick deployment
kubectl create deployment nginx --image=nginx --replicas=3
# Update image
kubectl set image deployment/nginx nginx=nginx:1.21
# Scale quickly
kubectl scale deployment nginx --replicas=5
# Check rollout
kubectl rollout status deployment/nginx
# Quick job
kubectl create job test --image=busybox -- echo hello
# Autoscale
kubectl autoscale deployment nginx --cpu-percent=70 --min=2 --max=10