Skip to main content
In this guide, we review the ReplicaSets lab exercise by detailing each command, expected output, and the rationale behind every step. Follow along to understand how to diagnose issues, update configurations, and scale your ReplicaSet efficiently.

Checking the Initial State

Before proceeding, verify there are no existing Pods or ReplicaSets in your cluster.
  1. List all Pods:
    kubectl get pods
    
    Expected output:
    No resources found in default namespace.
    
    This confirms that there are currently zero Pods running.
  2. List any existing ReplicaSets:
    kubectl get replicaset
    
    The command similarly shows no ReplicaSets at this point.

Verifying the New ReplicaSet

After applying some changes, a new ReplicaSet is created. Confirm its presence using:
kubectl get replicaset
The output should display something similar to:
NAME             DESIRED   CURRENT   READY   AGE
new-replica-set  4         4         0       9s
This indicates that the new ReplicaSet is configured to have 4 Pods. Running the command a second time reaffirms the same output.

Determining the Image Used by the ReplicaSet

To inspect the details of the ReplicaSet and determine which image is assigned to its Pods, execute:
kubectl describe replicaset new-replica-set
Within the Pod Template section under Containers, look for the image field:
Image: busybox777
Also, the command section appears as:
Command:
  sh
  -c
  echo Hello Kubernetes! && sleep 3600
This verifies that the ReplicaSet is initially using the image “busybox777”.

Examining the Pod Readiness Issue

If the Pods are not transitioning to the Ready state, further investigation is required:
  1. Check the replica status:
    kubectl describe replicaset new-replica-set
    
    You should see an excerpt like:
    Replicas: 4 current / 4 desired
    Pods Status: 0 Running / 4 Waiting / 0 Succeeded / 0 Failed
    
  2. Inspect one of the Pods to identify the issue:
    kubectl describe pod new-replica-set-7r2qw
    
    Notice the container is in a Waiting state with the reason:
    Reason: ImagePullBackOff
    
    And an associated event message:
    Failed to pull image "busybox777": ... pull access denied, repository does not exist or may require authorization
    
The error indicates that there is no image named “busybox777” available in the repository. Use the standard BusyBox image instead.

Deleting a Pod Managed by the ReplicaSet

ReplicaSets are designed to maintain the desired number of Pods automatically. Even if you delete a Pod, the ReplicaSet immediately replicates a new one.
  1. List the Pods:
    kubectl get pods
    
    Example output:
    NAME                     READY   STATUS            RESTARTS   AGE
    new-replica-set-wkzjh    0/1     ImagePullBackOff   0          2m59s
    new-replica-set-vpkh8    0/1     ImagePullBackOff   0          2m59s
    new-replica-set-hr2zqw   0/1     ImagePullBackOff   0          2m59s
    new-replica-set-tn2mp    0/1     ImagePullBackOff   0          2m59s
    
  2. Delete one of the Pods:
    kubectl delete pod new-replica-set-wkzjh
    
    Confirmation output:
    pod "new-replica-set-wkzjh" deleted
    
  3. List the Pods again to note that the ReplicaSet has recreated the missing Pod.

Creating ReplicaSets Using YAML Definition Files

Two YAML definition files are located in the /root directory:
  • replicaset-definition-1.yaml
  • replicaset-definition-2.yaml

Fixing the First Definition File

The initial content of replicaset-definition-1.yaml is:
apiVersion: v1
kind: ReplicaSet
metadata:
  name: replicaset-1
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
When running:
kubectl create -f /root/replicaset-definition-1.yaml
you encounter the error:
error: unable to recognize "/root/replicaset-definition-1.yaml": no matches for kind "ReplicaSet" in version "v1"
Inspecting the available API versions with:
kubectl explain replicaset
reveals that the correct API version is apps/v1. Update the file accordingly. After the change, creation should succeed.

Fixing the Second Definition File

