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.

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.

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

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.

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.

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.

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

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 con Docker Swarm
- Equilibrado de carga de Docker Swarm con NGINX Open Source
- Balanceo de carga de Docker Swarm con NGINX Plus
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.

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.

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.
Sobre el autor

Artículos relacionados del blog
Ú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
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
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
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 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 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.