Scaling and Managing Workloads with Replication Controllers, ReplicaSets, and Deployments - Kubernetes

SHRIRAM SAHUSHRIRAM SAHU
6 min read

Welcome to Day 8 of #40DaysOfKubernetes! Today, we will explore essential Kubernetes concepts that help you manage and scale your applications: Replication Controllers, ReplicaSets, and Deployments. We'll also cover how to create these resources using both kubectl commands and YAML configurations, along with some hands-on tasks.

What is a Replication Controller in Kubernetes?

A Replication Controller ensures that a specified number of pod replicas are running at any given time. If a pod fails or is deleted, the Replication Controller will create a new one to maintain the desired state.

Key Characteristics of Replication Controllers:

  • Self-Healing: Automatically replaces failed or deleted pods.

  • Scalability: Easily scales the number of replicas up or down.

  • Rolling Updates: Manages updates to the application without downtime.


What is a ReplicaSet in Kubernetes?

A ReplicaSet is the next-generation Replication Controller with a more flexible and expressive pod selection mechanism. While Replication Controllers use equality-based selectors, ReplicaSets support set-based selectors, allowing more sophisticated pod selection criteria.

Key Characteristics of ReplicaSets:

  • Selector Flexibility: Uses set-based selectors for more advanced pod selection.

  • Backward Compatibility: Supports existing Replication Controller use cases.

  • Integrated with Deployments: Typically used indirectly through Deployments.


Creating a ReplicaSet:

ReplicaSet:https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/

  1. Create a ReplicaSet based on the nginx image with 3 replicas:

  2. Update the replicas to 4 from the YAML:

    Edit the YAML file (e.g., rs.yaml) and change replicas: 3 to replicas: 4, then apply the changes:

     kubectl edit rs/nginx-rs
    

  3. Update the replicas to 6 from the command line:

     kubectl scale rs nginx-rs --replicas=6
    


What is a Deployment in Kubernetes?

A Deployment provides declarative updates to applications, managing ReplicaSets to facilitate the deployment, scaling, and rolling updates of pods. Deployments offer advanced capabilities such as rollback, pause, and resume.

Key Characteristics of Deployments:

  • Declarative Updates: Defines the desired state and lets Kubernetes handle the rest.

  • Rollback: Easily revert to previous versions in case of issues.

  • Pause/Resume: Temporarily halt and resume updates for controlled rollouts.


Creating a Deployment:

Deployment:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

  1. Create a Deployment namednginxwith 3 replicas. The Pods should use thenginx:1.23.0image and the namenginx. The Deployment uses the labeltier=backend. The Pod template should use the labelapp=v1.

     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: nginx-deployment
       labels:
         tier: backend
     spec:
       replicas: 3
       selector:
         matchLabels:
           app: v1
       template:
         metadata:
           labels:
             app: v1
         spec:
           containers:
           - name: nginx
             image: nginx:1.23.0
    
  2. List the Deployment and ensure the correct number of replicas is running:

     kubectl get deploy
    

  3. Update the image to nginx:1.23.4:

     kubectl set image deploy/nginx-deployment nginx=nginx:1.23.4
    

  4. Verify that the change has been rolled out to all replicas:

     kubectl rollout status deploy/nginx-deployment
    

  5. Assign the change cause "Pick up patch version" to the revision:

     kubectl annotate deploy nginx-deployment kubernetes.io/change-cause="Pick up patch version"
    

  6. Scale the Deployment to 5 replicas:

     kubectl scale deploy/nginx-deployment --replicas=5
    

  7. Have a look at the Deployment rollout history:

     kubectl rollout history deploy/nginx-deployment
    

  8. Revert the Deployment to revision 1:

     kubectl rollout undo deploy/nginx-deployment --to-revision=1
    

  9. Ensure that the Pods use the image nginx:1.23.0:

     kubectl describe deploy nginx-deployment
    

  10. Delete the Deployment:

    kubectl delete deploy nginx-deployment
    