The content of replicaset-definition-2.yaml is:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-2
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
Creating it results in the error:
The ReplicaSet "replicaset-2" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"tier":"nginx"}: selector does not match template labels
This occurs because the selector (tier: frontend) does not match the Pod template labels (tier: nginx). Correct the Pod template labels to use tier: frontend so they match the selector. After this fix, create the ReplicaSet again using:
kubectl create -f /root/replicaset-definition-2.yaml
The ReplicaSet “replicaset-2” should now be successfully created.

Deleting Newly Created ReplicaSets

After verification, remove replicaset-1 and replicaset-2 from your cluster.
  1. List the current ReplicaSets to check their status:
    kubectl get rs
    
    Example output:
    NAME                DESIRED   CURRENT   READY   AGE
    new-replica-set     4         4         0       10m
    replicaset-1        2         2         2       3m4s
    replicaset-2        2         2         2       22s
    
  2. Delete the ReplicaSets:
    kubectl delete rs replicaset-1
    kubectl delete rs replicaset-2
    
Confirmation messages will indicate that both ReplicaSets have been removed.

Updating the Original ReplicaSet’s Image

Since the original ReplicaSet (“new-replica-set”) uses an incorrect image (“busybox777”), update it to use the proper BusyBox image.
  1. Edit the ReplicaSet:
    kubectl edit rs new-replica-set
    
    Locate the container section and update the image field:
    containers:
      - name: busybox-container
        image: busybox
    
  2. Save the changes and verify by describing the ReplicaSet:
    kubectl describe rs new-replica-set
    
Despite the update, existing Pods may still reflect the previous error because updating the ReplicaSet does not restart the existing Pods. To resolve this issue, manually delete the problematic Pods so that the ReplicaSet creates new ones with the corrected image:
kubectl delete pod new-replica-set-vpkh8 new-replica-set-tn2mp new-replica-set-7r2qw
After a short wait, list the Pods again:
kubectl get pods
New Pods should appear and transition to the Running state.

Scaling the ReplicaSet

Scaling Up

To increase the ReplicaSet to five replicas, run:
kubectl scale rs new-replica-set --replicas=5
Then verify the updated Pod count:
kubectl get pods
Expected output:
NAME                       READY   STATUS    RESTARTS   AGE
new-replica-set-f5gth      1/1     Running   0          55s
new-replica-set-nsbgx      1/1     Running   0          55s
new-replica-set-8z7z5      1/1     Running   0          55s
new-replica-set-whhll      1/1     Running   0          55s
new-replica-set-mwpnz      1/1     Running   0          4s

Scaling Down

To scale the ReplicaSet down, you can edit the resource directly:
  1. Open the ReplicaSet for editing:
    kubectl edit rs new-replica-set
    
  2. Modify the replicas value from 5 to 2 in the YAML:
    spec:
      replicas: 2
    
  3. Save your changes. Verify the update with:
    kubectl get rs new-replica-set
    
The ReplicaSet will now adjust to maintain only two Pods.

Final Commands Recap

Below is a summary of the commands used throughout this lab exercise:
# Check initial state
kubectl get pods
kubectl get replicaset

# After changes, verify new ReplicaSet and its details
kubectl get replicaset
kubectl describe replicaset new-replica-set

# Determine the image used and check Pod error
kubectl describe pod new-replica-set-7r2qw

# Demonstrate automatic Pod replacement
kubectl delete pod new-replica-set-wkzjh
kubectl get pods

# Create ReplicaSets from YAML and fix errors
kubectl create -f /root/replicaset-definition-1.yaml
kubectl create -f /root/replicaset-definition-2.yaml

# Delete newly created ReplicaSets
kubectl delete rs replicaset-1
kubectl delete rs replicaset-2

# Update the image in the original ReplicaSet
kubectl edit rs new-replica-set

# Delete faulty Pods so new ones are created with the correct image
kubectl delete pod new-replica-set-vpkh8 new-replica-set-tn2mp new-replica-set-7r2qw

# Scale the ReplicaSet upward
kubectl scale rs new-replica-set --replicas=5
kubectl get pods

# Scale the ReplicaSet downward using editing
kubectl edit rs new-replica-set
Happy learning and successful Kubernetes management!