Deployment, ReplicaSet, & ReplicationController
This section covers three core Kubernetes workload management concepts, Deployment, ReplicaSet, and ReplicationController.
What is a Deployment?
A Deployment in Kubernetes is the most commonly used controller for managing application workloads. It provides a declarative way to define what your application should look like how many replicas should run, what image to use, and how updates or rollbacks should occur.
You don’t create Pods directly in production. Instead, you create a Deployment that manages ReplicaSets, which in turn manage the Pods. This layered design allows Kubernetes to perform rolling updates, automatic scaling, and versioned rollbacks without downtime.
At a high level:
Deployment → manages ReplicaSets → manages PodsKey Responsibilities of a Deployment
Ensures a specified number of Pod replicas are always running.
Handles zero-downtime rolling updates when you deploy new versions.
Supports rollbacks if something goes wrong.
Manages ReplicaSets automatically (you never have to create them yourself).
Makes scaling (up/down) straightforward.
Deployment YAML Example
apiVersion: apps/v1 # API group for Deployments
kind: Deployment # Resource type
metadata:
name: nginx-deployment # Deployment name
labels:
app: nginx
spec:
replicas: 3 # Desired number of Pods
selector: # Defines which Pods this Deployment manages
matchLabels:
app: nginx
strategy: # Defines how updates are rolled out
type: RollingUpdate # RollingUpdate (default) or Recreate
rollingUpdate:
maxUnavailable: 1 # How many Pods can be unavailable during update
maxSurge: 1 # How many extra Pods can be created temporarily
template: # Pod template used to create Pods
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24 # Container image
ports:
- containerPort: 80
resources:
requests:
cpu: "100m" # Minimum guaranteed CPU
memory: "128Mi" # Minimum guaranteed memory
limits:
cpu: "500m" # Max CPU allowed
memory: "256Mi" # Max memory allowedBreaking Down the YAML
apiVersion: apps/v1 → Deployments are part of the
appsAPI group.kind: Deployment → Tells Kubernetes this is a Deployment resource.
metadata: Defines identifying information, name, labels, etc.
spec.replicas: Desired number of Pods you want to run.
spec.selector: Specifies which Pods belong to this Deployment (via labels).
spec.strategy: How updates are performed (rolling or recreate).
spec.template: Describes the Pod that should be created and managed by this Deployment.
The template field inside the Deployment is identical to a Pod definition, it defines container image, ports, probes, resources, etc.
Creating and Viewing a Deployment
You’ll see that Kubernetes automatically created:
A Deployment
A ReplicaSet
Multiple Pods
Updating a Deployment
If you change the image or configuration in the YAML and reapply it, Kubernetes will:
Create a new ReplicaSet for the updated Pods.
Gradually spin up new Pods while scaling down the old ones (rolling update).
Maintain the specified number of replicas during the transition.
Example:
Rollback if something breaks:
Scaling a Deployment
You can scale up or down manually:
or modify spec.replicas and reapply the YAML.
Deleting a Deployment
This automatically deletes its ReplicaSets and Pods.
Why Use Deployments
Self-healing: Automatically recreates failed Pods.
Declarative updates: You define what you want, Kubernetes figures out how to achieve it.
Rollbacks: Keeps history of revisions for safe rollback.
Automation: You don’t manage ReplicaSets or Pods manually the Deployment does it.
Deployments are the industry standard way to manage stateless workloads in Kubernetes.
What is a ReplicaSet?
A ReplicaSet (RS) is the middle layer between Deployments and Pods. Its core responsibility is simple - ensure a specific number of identical Pods are always running.
ReplicaSets were introduced to replace ReplicationControllers, adding better label selectors and integration with Deployments.
When you create a Deployment, Kubernetes automatically creates a ReplicaSet behind the scenes.
How ReplicaSets Work
A ReplicaSet continuously monitors Pods matching its label selector.
If a Pod dies or is deleted, it creates a new one.
If there are too many Pods (e.g., created manually), it deletes the extras.
Each ReplicaSet corresponds to a specific version of your Pod template (useful for rollbacks).
ReplicaSet YAML Example
Breaking Down the YAML
replicas: Number of Pods the ReplicaSet should maintain.
selector.matchLabels: Identifies which Pods are managed by this RS.
template: Defines the Pod structure (metadata + spec). If no existing Pods match the selector, it creates new ones.
Practical Example
Delete one of the Pods and watch how it gets recreated:
The RS detects the missing Pod and automatically spins up a replacement.
Set-Based Label Selectors
ReplicaSets support advanced label matching beyond simple equality.
Example:
This matches Pods that have either tier=frontend or tier=api.
When to Use ReplicaSet Directly
In practice, you rarely use ReplicaSets directly they are almost always managed by Deployments. However, they’re still useful for advanced, static workloads where you want fine-grained control without automatic rollouts.
What is a ReplicationController?
A ReplicationController (RC) is the oldest Kubernetes controller that ensures a specified number of identical Pods are running at all times.
It was introduced in the earliest versions of Kubernetes and provided the foundation for ReplicaSets. Although it still exists for backward compatibility, it’s considered deprecated ReplicaSets and Deployments have fully replaced it.
ReplicationController Responsibilities
Maintain a specified number of Pod replicas.
Replace failed or deleted Pods.
Scale the number of Pods manually.
It lacks advanced features like set-based selectors, rolling updates, or rollbacks.
ReplicationController YAML Example
Explanation
replicas: Desired number of Pods.
selector: Equality-based label matching only.
template: The Pod spec to use for new Pods.
Commands
You’ll see 3 Pods running. Delete one:
A new one will appear immediately that’s the RC maintaining the desired state.
How These Three Relate ?
Here’s the relationship between them:
And historically:
Feature
ReplicationController
ReplicaSet
Deployment
Purpose
Maintain Pod count
Maintain Pod count (enhanced)
Manage ReplicaSets and handle updates
Selector type
Equality-based
Set-based
Delegated to RS
Rolling updates
Manual
Manual
Automated
Rollbacks
❌
❌
✅
Current status
Legacy
Used by Deployments
Recommended
When you apply a Deployment, you’re really using all three ideas, just abstracted under one powerful controller. Understanding this hierarchy is key to troubleshooting, scaling, and designing resilient workloads in Kubernetes.
Last updated