Escalabilidad con Docker Compose

Advertisements

Docker Compose permite crear múltiples replicas de una mismo servicio, proporcionando escalabilidad a las aplicaciones. Al tener multiples replicas de un mismo servicio, estos pueden distribuir la carga de trabajo, por lo tanto soportando un mayor número de operaciones.

YAML

Esto se realiza por medio del campo services.<myservice>.deploy.replicas. La cual permite indicar cuantas replicas del mismo servicio serán creadas.

Ahora bien, Docker-Compose es un orquestador básico, por lo cual esto requiere algunos pasos extra para hacerlo posible. A diferencia de orquestadores más completos como Docker-Swarm o Kubernetes, es necesario crear un servicio que sirva de “reverse proxy” y realice el balanceo de carga entre las distintas instancias de un mismo servicio.

Indicando replicas a un servicio

Vamos a comenzar con un archivo docker-compose.yaml que declara 2 servicios, el primero para una base de datos MySQL y el segundo para una aplicación que consume dicha instancia base de datos.

YAML

Se puede entonces agregar los campos deploy.replicas al servicio book-service indicando la cantidad de instancias deseadas. Y además remover las lineas correspondientes a los puertos indicados en este servicio, de otra manera, al haber 2 o más instancias/replicas del mismo servicio habría un conflicto con el uso de puertos y el deployment fallaría.

YAML

Si iniciamos los servicios docker-compose up -d se puede observar como se han creado 3 instancias del servicio book-service.

Advertisements
Shell

Sin embargo, hay dos problemas que se deben corregir aún, para que se pueda hacer uso de la escabilidad proporcionada por esta nuevas instancias.

  1. No hay una distribución de cargas entre las instancias.
  2. Los puertos no están exponiendo ningún endpoint para acceder a sus endpoints.

Usando un Reverse Proxy

Se utilizará Nginx como reverse proxy, para que sea el punto de entrada de los servicios que están replicados. Nginx recibirá las solicitudes HTTP, y las redireccionará al servicio de docker-compose y este a una de sus múltiples instancias, resolviendo a la vez el problema del balanceo de cargas.

  • Se crea un archivo reverse_proxy.conf, y lo se guarda junto al archivo docker-compose.yaml. Este archivo es la configuracion de NGINX para un reverse proxy.
reverse_proxy.conf

Esta instrucciones dicen que cuando NGINX lea el puerto 80, en localhost, redireccione al URL http://book-service:8080/. Es decir, que redireccione al DNS interno del servicio book-service.

  • En el archivo docker-compose.yaml se agrega un nuevo servicio reverse-proxy:
YAML

Este servicio se llama reverse-proxy, su imagen es nginx:latest, utiliza el archivo de configuracion creado anteriormente reverse_proxy.conf, y mapeo el puerto 80 de nginx con el 8080 que es expuesto externamente.

  • Finalmente el archivo docker-compose.yaml debe lucir como este:
YAML
  • Se inicia la orquestración con docker-compose con la instrucción:
Shell

Una vez iniciados las aplicaciones, se puede ver como hay 3 instancias para el servicio book-service, además de un reverse-proxy escuchando al puerto 8080.

Shell

Finalmente se accede al URL del servicio:

Conclusión

Docker-Compose permite escalar sus servicios para proporcionar multiples instancias, y por medio de una configuración sencilla agregar un reverse-proxy que nos ayude a proporcionar el balanceo de carga y complementar funcionalidades necesarias.

Referencias

Advertisements

Leave a Reply

Your email address will not be published. Required fields are marked *