1. Troubleshooting the issue:

Apply the below YAML and fix the issue with it

apiVersion: v1
kind:  Deployment
metadata:
  name: nginx-deploy
  labels:
    env: demo
spec:
  template:
    metadata:
      labels:
        env: demo
      name: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
  replicas: 3
  selector:
    matchLabels:
      env: demo

Step 1: Save this YAML to a file (e.g., trouble1.yaml)

Step 2: Apply the YAML File Use the kubectl apply command to create the deployment:

kubectl apply -f nginx-deploy.yaml

Step 3: Identify the Errors

The YAML configuration for the Kubernetes deployment has a few issues:

  • Incorrect API version: The correct API version for Deployment is apps/v1, not v1.

Step 4: Fixing the Errors

Here is the corrected YAML configuration:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    env: demo
spec:
  template:
    metadata:
      labels:
        env: demo
      name: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
  replicas: 3
  selector:
    matchLabels:
      env: demo

In this corrected version:

  • Change the apiVersion from v1 to apps/v1.

Step 5: Verify the Deployment

  1. Check the status of the deployment:

     kubectl get deploy
    

  2. Describe the deployment to ensure everything is configured correctly:

     kubectl describe deploy nginx-deploy
    

By following these steps, you should be able to fix the incorrect API version issue and successfully create the deployment.

Step 8: Monitor the Pods Check the status of the pods created by the deployment:

kubectl get pods

This step-by-step guide should help you troubleshoot and fix the issues with the provided YAML configuration.


2. Troubleshooting the issue:

Let's troubleshoot the given YAML configuration step by step, focusing on the issues present.

Initial YAML Configuration

apiVersion: v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    env: demo
spec:
  template:
    metadata:
      labels:
        env: demo
      name: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
  replicas: 3
  selector:
    matchLabels:
      env: dev

Step 1: Identify the Errors

  1. Incorrect API version: The correct API version for Deployment is apps/v1, not v1.

  2. Mismatch in matchLabels: The matchLabels selector should match the labels in the pod template. Here, the env label in matchLabels is set to dev, while in the pod template it's set to demo.

Step 2: Fix the Errors

Error 1: Correct the API Version

Change the apiVersion from v1 to apps/v1.

Error 2: Match Labels Correctly

Ensure that the matchLabels in the selector matches the labels in the pod template.

Corrected YAML Configuration

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    env: demo
spec:
  template:
    metadata:
      labels:
        env: demo
      name: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
  replicas: 3
  selector:
    matchLabels:
      env: demo

Step 3: Apply the Corrected YAML

Save the corrected configuration to a file name trb.yaml and apply it using kubectl:

kubectl apply -f trb.yaml

Step 4: Verify the Deployment

  1. Check the status of the deployment:

     kubectl get deploy
    

  2. Describe the deployment to ensure everything is configured correctly:

     kubectl describe deploy nginx-deploy
    

By following these steps, you should be able to fix the issues and successfully create the deployment.


Conclusion

In this blog, we explored some essential Kubernetes concepts and practical steps to manage and scale applications using Replication Controllers, ReplicaSets, and Deployments. By understanding the differences and advantages of each resource, you can ensure your applications are resilient, scalable, and easily maintainable.

We walked through creating ReplicaSets and Deployments using both kubectl commands and YAML configurations, emphasizing the importance of declarative management. Additionally, we covered troubleshooting common issues with YAML configurations to ensure smooth deployments.

As you continue your Kubernetes journey, these foundational concepts and hands-on tasks will be invaluable in managing and scaling your applications effectively. Stay tuned for more insights and practical tips in our ongoing #40DaysOfKubernetes challenge!


References

For more detailed information and quick access to Kubernetes commands and concepts, refer to the following resources:

These resources provide comprehensive insights and command references that are essential for managing and scaling your Kubernetes applications effectively.

10
Subscribe to my newsletter

Read articles from SHRIRAM SAHU directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

SHRIRAM SAHU
SHRIRAM SAHU