Lesson 2.3: ReplicationController, ReplicaSets and Deployments


Replication Controller (RC)

A Replication Controller is a Kubernetes object that ensures a specified number of Pod replicas are running at all times. It is one of the older mechanisms for managing Pods and has largely been replaced by ReplicaSet and Deployment.

Key Features:

  • Self-Healing: If a Pod crashes or is deleted, the Replication Controller creates a new one to replace it.
  • Scaling: You can scale the number of Pods up or down by updating the replicas field.
  • Simple Selectors: Uses label selectors to identify the Pods it manages.

Limitations:

  • Does not support rolling updates or rollbacks.
  • Less flexible than ReplicaSet and Deployment.
[root@master ~]# cat rc.yml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-rc
  labels:
    env: demo
spec:
  template:
    metadata:
      name: nginx-pod
      labels:
        env: demo 
    spec: 
      containers:
      - name: nginx
        image: nginx
  replicas: 3 
 
# Create the Replication Controller
[root@master ~]# kubectl apply -f rc.yml 
replicationcontroller/nginx-rc created
 
# Check the status of Replication Controller
[root@master ~]# kubectl get rc
NAME       DESIRED   CURRENT   READY   AGE
nginx-rc   3         3         3       8s
 
# Check the status of pods
[root@master ~]# kubectl get pods 
NAME             READY   STATUS    RESTARTS   AGE
nginx-rc-bmvsd   1/1     Running   0          27s
nginx-rc-lmwql   1/1     Running   0          27s
nginx-rc-sqflk   1/1     Running   0          27s

ReplicaSet

A ReplicaSet is the next-generation Replication Controller. It ensures that a specified number of Pod replicas are running at all times. It is used internally by Deployments.

Key Features:

  • Self-Healing: Replaces failed or deleted Pods.
  • Advanced Selectors: Supports more advanced label selectors (e.g., matchExpressions) compared to Replication Controller.
  • Scaling: Easily scale the number of Pods up or down.

Limitations:

  • Does not support rolling updates or rollbacks.
  • Less flexible than ReplicaSet and Deployment.
[root@master ~]# cat rs.yml 
apiVersion: apps/v1 
kind: ReplicaSet
metadata:
  name: nginx-rs
  labels:
    env: demo
spec:
  template:
    metadata:
      name: nginx
      labels:
        env: demo
    spec:
      containers:
      - name: nginx
        image: nginx
  replicas: 3 
  selector: 
    matchLabels:
      env: demo 
 
# Create the Replica Set
[root@master ~]# kubectl apply -f rs.yml 
replicaset.apps/nginx-rs created
 
# Check the status of Replica Set
[root@master ~]# kubectl get rs 
NAME       DESIRED   CURRENT   READY   AGE
nginx-rs   3         3         3       8s 
 
# Check the status of pods
[root@master ~]# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-bb9ld   1/1     Running   0          35s
nginx-rs-n498q   1/1     Running   0          35s
nginx-rs-x6m9t   1/1     Running   0          35s
  • replicas: 3: Ensures that 3 Pods are always running.
  • template: Defines the Pod template that the Replication Controller uses to create new Pods.
  • selector: Explicitly specifies the labels (env: demo) to identify the Pods it manages.

Deployment

A Deployment is a higher-level abstraction that manages the deployment and scaling of a set of Pods. It provides declarative updates for Pods and ReplicaSets.

Key Features:

Declarative Updates: You describe the desired state of your application, and the Deployment ensures the actual state matches the desired state.

  • Rolling Updates: Supports zero-downtime updates by gradually replacing old Pods with new ones.
  • Rollback: Allows you to revert to a previous version of the Deployment if something goes wrong.
  • Scaling: Easily scale the number of Pods up or down.
[root@master ~]# cat deploy.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    env: demo
spec:
  template:
    metadata:
      name: nginx
      labels:
        env: demo
    spec:
      containers:
      - name: nginx
        image: nginx
  replicas: 3
  selector: 
    matchLabels:
      env: demo 
 
[root@master ~]# kubectl apply -f deploy.yml 
deployment.apps/nginx-deploy created
 
[root@master ~]# kubectl get deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   3/3     3            3           8s
 
[root@master ~]# kubectl get pods 
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-5699c786d4-26dkw   1/1     Running   0          12s
nginx-deploy-5699c786d4-chtxd   1/1     Running   0          12s
nginx-deploy-5699c786d4-rvrnp   1/1     Running   0          12s
 
[root@master ~]# kubectl get all 
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-5699c786d4-26dkw   1/1     Running   0          24s
pod/nginx-deploy-5699c786d4-chtxd   1/1     Running   0          24s
pod/nginx-deploy-5699c786d4-rvrnp   1/1     Running   0          24s
 
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   36h
 
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   3/3     3            3           24s
 
NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-5699c786d4   3         3         3       24s
  • replicas: 3: Ensures that 3 Pods are always running.
  • template: Defines the Pod template that the Deployment uses to create new Pods.
  • selector: Explicitly specifies the labels (env: demo) to identify the Pods it manages.
  • Rolling Updates: If you update the Pod template (e.g., change the container image), the Deployment will perform a rolling update.

Dry-run method to generate deployment manifest file

It’s a powerful method to generate resource manifests (like Deployments, Pods, Services, etc.) without actually creating the resources in the cluster. Let’s break it down:

kubectl create deployment deploy/nginx-new --image=nginx:1.26.3 --dry-run=client -o yaml > deploy-new.yml
  • kubectl create deployment: This command is used to create a Deployment.

  • deploy/nginx-new: Specifies the name of the Deployment (nginx-new) and its type (deploy).

  • --image=nginx:1.26.3: Specifies the container image to use for the Deployment (nginx:1.26.3).

  • --dry-run=client: This flag tells Kubernetes to simulate the creation of the resource without actually applying it to the cluster. It’s a safe way to test or generate resource manifests.

  • -o yaml: Outputs the generated manifest in YAML format.

  • > deploy-new.yml: Redirects the output to a file (deploy-new.yml) instead of printing it to the terminal.

All systems normal

© 2025 2023 Sanjeeb KC. All rights reserved.