12 abr

Balanceo de servicios con Marathon en Mesos

Dentro de la temática de los últimos post sobre Mesos, esta vez vamos a explicar como conseguir balanceo de servicios con Marathon en Mesos o sea tener un montón de servicios corriendo a través de Marathon en nuestro cluster de Mesos y poder trabajar con ellos a lo unisono.

Primero de todo debemos ver donde esta el problema, tenerlo claro para entender la solución.

Imaginemos que tenemos un servidor web, como hemos explicado en los post anteriores este servicio puede correr en cualquier puerto en cualquier nodo del cluster, es mas podemos tener mil servicios iguales en el mismo nodo corriendo en diferentes puertos. Como es de esperar esto hace muy difícil poder utilizarlos todos como si fuera uno solo (idea principal)

Vamos a verlo en una imagine

Balanceo de servicios con Marathon en Mesos

Balanceo de servicios con Marathon en Mesos

  1. Tenemos dos Slaves
  2. Tenemos los servicios (SVC 1 y 2) corriendo en los puertos 31000 y 31200, como sabemos estoy puertos son asignados aleatoriamente por Marathon.
  3. Nos interesa que cuando accedamos al puerto X este nos envíe a uno de los servicios (SVC) que este corriendo en el cluster.

Ahora que vemos la problemática vamos a ver como al solucionamos, al lío!

Balanceo de servicios con Marathon en apache mesos

Nota: Debemos quedarnos con la idea, la solución propuesta nos puede gustar más o menos

Instalaremos un HAProxy en cada nodo de Slave, Marathon nos ofrece un script que nos facilita la solución.

Instalación balanceo de servicios

Descargamos e instalamos en cada nodo el siguiente script, lo que hace es conectarse a la api de Marathon para sacar información de en qué puerto esta corriendo los servicios.

wget https://raw.githubusercontent.com/mesosphere/marathon/master/bin/haproxy-marathon-bridge

Necesita saber las urls y puertos donde esta corriendo Marathon, en nuestro caso esta en los nodos master, para ello crearemos un fichero y pondremos la información

/etc/haproxy-marathon-bridge/marathons

Y añadimos

marathon1.company.com:8080
marathon2.company.com:8080
marathon3.company.com:8080

Por último, deberemos añadir un cron que se ejecute cada minuto, de tal manera que se conecte a la API de Marathon vea en que puertos esta corriendo nuestros servicios y nos lo añada a la configuración de HA proxy.

./haproxy-marathon-bridge install_cronjob

Vamos a ver un ejemplo de como funciona esta solución.

Primero de todo os explico la situación inicial, para que podáis entender rápidamente el gif que hay mas abajo.

Balanceo de servicios con Marathon en Mesos

Balanceo de servicios con Marathon en Mesos

Tenemos un json que nos crea en el cluster de Mesos instancias http con python a través de Marathon, en la situación inicial tenemos 1 instancia corriendo únicamente.

Haremos incrementar el numero de instancias a 10, de tal manera que tendremos 10 instancias en el cluster corriendo en puertos aleatorios, y veremos como la configuración de HAProxy se actualiza con las nuevas instancias.

Por último veremos como atacando al puerto 8080 (puerto que decidimos donde queríamos tener el servicio corriendo), veremos el slave host, donde estamos atacando y veremos como se van balanceando las peticiones.

Tendremos

  • Panel 0 : Donde lanzaremos el curl para incrementar el numero de instancias.
  • Panel 1 : Número de servicio http que tenemos en un salve, situación inicial 1
  • Panel 2 : Curl al servicio web donde veremos como entre en el balanceo un nuevo salve.
  • Panel 3 : Configuración de HAProxy
Balanceo de servicios con Marathon en Mesos

Balanceo de servicios con Marathon en Mesos

Como podemos ver, con esta solución lo que conseguimos es poder escalar nuestras aplicaciones sin necesidad de “preocuparnos” del puerto en el que esta corriendo.

El concepto cambia, escalamos aplicaciones, no escalamos servidores para montar aplicaciones.

Ahora reflexionemos sobre ello.