Docker Certified Associate Exam Course

Kubernetes

Demo Replica Sets

In this guide, you’ll learn how to define, deploy, self-heal, and scale a Kubernetes ReplicaSet. A ReplicaSet ensures a specified number of Pod replicas are running at all times, providing high availability and fault tolerance.

Directory Structure

Assuming your project root is named Kubernetes-for-Beginners, the layout might look like this:

Kubernetes-for-Beginners/
├── pods/
│   └── nginx.yaml
└── replicasets/
    └── replicaset.yaml

1. Defining the ReplicaSet

Create the file replicasets/replicaset.yaml:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
  labels:
    app: myapp
spec:
  selector:
    matchLabels:
      env: production
  replicas: 3
  template:
    metadata:
      name: nginx-2
      labels:
        env: production
    spec:
      containers:
        - name: nginx
          image: nginx

Note

The selector.matchLabels field must exactly match the labels under template.metadata.labels. The labels in metadata.labels on the ReplicaSet itself are not used for Pod selection.

For reference, here’s the original Pod definition in pods/nginx.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-2
  labels:
    env: production
spec:
  containers:
    - name: nginx
      image: nginx

2. Deploying the ReplicaSet

From the project root, apply the ReplicaSet manifest:

cd replicasets
kubectl create -f replicaset.yaml

Verify the ReplicaSet and its Pods:

kubectl get replicaset
# NAME                DESIRED   CURRENT   READY   AGE
kubectl get pods
# NAME                         READY   STATUS    RESTARTS   AGE
# myapp-replicaset-8nxxl       1/1     Running   0          24s
# myapp-replicaset-jlgr2       1/1     Running   0          24s
# myapp-replicaset-pm4rl       1/1     Running   0          24s
CommandDescription
kubectl create -f <file>Create resources from a manifest file
kubectl get replicasetList all ReplicaSets in the current namespace
kubectl get podsList all Pods in the current namespace

3. ReplicaSet Self-Healing

To observe self-healing, delete one of the Pods:

kubectl delete pod myapp-replicaset-8nxxl

After a few seconds, the ReplicaSet controller will recreate a replacement Pod:

kubectl get pods
# NAME                         READY   STATUS    RESTARTS   AGE
# myapp-replicaset-jlgr2       1/1     Running   0          45s
# myapp-replicaset-pm4rl       1/1     Running   0          45s
# myapp-replicaset-<new-id>    1/1     Running   0          15s

You can inspect events to confirm:

kubectl describe replicaset myapp-replicaset

Check the Events section for Pod creation and deletion entries.

4. Preventing Extra Pods

If you manually create a Pod matching the ReplicaSet’s selector, the controller will delete it to maintain the desired count.

# pods/nginx.yaml (modified)
apiVersion: v1
kind: Pod
metadata:
  name: nginx-external
  labels:
    env: production
spec:
  containers:
    - name: nginx
      image: nginx
kubectl create -f ../pods/nginx.yaml
kubectl get pods
# NAME                         READY   STATUS        RESTARTS   AGE
# myapp-replicaset-...         1/1     Running       0          2m
# nginx-external               0/1     Terminating   0          5s

Warning

The ReplicaSet controller enforces the desired replica count by deleting any excess Pods that match its selector.

5. Scaling the ReplicaSet

5.1 Using kubectl edit

kubectl edit replicaset myapp-replicaset

Locate the spec.replicas field and adjust it:

 spec:
-  replicas: 3
+  replicas: 4

Save and exit. Verify new Pod creation:

kubectl get pods
# myapp-replicaset-...   1/1   Running   0   6s

5.2 Using kubectl scale

kubectl scale replicaset myapp-replicaset --replicas=2
kubectl get pods
# NAME                         READY   STATUS    RESTARTS   AGE
# myapp-replicaset-jlgr2       1/1     Running   0          6m
# myapp-replicaset-pm4rl       1/1     Running   0          6m

Excess Pods beyond the new replica count are gracefully terminated.


Watch Video

Watch video content

Previous
Replication Controllers and ReplicaSets