Kubernetes: ReplicaSet

Hablamos un poco sobre que es un Replication Controller y las diferencias con un ReplicaSet

Los controladores son los que monitorizan los objectos de kubernetes y actuan en consecuencia.  En este apartado vamos a hablar de un controlador en particular. El controlador de replicas.

¿Qué es una réplica y por qué necesitamos un controlador de este tipo? Si solo disponemos de un Pod con nuestra aplicación y este falla los usuarios ya no podrán acceder a esta. Para evitar que estos casos los usuarios ya no puedan acceder a la aplicación nos gustaría tener más de un Pod ejecutandose, de esa forma, si uno falla nuestra aplicación estará accesible.

El controlador de réplica nos ayuda a tener varias instancias de un Pod y agruparlas, lo que nos va a proporcionar un sistema de alta disponibilidad. Si solo queremos tener un Pod ¿Significa que no tenemos usar el controlador de réplicas? No. Ya que el controlador de réplicas, incluso usando una sola instancia de un Pod, puede abrir automáticamente una nueva cuando falla la instancia existente. Nos asegura que tengamos ejecutandose la candiad de Pods especificada.

Otra razón por la que necesitamos usar un controlador de réplicas y tener varias instancias de nuestra aplicación es el balanceo de carga entre ellas.

No debemos confundir el controlador de réplicas con ReplicaSet. Ambos son terminos similares y tienen el mismo proposito, pero no son lo mismo. Replication controller es la forma antigua de configurar réplicas que está siendo substituida por ReplicaSet.

¿Cómo se crea un controlador de replicas?

Como hemos visto en los Pods podemos crearlos usando ficheros yaml por lo que vamos a crear un fichero para definir como es nuestro controlador:

apiVersion: v1
kind: ReplicationController
metadata:
	name: custom-app
	labels:
		app: custom
		type: front-end
spec:
	template:
		metadata:
			name: custom-pod
			labels:
				app: custom
				type: front-pod
		spec:
			containers:
				- name: nginx-container
				  image: nginx
replicas: 5

Igual que en los otros ficheros yaml que hemos visto para crear los Pods tiene 4 secciones; apiVersion, kind, metadata y spec. Como vemos no cambia mucho con respecto a lo que ya hemos visto, salvo por la sección spec. En la sección spec se define que contiene el objecto que estamos creando. En los replication controller se definen los pods que va a contener mediante la subsección "template" que usará para crear las réplicas. 

La última sección "replicas" se le indica el número de réplicas que queremos tener. Una vez creado nuestro fichero de réplicas podemos crearlas usando el siguiente comando.

$ kubectl create -f replicas-definition.yml

Hasta ahora hemos visto lo que es un controlador de réplicas ahora vamos a ver lo que es el ReplicaSet, que es muy similar. 

apiVersion: apps/v1
kind: ReplicaSet
metadata:
	name: custom-app
	labels:
		app: custom
		type: front-end
spec:
	template:
		metadata:
			name: custom-pod
			labels:
				app: custom
				type: front-end
		spec:
			containers:
				- name: nginx-container
				  image: nginx
replicas: 5
selector: 
	matchLabels:
		type: front-end

La diferencia más importante entre ReplicaSet y Replication Controller es la definición de selector. Selector nos sirve para indicarle que Pods tiene que monitorizar, formen o no parte del ReplicaSet. Esto quiere decir que si ya disponemos de 5 (el número de replicas de nuestro ejemplo) instancias ejecutándose que coinciden con nuestro selector no va a crear las réplicas las va a monitorizar y en el caso de que una o varias dejen de funcionar creará nuevas para mantener el número de réplicas definido.

¿Cómo escalar un ReplicaSet?

Hay dos formas de hacer esto. La primera es cambiando el fichero de definición yml y haciendo un replace:

$ kubectl replace -f replicas-definition.yml

La segunda forma es usando scale para indicarle el nuevo número de réplicas y usar el fichero yml como entrada.

$ kubectl scale --replias=8 -f replicas-definition.yml

Existen también formas de escalado automático de réplicas, pero es algo que intentaremos ver más adelante.

También te puede interesar: