A ReplicaSet helps load balance and scale our Application up or down when the demand for it changes. It makes sure the desired number of pods are always running for high availability.
I’m using VS Code on Mac to create the below yaml file.
Create the following yaml file:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
labels:
app: myapp
spec:
selector:
matchLabels:
app: myapp
replicas: 3
template:
metadata:
name: nginx-2
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx
The above yaml file has 4 main properties which are apiVersion, kind, metadata and spec. The spec contains the definition for the number of replicas and the containers to be created inside the pods.
Run the following command:
$ kubectl create -f ReplicaSetsDemo.yaml
replicaset.apps/myapp-replicaset created
Now let’s check the status of the replicaSet and then the pods:
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
myapp-replicaset 3 3 3 2m29s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-replicaset-s7jm7 1/1 Running 0 33s
myapp-replicaset-svqvm 1/1 Running 0 33s
myapp-replicaset-xnbbq 1/1 Running 0 33s
The above command shows 3 pods created for nginx with the name of the replicaset prefixed. A replicaset ensures that sufficient number of replicas or pods are available at all times.
Now, let’s delete a pod:
$ kubectl delete pod myapp-replicaset-s7jm7
pod "myapp-replicaset-s7jm7" deleted
Check the status of the pods again:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-replicaset-d7f88 1/1 Running 0 36s
myapp-replicaset-svqvm 1/1 Running 0 5m53s
myapp-replicaset-xnbbq 1/1 Running 0 5m53s
Notice that there are still 3 pods running as one more pod was created to maintain the desired state. Also, if you try to create a pod with the same label app=myapp outside of the replicaset, it’ll still come under the purview of the replicaset we created and will terminate that pod to maintain the desired state of 3 replicas. This is where it differs from a Replication Controller.
Now, let’s edit the replicaset to scale it up as below:
$ kubectl edit replicaset myapp-replicaset
The above command let’s you edit the in-memory configuration file that Kubernetes creates. Search for the replicas section and edit it to 4 using the vi editor commands and save it with wq!
Upon saving you’ll see the output as:
replicaset.apps/myapp-replicaset edited
Check the pods status and you’ll see and additional pod created:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-replicaset-d7f88 1/1 Running 0 14m
myapp-replicaset-pnlvh 1/1 Running 0 55s
myapp-replicaset-svqvm 1/1 Running 0 19m
myapp-replicaset-xnbbq 1/1 Running 0 19m
Another way to scale the replicaset is to use the below command and check the status again:
$ kubectl scale replicaset myapp-replicaset --replicas=2
replicaset.apps/myapp-replicaset scaled
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-replicaset-svqvm 1/1 Running 0 22m
myapp-replicaset-xnbbq 1/1 Running 0 22m
Notice that the pods are scaled down to 2 only as other 2 got terminated.