El equilibrador de carga de Kubernetes con sesión fija siempre envía tráfico a un pod.

El equilibrador de carga de Kubernetes con sesión fija siempre envía tráfico a un pod.

Tengo un problema con la configuración de mi balanceador de carga donde siempre redirige la mayor parte del tráfico (como el 99%) a un pod. Básicamente la infraestructura es como se muestra.en este diagrama. El objetivo es que necesito habilitar la sesión fija, ya sea en nginx o en el balanceador de carga de Google, y que mi tráfico se distribuya equitativamente entre los pods disponibles.

Brevemente, tengo 2 RC y 2 servicios en mi clúster. 1 módulo de nginx se sirve detrás de un Google Loadbalancer (nginx-lb) y otro equilibrador de carga (app-lb) para equilibrar el tráfico a 2 módulos de aplicaciones. Esto es lo que pensé de la configuración:

  • nginx-lb: configuré nginx-lb en sessionAffinity: Noney externalTrafficPolicy: Localporque creo que no necesito una sesión fija ahora, pero sí necesitopasar por la IP del usuario. En este punto, todo el tráfico entrante se tratará de la misma manera, pero estamos intentando preservar la IP del usuario configurando externalTrafficPolicy: Local.

  • nginx: el propio nginx está habilitadongx_http_realip_modulepara mantener la IP del usuario reenviada, pero no usé ip_hash aquí porque sigo pensando que todavía no necesitamos una sesión fija aquí. Nuevamente, al igual que nginx-lb, intento pasar todo el tráfico entrante pero preservar la IP del usuario. El nginx aquí es principalmente para proxy y controlador SSL.

  • app-lb: Luego viene a app-lb donde habilité sessionAffinity: ClientIPla sesión fija y externalTrafficPolicy: Clusterparabalanceo de carga. Creo que aquí es donde ocurre el equilibrio de carga real mediante ClientIP, ya que este es el único servicio que tiene/conoce 2 pods detrás.

Probé esta configuración con aproximadamente 50 usuarios ejecutándose durante un día pero aún redirigiendo a un pod, mientras que el otro pod está inactivo con un uso bajo de CPU y memoria en comparación con el primero.

Me gustaría preguntar con la configuración: ¿estoy acertando con lo que quiero lograr? ¿Hay alguna configuración que me falta? Cualquier aportación será muy apreciada.

PD. Reescribo toda la pregunta para agregar más datos de lo que he entendido, pero básicamente sigo siendo relevante para la pregunta original con diferentes redacciones.

Respuesta1

Esto sucede porque estás usando sessionAffinity: ClientIP, esta es la afinidad en el servicio y está basada en ip, por lo que el servicio obtiene la ip de tu balanceador de carga, intenta usarla sessionAffinity: Noney, si quieres usar una sesión fija, usa el controlador de ingreso nginx.

Respuesta2

¿Has probado a probar tus apps con una cantidad mayor de clientes que tu móvil y tu portátil?
Quizás puedas probarlo desde varias instancias del motor informático de Google.

Dado que está implementando tanto la sesión fija como el equilibrio de carga, ip_hashtiene un 50% de probabilidad de que dos dispositivos sean atendidos por el mismo pod e incluso si recarga la página, siempre será atendido por el mismo pod hasta que cambie de IP.

Con ip-hash, la dirección IP del cliente se utiliza como clave hash para determinar qué servidor de un grupo de servidores debe seleccionarse para las solicitudes del cliente. Este método garantiza que las solicitudes del mismo cliente siempre se dirigirán al mismo servidor, excepto cuando este servidor no esté disponible. http://nginx.org/en/docs/http/load_balancing.html

información relacionada