Distribuyendo Carga en Google Cloud en Porcentajes Diferentes (Traffic Load Balancing)

Yury Niño
google-cloud-hispanoamerica
4 min readOct 31, 2023

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:

Figura 1. Creación del Balanceador de Carga

Paso 2. Asignar el nombre, para este caso se usó eb021:

Figura 2. Asignación de nombre del Balanceador de Carga.

Paso 3. En la opción backend elegir “Internet Network Endpoint Group” y hacer clic en Create

Figura 3. Selección de Servicios Backend.

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

Figura 4. Crear un Network Endpoint Group
Figura 5. Crear un Network Endpoint Group

Paso 5. Configurar los routing rules como se indica en la imagen eligiendo “Advanced host and path rule”:

Figura 6. Configuración de Routing Rules

Paso 6. Configurar el “default host and path rule”

Figura 7. Configuración de Default Host & 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
Figura 8. Adición de host y path rule

¡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.

--

--

Yury Niño
google-cloud-hispanoamerica

Cloud Infrastructure Engineer @Google. Chaos Engineer Advocate. Loves building software applications, DevOps, Security and SRE