ReplicaSets act as wrappers around Pods that lets you manage the number of Pods you want to run at a point in time. K8s claims high availability and fault tolerance, and having multiple pods running helps to achieve this. The responsibility of the ReplicaSet is to ensure Kubernetes is running the configured number of Pods.
Even though ReplicaSets are important but you will seldom need to create or manage them directly. Deployments will manage ReplicaSets for you. You would only need to deal with them when you are troubleshooting unexpected problems. Let’s dive deeper to know what exactly are ReplicaSets and the way they work.
What Are ReplicaSets?
A ReplicaSet can be explained as one of the Kubernetes controllers that ensures that we have a specified number of pod replicas running. A controller in Kubernetes is responsible to take care of tasks to ensure the desired state of the cluster matches the observed state.
Without RS, we will have to create multiple manifests for the number of pods we need which is too much work to deploy replicas of a single application. In the earlier versions of Kubernetes, the ReplicaSet was known as Replication Controller. The major difference between the two is that ReplicaSets allow us to use something called Label Selector.
Labels are defined as the key-value pair which are used to specify attributes of objects that are meaningful and useful to users, therefore it does not change the way the core system works. Label Selectors are helpful in identifying a set of objects in Kubernetes.
Kinds Of Operators To Use With ReplicaSets
Three kinds of operators that we can use with ReplicaSets:
a) In
b) Notin
c) Exists
ReplicaSets manages all the pods with labels that match the selector. When pods are created, it does not differentiate between all pods so if you create another ReplicaSets with the same label selector, the former ReplicaSets will think it created those pods, hence causing issues.
Hence, it is important to ensure that label selectors do not match from one ReplicaSets to another.
How Does The ReplicaSet Manifest Look?
APIVersion, kind, and Metadata look like any other object in Kubernetes but the Spec section appear somewhat different from other objects. If you look at the above example there are two Spec’s in the manifest above. The first Spec lets you declare what the ReplicaSet should appear like and the second spec is for containers. “.spec.template” is the only essential field of the first spec section. If you do not specify replicas, it will deploy just one pod. Here, take notice that the “.spec.template.metadata.labels” must resemble exactly what you have in the “.spec.selector” or K8s will not permit it to be created.
apiVersion: apps/v1 # our API version kind: ReplicaSet # The kind we are creating Metadata: # Specify all Metadata like name, labels name: some-name labels: app: some-App tier: some-Tier Spec: replicas: 3 # Here is where we tell k8s how many replicas we want Selector: # This is our label selector field. matchLabels: tier: some-Tier matchExpressions: - {key: tier, operator: In, values: [some-Tier]} # we are using the set-based operators template: metadata: labels: app: some-App tier: someTier Spec: # This spec section should look like spec in a pod definition Containers:
An Example Of ReplicaSet
Now that you have understood what a ReplicaSet is, it is time you create one for yourself. In this case, we will deploy our replica.yaml file which will create a basic frontend nginx app with 3 replicas.
apiVersion: apps/v1 kind: ReplicaSet metadata: name: myapp-replicas labels: app: myapp tier: frontend spec: replicas: 3 selector: matchLabels: tier: frontend matchExpressions: - {key: tier, operator: In, values: [frontend]} template: metadata: labels: app: myapp tier: frontend spec: containers: - name: nginx image: nginx ports: - containerPort: 80
Firstly, to apply our manifest we will run kubectl create command.
$ kubectl create -f replica.yaml replicaset.apps "myapp-replicas" created
Next, you have to ensure it is created.
$ kubectl get replicaset NAME DESIRED CURRENT READY AGE myapp-replicas 3 3 3 15s
We observe that 3 are deployed and 3 are ready. We can also mark a check on the pods as well.
$ kubectl get pod NAME READY STATUS RESTARTS AGE myapp-replicas-67rkp 1/1 Running 0 33s myapp-replicas-6kfd8 1/1 Running 0 33s myapp-replicas-s96sg 1/1 Running 0 33s
Here, we see that all 3 are running with 0 restarts which implies that our application is not crashing. We can also describe the object which will provide us more details about our replicas.
$ kubectl describe replicaset myapp-replicas Name: myapp-replicas Namespace: default Selector: tier=frontend,tier in (frontend) Labels: app=myapp tier=frontend Annotations: Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=myapp tier=frontend Containers: nginx: Image: nginx Port: 80/TCP Host Port: 0/TCP Environment: Mounts: Volumes: Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 12m replicaset-controller Created pod: myapp-replicas-6kfd8 Normal SuccessfulCreate 12m replicaset-controller Created pod: myapp-replicas-67rkp Normal SuccessfulCreate 12m replicaset-controller Created pod: myapp-replicas-s96sg
What If We Need One Replica Instead Of Three?
In such a scenario all we have to do is change the replica field to the value we wish and k8s will scale it to that number. For example, “replicas: 1”. If we make the desired change and re-apply, we will only have one replica running.
Can The Pod Be Removed From A ReplicaSets?
Yes, the pod can be removed from a replicaSets. It is simple like removing the label from the pod and it will automatically be removed from the Set.
How Can You Clean Up RS?
To remove ReplicaSet, you need to run “kubectl delete ReplicaSet myapp-Replicas”. This command will clean up RS and the pods.
Final Words
Generally, Kubernetes recommend that we use deployment(a higher-level concept that manages ReplicaSets and provides declarative updates to pods along with a lot of other useful features) controller instead of ReplicaSets.