Skip to main content

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 deployment
  • kubectl scale deployment name --replicas=N - Scale deployment
  • kubectl rollout status deployment/name - Check rollout status
  • kubectl rollout undo deployment/name - Rollback deployment
  • kubectl 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