Distribuyendo Carga en Google Cloud en Porcentajes Diferentes (Traffic Load Balancing)
Autor: Matías Alonso
Los sistemas de información modernos atienden millones de peticiones de usuarios de distintas regiones geográficas distribuidas en todo el mundo, lo que hasta hace unos años representó un desafío para los equipos de infraestructura. Con el fin de superar ese desafío, la industria encontró una forma eficaz de distribuir las cargas de trabajo entre los servidores mediante Balanceadores de Carga, un concepto que se extrapola de las arquitecturas on-prem a las soluciones en nube. En la actualidad, los proveedores de nube ofrecen implementaciones sofisticadas que permiten maximizar la velocidad y la utilización de la capacidad de los balanceadores.
Los Balanceadores de Carga en Google Cloud ofrecen funcionalidades que permiten dividir el tráfico en partes iguales, lo que garantiza que los back-ends no se saturen, y que todas las peticiones se gestionen con facilidad y eficacia.
Sin embargo, recientemente uno de nuestros clientes recibió un requerimiento común en despliegues canary o blue-green, en los que los balanceadores podrían distribuir el tráfico en proporciones diferentes: 80% hacía un clúster de GKE y 20% hacía el otro. Desde que esto no es posible a través de la consola gráfica, a continuación se provee una guía para la implementación de una solución basada en la modificación del archivo YAML del balanceador que define las reglas de ruteo de tráfico.
Paso 1. Crear un application http/s external load balancer:
Paso 2. Asignar el nombre, para este caso se usó eb021:
Paso 3. En la opción backend elegir “Internet Network Endpoint Group” y hacer clic en Create
Paso 4. Crear un internet network endpoint group como se indica en las imágenes. En la parte de “New network endpoint” está tanto la opción de usar la IP pública del backend o sun FQDN
Paso 5. Configurar los routing rules como se indica en la imagen eligiendo “Advanced host and path rule”:
Paso 6. Configurar el “default host and path rule”
Paso 7. En la opción add host and path rule editar el código YAML tipo Envoy como se indica en el ejemplo (para un projectid=projectmaitas02 y backends elbinternalbakcend02 elbinernalbackend02maita01) a continuación para hacer traffic splitting 80/20 entre los internet NEG:
defaultService: projects/projectmaitas02/global/backendServices/backend03
name: path-matcher-1
routeRules:
- matchRules:
- prefixMatch: /
priority: 1
routeAction:
weightedBackendServices:
- backendService: projects/projectmaitas02/global/backendServices/backend03
weight: 80
- backendService: projects/projectmaitas02/global/backendServices/backend04
weight: 20
¡Y voila! Tienes un Balanceador de Carga con Distribución ajustada a tus necesidades.
Pasos Opcionales. YAML para 2 path distintos (para el “/color” con sobre escritura de “/” antes de enviar al backend y para él “/”), cada uno 2 backends y distinto weight:
defaultService: projects/projectmaitas02/global/backendServices/backend03
name: path-matcher-1
routeRules:
- matchRules:
- prefixMatch: /color
priority: 1
routeAction:
weightedBackendServices:
- backendService: projects/projectmaitas02/global/backendServices/bluebackend02
weight: 50
- backendService: projects/projectmaitas02/global/backendServices/redbackend03
weight: 50
urlRewrite:
pathPrefixRewrite: /
- matchRules:
- prefixMatch: /
priority: 3
routeAction:
weightedBackendServices:
- backendService: projects/projectmaitas02/global/backendServices/backend03
weight: 50
- backendService: projects/projectmaitas02/global/backendServices/backend04
weight: 50
Conclusión
La gestión eficiente del tráfico que reciben las aplicaciones en Internet es un requerimiento común de las organizaciones y aunque los proveedores de nube ofrecen capacidades que permiten alcanzar estos requerimientos, la naturaleza de las organizaciones que los usan eventualmente requiere que se hagan extensiones a las funcionales por defecto. En este orden de ideas, este artículo presentó una estrategia flexible que integra la interacción entre la consola gráfica y la modificación de definiciones en código para precisamente extender la funcionalidad ofrecida por Google y alcanzar requerimientos que involucran la distribución de carga en proporciones diferentes.