Balanceo de carga de Docker Swarm con NGINX y NGINX Plus

NGINX | 14 de diciembre de 2016

Este mes de septiembre, en nginx.conf 2016, celebrado en Austin, ofrecí una presentación sobre el uso de NGINX y NGINX Plus en un clúster de Docker Swarm. En este artículo explico cómo utilizar NGINX y NGINX Plus para equilibrar la carga de Docker Swarm junto con las funciones incorporadas en Docker 1.12. Todos los archivos que utilicé durante mi demostración en nginx.conf (y algunos más) están disponibles en GitHub para que podáis experimentar con ellos.

Descripción general

La versión 1.12 de Docker, publicada a finales de julio de 2016, integra Docker Engine y Swarm y añade nuevas funciones de orquestación para crear una plataforma similar a otras plataformas de contenedores, como Kubernetes. En Docker 1.12, el modo Swarm permite combinar un conjunto de hosts de Docker en un swarm, lo que proporciona una arquitectura descentralizada, tolerante a fallos y con capacidad de autorrecuperación. La nueva plataforma también facilita la configuración de un clúster de Swarm, protege todos los nodos mediante una clave y cifra con TLS todas las comunicaciones entre ellos.

Al mismo tiempo, la API de Docker se ha ampliado para reconocer los servicios, que son conjuntos de contenedores que utilizan la misma imagen (similares a los servicios de Docker Compose, pero con más funciones). Puede crear y escalar servicios, realizar actualizaciones graduales, crear comprobaciones de estado y mucho más. El descubrimiento de servicios mediante DNS y el equilibrio de carga están integrados, y también puede configurar redes superpuestas para todo el clúster.

Topología del balanceo de carga de Docker Swarm

Para esta explicación y demostración, dispongo de tres nodos de Swarm: un administrador y dos trabajadores. Los comandos de Swarm se ejecutan en el nodo administrador. Swarm se encarga de la programación, la detección de servicios mediante DNS, el escalado y el balanceo de carga de los contenedores (representados en la figura mediante los recuadros pequeños) en todos los nodos.

Topología del balanceo de carga de Docker, con un nodo administrador de Swarm y dos nodos de trabajo de Swarm
Figura 1. Un clúster de Docker Swarm con un nodo administrador y dos nodos de trabajo

Para proporcionar comunicaciones de red privadas entre los contenedores de un clúster, estos pueden conectarse a varias redes superpuestas internas que abarcan todos los nodos del clúster. Los contenedores pueden exponerse fuera del clúster mediante el balanceador de carga de Swarm.

Para el balanceo de carga de clústeres de Docker Swarm, las redes superpuestas internas proporcionan conectividad externa e interna
Figura 2. Conectividad de red interna y externa en un clúster de Docker Swarm

El balanceador de carga de Docker Swarm se ejecuta en cada nodo y puede distribuir las solicitudes entre cualquiera de los contenedores de cualquiera de los hosts del clúster. En una implementación de Swarm sin NGINX ni NGINX Plus, el balanceador de carga de Swarm gestiona tanto las solicitudes entrantes de los clientes (representadas por las flechas verdes de la Figura 3) como las solicitudes internas entre servicios (representadas por las flechas rojas).

Sin NGINX o NGINX Plus, el balanceo de carga de Docker Swarm gestiona el tráfico interno y externo únicamente en la capa 4
Figura 3. Equilibrado de carga de las solicitudes de clientes y entre servicios en un clúster de Swarm sin NGINX ni NGINX Plus

Ahora que Swarm incluye balanceo de carga, ¿por qué necesitaría otro balanceador de carga? Una de las razones es que el balanceador de carga de Swarm es un balanceador básico de capa 4 (TCP). Muchas aplicaciones requieren funcionalidades adicionales, como las siguientes, por citar solo algunas:

  • Terminación SSL/TLS
  • Enrutamiento basado en el contenido (por ejemplo, en la URL o en una cabecera)
  • Control de acceso y autorización
  • Reescrituras y redirecciones

Además, es posible que ya tengas experiencia con un balanceador de carga, y poder utilizarlo con Swarm te permite aprovechar las herramientas y los conocimientos que ya utilizas.

Uso de NGINX Open Source y NGINX Plus

NGINX Open Source y NGINX Plus son dos balanceadores de carga que ofrecen funcionalidades esenciales para las aplicaciones de las que carece el balanceador de carga nativo de Swarm.

Uso de NGINX Open Source

