Tengo una aplicación web basada en Java que se implementa en jboss-10.1.0(wildfly) . Estoy usando el modo docker swarm (docker versión 1.12.1 ) para escalar mi aplicación, todo funciona perfectamente, pero el único problema al que me enfrento es la administración de sesiones.
Ahora tomemos el escenario.
Tengo dos instancias ejecutándose para mi aplicación (es decir, App1 y App2 ). Estoy usando el balanceador de carga predeterminado proporcionado por el modo de enjambre de docker con nginx para redirigir mi aplicación de chintan.test.com:9080 a chintan.test.com:80 entonces que no necesito anotar el puerto con mi url y puedo acceder directamente con esta URL chintan.test.com .
Ahora, el balanceador de carga predeterminado usa RR ( Round-Robin algorithm ) para atender mi solicitud web. Entonces, la primera vez que visito chintan.test.com va a la instancia de App1 y muestra la página de inicio de sesión. Ingreso con credenciales y todo funciona perfectamente después de unos pocos minutos, cambia a App2 y nuevamente aparece la página de inicio de sesión.
¿Hay alguna forma o herramienta (debería ser de código abierto) a través de la cual maneje las sesiones? Entonces, al menos inicio sesión en App1 y me quedo en App1 hasta que cierre la sesión.
¡Gracias!
Intenté usar Nginx y HA-Proxy, pero ninguno de ellos parece funcionar bien en el modo SWARM. Luego usé Traefik en Docker Swarm y funcionó para mí. La única restricción es que Traefik debe ejecutarse en el nodo del administrador, ya que debe estar al tanto de los nuevos nodos de trabajo que se agregan o eliminan. No requiere reiniciar incluso si amplía el servicio, agrega nodos, etc.
Probé la configuración con Docker compose versión 3, que es la última y se implementó con Docker stack deployment . Las instrucciones paso a paso están aquí.
Para comenzar, debe crear un docker-compose.yml (versión 3) y agregar el balanceador de carga Traefik Image. Así es como esto luce
loadbalancer: image: traefik command: --docker \ --docker.swarmmode \ --docker.watch \ --web \ --loglevel=DEBUG ports: - 80:80 - 9090:8080 volumes: - /var/run/docker.sock:/var/run/docker.sock deploy: restart_policy: condition: any mode: replicated replicas: 1 update_config: delay: 2s placement: constraints: [node.role == manager]y luego la imagen para la que necesita permanencia en la sesión
whoami: image: tutum/hello-world networks: - net ports: - "80" deploy: restart_policy: condition: any mode: replicated replicas: 5 placement: constraints: [node.role == worker] update_config: delay: 2s labels: - "traefik.docker.network=test_net" - "traefik.port=80" - "traefik.frontend.rule=PathPrefix:/hello;" - "traefik.backend.loadbalancer.sticky=true"Puedes seguir este enlace para una explicación detallada.
El enjambre de Docker actualmente no admite sesiones pegajosas, el round robin es la única forma de acceder a los servicios por sus puertos expuestos.
Para implementar sesiones persistentes, debe implementar un proxy inverso dentro de la ventana acoplable que admita sesiones persistentes y se comunique directamente con los contenedores por su ID de contenedor (en lugar de realizar una búsqueda de DNS en el nombre del servicio que nuevamente iría a la carga por turnos). balancín). La implementación de ese equilibrador de carga también requeriría que implemente su propia herramienta de descubrimiento de servicios para que sepa qué contenedores están disponibles.
Creo que la mejor manera de implementar sesiones pegajosas en un entorno escalado es a través del almacenamiento de sesiones de base de datos. Esto desvinculará su aplicación a nodos específicos.
Creo que esta es una configuración más fácil y rentable que confiar en las sesiones Sticky de Docker Enterprise ( https://docs.docker.com/datacenter/ucp/2.2/guides/user/services/use-domain-names-to- servicios de acceso/#sticky-sessions ).
Por supuesto, esto implica un par de ajustes en la aplicación como:
Esta técnica también puede proporcionar otros beneficios:
Espero que esto ayude.