Introduction
Choosing the right Kubernetes workload type is crucial to building efficient and scalable applications. Each workload controller is designed for a specific use case, and understanding these differences is vital for both optimal application performance and resource optimization. This guide examines all major Kubernetes workload types, when to use each one, and provides real-world examples to help you make informed architectural decisions.
Core Workload Types
Deployments
Purpose: Manage stateless applications with rolling updates and replica management.
When to Use:
- Web applications and APIs that don't store state locally
- Microservices without persistent data requirements
- Applications requiring high availability through multiple replicas
- Workloads needing frequent updates with zero downtime
- Services that can be easily replaced or restarted
Common Examples:
- Frontend web servers (nginx, Apache, React/Angular apps)
- REST API services and GraphQL endpoints
- Load balancers and reverse proxies
- Stateless backend services (authentication, notification services)
- Content delivery and caching layers (Redis for sessions, not persistence)
Key Characteristics:
- Pods are interchangeable and can be created/destroyed freely
- Rolling updates ensure zero-downtime deployments
- Horizontal scaling is straightforward
- No persistent storage is attached to individual pods
- Network identity is not important
Configuration Example:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-api
spec:
replicas: 3
selector:
matchLabels:
app: web-api
template:
metadata:
labels:
app: web-api
spec:
containers:
- name: api
image: mycompany/web-api:v1.2.3
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
StatefulSets
Purpose: Manage stateful applications requiring stable network identities and persistent storage.
When to Use:
- Databases requiring persistent storage and stable identities
- Applications with master-slave or leader-follower architectures
- Services requiring ordered deployment and scaling
- Applications that store data locally and need consistent network identities
- Clustered applications with peer discovery requirements
Common Examples:
- Database clusters (PostgreSQL, MySQL, MongoDB)
- Message brokers (RabbitMQ, Apache Kafka)
- Distributed storage systems (Cassandra, Elasticsearch)
- Consensus-based systems (etcd, Consul, Zookeeper)
- Analytics platforms requiring data locality
Key Characteristics:
- Pods have stable, unique network identities (pod-0, pod-1, pod-2)
- Persistent storage follows pods during rescheduling
- Ordered deployment and scaling (pod-0 before pod-1, etc.)
- Stable DNS names for service discovery
- Graceful termination and ordered updates
Configuration Example:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres-cluster
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:14
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
DaemonSets
Purpose: Run exactly one pod per node for system-level services.
When to Use:
- Node-level monitoring and logging
- Network plugins and system services
- Security agents and compliance tools
- Hardware management and device plugins
- Any service that needs to run on every node
Common Examples:
- Log collection agents (Fluentd, Filebeat, Logstash)
- Monitoring agents (Prometheus Node Exporter, Datadog agent)
- Network overlay components (Calico, Flannel)
- Security and compliance tools (Falco, Twistlock)
- Storage drivers and CSI plugins
Key Characteristics:
- Automatically schedules pods on new nodes
- Ensures exactly one pod per node (unless node selectors are used)
- Typically requires elevated privileges
- Often uses host networking and file system access
- Survives node reboots and maintenance
Configuration Example:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-collector
spec:
selector:
matchLabels:
name: log-collector
template:
metadata:
labels:
name: log-collector
spec:
containers:
- name: fluentd
image: fluentd:v1.14
volumeMounts:
- name: varlog
mountPath: /var/log
readOnly: true
- name: containers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: containers
hostPath:
path: /var/lib/docker/containers
Jobs
Purpose: Run batch workloads to completion with guaranteed execution.
When to Use:
- One-time data processing tasks
- Database migrations and schema updates
- Backup and restore operations
- Batch analytics and reporting
- Image or video processing pipelines
Common Examples:
- ETL (Extract, Transform, Load) processes
- Database migrations and maintenance scripts
- Report generation and data exports
- Machine learning model training
- File processing and format conversion
Key Characteristics:
- Runs until successful completion
- Can run multiple pods for parallel processing
- Automatically retries failed pods (configurable)
- Cleans up completed pods based on retention policy
- Supports different completion modes (parallel, indexed)
Configuration Example:
apiVersion: batch/v1
kind: Job
metadata:
name: data-migration
spec:
parallelism: 4
completions: 1
backoffLimit: 3
template:
spec:
restartPolicy: OnFailure
containers:
- name: migrator
image: mycompany/data-migrator:v2.1.0
env:
- name: SOURCE_DB
value: "postgresql://old-db:5432/data"
- name: TARGET_DB
value: "postgresql://new-db:5432/data"
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 2
memory: 4Gi
CronJobs
Purpose: Schedule recurring batch workloads.
When to Use:
- Scheduled backups and maintenance
- Periodic data synchronization
- Regular cleanup and housekeeping tasks
- Time-based report generation
- Health checks and monitoring tasks
Common Examples:
- Database backups and archiving
- Log rotation and cleanup
- Data synchronization between systems
- Periodic health checks and system maintenance
- Scheduled report generation and delivery
Key Characteristics:
- Uses cron syntax for scheduling
- Creates Jobs on schedule
- Configurable concurrency policies
- Can handle missed schedules
- Automatic cleanup of old jobs
Configuration Example:
apiVersion: batch/v1
kind: CronJob
metadata:
name: database-backup
spec:
schedule: "0 2 * * *" # Daily at 2 AM
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- pg_dump $DATABASE_URL > /backup/$(date +%Y%m%d_%H%M).sql
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
Advanced Workload Types
ReplicaSets
Purpose: Low-level replica management (typically managed by Deployments).
ReplicaSets are rarely used directly in modern Kubernetes deployments. Deployments provide a higher-level abstraction that handles ReplicaSet management automatically, including rolling updates and rollback capabilities.
When you might use ReplicaSets directly:
- Building custom controllers
- Very specific scaling requirements not met by Deployments
- Legacy applications with unique update patterns
Custom Resources and Operators
Purpose: Application-specific workload management through custom controllers.
When to Use:
- Complex applications requiring custom lifecycle management
- Multi-component applications with interdependencies
- Applications needing specialized scaling or update strategies
- When existing workload types don't fit your use case
Common Examples:
- Database operators (PostgreSQL Operator, MongoDB Operator)
- Application platforms (Istio, Knative)
- ML/AI workload managers (Kubeflow, Seldon)
- Backup and disaster recovery operators