NGINX Open Source ofrece las funciones mencionadas anteriormente (terminación SSL/TLS, etc.) y muchas más, entre ellas:

  • Una selección de algoritmos de balanceo de carga
  • Más protocolos, por ejemplo, HTTP/2 y WebSocket
  • Registro configurable
  • Límites de tráfico, incluidos la tasa de solicitudes, el ancho de banda y las conexiones
  • Creación de scripts para casos de uso avanzados mediante Lua, Perl y JavaScript (con el módulo dinámico nginScript [Editor: ahora denominado módulo dinámico de JavaScript de NGINX])
  • Funciones de seguridad como listas de permitidos y listas de denegados

La forma más sencilla de utilizar NGINX Open Source es implementarlo como un servicio, con uno o varios contenedores. Los puertos necesarios para el servicio NGINX se exponen en el clúster, y los balanceadores de carga de Swarm distribuyen las solicitudes realizadas a estos puertos entre los contenedores de NGINX.

Figura 4. Los balanceadores de carga de Swarm distribuyen las solicitudes de los servicios NGINX entre las distintas instancias

Para este ejemplo, el servicio que proporciona NGINX es la terminación SSL/TLS. Para ilustrar su funcionamiento, desplegamos un servicio de backend A en el clúster y lo escalamos para que tenga tres contenedores (dos instancias en un nodo y una instancia en otro, como se muestra en la Figura 5). Swarm asigna una dirección IP virtual (VIP) al servicio A para su uso dentro del clúster. Utilizamos esta VIP en la configuración de NGINX del grupo upstream del servicio A, en lugar de enumerar las direcciones IP individuales de los contenedores. De este modo, podemos escalar el servicio A sin tener que modificar la configuración de NGINX.

Como se muestra en la figura 5, cuando un cliente envía una solicitud para el servicio A al primer nodo de Swarm, el equilibrador de carga de Swarm de ese nodo dirige la solicitud a NGINX. NGINX procesa la solicitud —en este ejemplo, descifrando SSL/TLS— y la dirige a la dirección IP virtual (VIP) del servicio A. El equilibrador de carga de Swarm dirige la solicitud (ahora sin cifrar) a uno de los contenedores del servicio A, ubicado en cualquiera de los nodos de Swarm.

Figura 5. NGINX proporciona la terminación SSL/TLS para las solicitudes de clientes externos

Es posible hacer que NGINX equilibre las solicitudes directamente entre los contenedores de backend y que también gestione las solicitudes internas entre servicios, pero solo mediante una solución más compleja que requiere modificar y volver a cargar la configuración de NGINX cada vez que se escala el servicio A. Más adelante explicaré cómo se puede hacer esto fácilmente con NGINX Plus.

Uso de NGINX Plus

Algunas de las funciones adicionales que ofrece NGINX Plus son:

  • Comprobaciones activas del estado de las aplicaciones – NGINX Plus comprueba continuamente los nodos de backend para asegurarse de que estén en buen estado y respondan correctamente, y elimina los nodos que no estén en buen estado de la rotación del balanceo de carga.
  • Persistencia de sesión – También conocida como «sesiones persistentes», es necesaria para las aplicaciones que requieren que las solicitudes de los clientes se sigan enviando al mismo servidor backend. NGINX Plus permite el vaciado de sesiones cuando es necesario desconectar servidores backend sin afectar a los clientes que tienen sesiones abiertas.
  • Reconfiguración dinámica – Permite aumentar o reducir la capacidad de los backends sin necesidad de modificar y volver a cargar la configuración de NGINX. Esto resulta especialmente útil al realizar el descubrimiento de servicios con una plataforma de microservicios como Swarm y es una de las funciones más importantes para integrar por completo NGINX Plus con estas plataformas. Existen dos métodos de reconfiguración dinámica: una API que permite enviar cambios a NGINX Plus y DNS, que NGINX Plus consulta continuamente para detectar cambios en el número de nodos asociados a un nombre de dominio. Este es el método utilizado en esta demostración de NGINX Plus para integrarse con el descubrimiento de servicios incorporado en Swarm.
  • Monitorización de la actividad en tiempo real – Proporciona una API para obtener métricas detalladas de NGINX Plus y un panel web basado en la API en el que puede consultar las métricas, así como añadir, eliminar y modificar servidores backend.

En la configuración de NGINX Open Source descrita anteriormente, el balanceador de carga de Swarm distribuye las solicitudes externas entre los contenedores de backend y gestiona las solicitudes entre servicios. La función de NGINX es descargar el procesamiento de SSL/TLS.

Cuando se utiliza NGINX Plus, las solicitudes de clientes externos llegan primero al equilibrador de carga de Swarm, pero es NGINX Plus quien realiza el equilibrado de carga propiamente dicho entre los contenedores de backend (figura 6). Hacer que las solicitudes de los clientes lleguen primero al equilibrador de carga de Swarm permite dotar fácilmente a NGINX Plus de alta disponibilidad.

En una topología de equilibrio de carga de clúster, NGINX Plus distribuye las solicitudes de los clientes (que le reenvía el equilibrador de carga de Docker Swarm) entre las instancias del servicio
Figura 6. El balanceador de carga de Docker Swarm reenvía las solicitudes de los clientes a NGINX Plus para distribuir la carga entre las instancias del servicio

Del mismo modo, el equilibrador de carga de Swarm recibe las solicitudes entre servicios, pero es NGINX Plus quien realmente las distribuye entre los servicios (figura 7).

En una topología de equilibrio de carga de Docker Swarm, NGINX Plus distribuye las solicitudes entre servicios (que le reenvía el equilibrador de carga de Docker Swarm) entre las instancias de servicio
Figura 7. El balanceador de carga de Docker Swarm reenvía las solicitudes entre servicios a NGINX Plus para distribuirlas entre las instancias de servicio

Demostraciones

Para ofrecer algunos ejemplos del uso de Swarm para el balanceo de carga de Docker, tanto con NGINX como sin él, he creado tres demostraciones. Todos los archivos de estas demostraciones están disponibles en GitHub, junto con instrucciones detalladas. Las tres demostraciones son:

Balanceo de carga de Docker Swarm

Esto muestra el balanceo de carga de Docker Swarm para las solicitudes dirigidas al backend de una aplicación web sencilla, sin NGINX ni NGINX Plus.

Equilibrado de carga de Docker Swarm con NGINX Open Source

Esta demostración incorpora NGINX Open Source para descargar el procesamiento SSL/TLS de las solicitudes externas. El balanceador de carga de Swarm distribuye las solicitudes al mismo backend de la sencilla aplicación web de la demostración anterior y gestiona las solicitudes internas entre servicios.

Equilibrado de carga de Docker Swarm con NGINX Plus

Esta demostración consta de dos partes. La primera utiliza NGINX Plus, que, además de descargar el procesamiento SSL/TLS, distribuye las solicitudes directamente entre los contenedores de backend y también gestiona las solicitudes internas entre servicios. Está integrado con la detección de servicios de Swarm y utiliza DNS dinámico para volver a resolver con frecuencia el nombre de dominio asociado a los backends. NGINX Plus distribuye la carga entre dos servicios de backend: Service1 y Service2. Para mostrar las solicitudes internas entre servicios, hace que Service1 envíe una solicitud a Service2.

En una topología de equilibrio de carga de Docker Swarm, NGINX Plus utiliza el mecanismo de detección de servicios DNS dinámico de Swarm
Figura 8. NGINX Plus utiliza el mecanismo de detección de servicios DNS dinámico de Swarm al equilibrar la carga de los servicios de backend

La segunda parte muestra cómo combinar la API de estado de NGINX con la API de servicios de Docker para escalar automáticamente los contenedores de backend. Un programa de Python utiliza la API de estado de NGINX Plus para supervisar la carga de Service1 y Service2, y la API de servicios de Docker Swarm para aumentar o reducir el número de contenedores de backend.

En una topología de equilibrio de carga de Docker, Swarm utiliza la supervisión de actividad en tiempo real de NGINX Plus para realizar un seguimiento de la carga del servicio con fines de escalado automático
Figura 9. Docker Swarm utiliza la supervisión de actividad en tiempo real de NGINX Plus para controlar la carga del servicio con fines de escalado automático

Resumen

Las nuevas funciones introducidas en Docker 1.12 convierten a Swarm en una plataforma más potente, pero sus capacidades pueden mejorarse aprovechando NGINX Open Source y, aún más, utilizando NGINX Plus. La capacidad de NGINX Plus para reconfigurar dinámicamente los contenedores de backend con el fin de equilibrar la carga mediante DNS, junto con la visibilidad que proporciona la API de estado, da lugar a una solución de contenedores muy potente.

Para probar NGINX Plus, inicie hoy mismo su prueba gratuita de 30 días o póngase en contacto con nosotros para hablar sobre sus casos de uso.

Y prueba las demostraciones disponibles en nuestro repositorio de GitHub.


Compartir
Etiquetas: F5 NGINX, Tech

Sobre el autor

Rick Nelson
Rick NelsonVicepresidente regional de Ingeniería de Soluciones

Más artículos de Rick Nelson

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.