En nginx.conf 2016 en Austin este septiembre, di una presentación sobre el uso de NGINX y NGINX Plus en un clúster Docker Swarm . En esta publicación analizo cómo usar NGINX y NGINX Plus para equilibrar la carga de Docker Swarm junto con las características introducidas en Docker 1.12. Todos los archivos que utilicé durante mi demostración en nginx.conf (y más) están disponibles en GitHub para que puedas experimentar con ellos.
La versión 1.12 de Docker, lanzada a fines de julio de 2016, integra Docker Engine y Swarm y agrega algunas nuevas características de orquestación, para crear una plataforma similar a otras plataformas de contenedores como Kubernetes. En Docker 1.12, el modo Swarm le permite combinar un conjunto de hosts Docker en un enjambre , lo que proporciona una arquitectura descentralizada, autorreparable y tolerante a fallas. La nueva plataforma también facilita la configuración de un clúster Swarm, protege todos los nodos con una clave y cifra todas las comunicaciones entre nodos con TLS.
Al mismo tiempo, se ha ampliado la API de Docker para que tenga en cuenta los servicios , que son conjuntos de contenedores que utilizan la misma imagen (similar a los servicios en Docker Compose, pero con más características). Puede crear y escalar servicios, realizar actualizaciones continuas, crear controles de estado y más. El descubrimiento del servicio DNS y el equilibrio de carga están integrados, y también puedes configurar redes superpuestas en todo el clúster.
Para esta discusión y demostración, tengo tres nodos Swarm: un administrador y dos trabajadores. El nodo administrador es donde se ejecutan los comandos Swarm. Swarm maneja la programación, el descubrimiento del servicio DNS, el escalamiento y el equilibrio de carga de contenedores (representado en la figura por los cuadros pequeños) en todos los nodos.
Para proporcionar comunicaciones de red privadas entre contenedores dentro de un clúster, los contenedores se pueden conectar a múltiples redes superpuestas internas que abarcan todos los nodos del clúster. Los contenedores se pueden exponer fuera del clúster a través del balanceador de carga Swarm.
El balanceador de carga Docker Swarm se ejecuta en cada nodo y puede equilibrar la carga de las solicitudes en cualquiera de los contenedores en cualquiera de los hosts del clúster. En una implementación de Swarm sin NGINX o NGINX Plus, el balanceador de carga de Swarm maneja las solicitudes de clientes entrantes (representadas por las flechas verdes en la Figura 3), así como las solicitudes internas de servicio a servicio (representadas por las flechas rojas).
Ahora que Swarm incluye equilibrio de carga, ¿por qué necesitaría otro equilibrador de carga? Una razón es que el balanceador de carga Swarm es un balanceador de carga de capa 4 (TCP) básico. Muchas aplicações requieren características adicionales, como estas, por nombrar solo algunas:
Además, es posible que ya tengas experiencia con un balanceador de carga, y poder usarlo con Swarm te permitirá aprovechar las herramientas y el conocimiento que ya estás usando.
NGINX Open Source y NGINX Plus son dos balanceadores de carga que proporcionan funciones críticas aplicação que faltan en el balanceador de carga nativo Swarm.
NGINX Open Source proporciona las características mencionadas anteriormente (terminación SSL/TLS, etc.) y más, incluidas:
La forma más sencilla de utilizar NGINX Open Source es implementarlo como un servicio, con uno o más contenedores. Los puertos necesarios para el servicio NGINX están expuestos en el clúster y los balanceadores de carga Swarm distribuyen las solicitudes en estos puertos a los contenedores NGINX.
Para los fines de este ejemplo, el servicio que proporciona NGINX es la terminación SSL/TLS. Para ilustrar cómo funciona esto, implementamos un servicio backend A en el clúster y lo escalamos para tener 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. Usamos esta VIP en la configuración NGINX del grupo ascendente para el servicio A, en lugar de enumerar las direcciones IP individuales de los contenedores. De esta manera podemos escalar el servicio A sin tener que cambiar la configuración de NGINX.
Como se muestra en la Figura 5, cuando un cliente realiza una solicitud de servicio A al primer nodo Swarm, el balanceador de carga Swarm en ese nodo enruta la solicitud a NGINX. NGINX procesa la solicitud, en este ejemplo haciendo descifrado SSL/TLS, y la enruta a la VIP para el servicio A. El balanceador de carga Swarm enruta la solicitud (ahora sin cifrar) a uno de los contenedores para el servicio A, en cualquiera de los nodos Swarm.
Es posible equilibrar la carga de las solicitudes de NGINX directamente a los contenedores de backend y también manejar solicitudes internas de servicio a servicio, pero solo con una solución más compleja que requiere cambiar y volver a cargar la configuración de NGINX cada vez que se escala el servicio A. Más adelante explicaré cómo esto se logra fácilmente con NGINX Plus.
Algunas de las características adicionales que ofrece NGINX Plus son:
Reconfiguración dinámica : proporciona la capacidad de escalar los backends hacia arriba y hacia abajo sin necesidad de cambiar y recargar la configuración de NGINX. Esto es especialmente útil cuando se realiza el descubrimiento de servicios con una plataforma de microservicios como Swarm, y es una de las características más importantes que permite que NGINX Plus se integre completamente con estas plataformas.
Hay dos métodos de reconfiguración dinámica: una API que le permite enviar cambios a NGINX Plus y DNS, que NGINX Plus verifica continuamente para detectar cambios en la cantidad de nodos adjuntos 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 integrado en Swarm.
En la configuración de código abierto NGINX descrita anteriormente , el balanceador de carga Swarm distribuye solicitudes externas a los contenedores backend y maneja solicitudes de servicio a servicio entre ellos. La función de NGINX es la descarga de SSL/TLS.
Al usar NGINX Plus, las solicitudes de clientes externos llegan primero al balanceador de carga Swarm, pero NGINX Plus realiza el balanceo de carga real hacia los contenedores backend (Figura 6). Hacer que las solicitudes de los clientes lleguen primero al balanceador de carga Swarm proporciona una manera sencilla de lograr que NGINX Plus tenga alta disponibilidad.
De manera similar, el balanceador de carga Swarm recibe solicitudes entre servicios, pero NGINX Plus en realidad las distribuye entre los servicios (Figura 7).
Para proporcionar algunos ejemplos del uso de Swarm para el equilibrio de carga de Docker con y sin NGINX, he creado tres demostraciones. Todos los archivos de estas demostraciones están disponibles en GitHub , junto con instrucciones detalladas. Las tres manifestaciones son:
Esto demuestra el equilibrio de carga de las solicitudes de Docker Swarm hacia un backend de aplicación web simple, sin NGINX o NGINX Plus.
Esta demostración agrega NGINX de código abierto para proporcionar descarga SSL/TLS para solicitudes externas. El balanceador de carga Swarm distribuye solicitudes al mismo backend de aplicación web simple que en la demostración anterior y maneja solicitudes internas de servicio a servicio.
Esta demostración tiene dos partes. La primera parte utiliza NGINX Plus, que además de realizar la descarga de SSL/TLS, equilibra la carga de las solicitudes directamente a los contenedores backend y también maneja solicitudes internas de servicio a servicio. Está integrado con el descubrimiento de servicios Swarm, utilizando DNS dinámico para resolver frecuentemente el nombre de dominio asociado con los backends. NGINX Plus equilibra la carga de dos servicios de backend, Service1 y Service2 . Demuestra solicitudes internas de servicio a servicio haciendo que Service1 realice una solicitud a Service2 .
La segunda parte muestra cómo se puede combinar la API de estado NGINX con la API de servicio Docker para escalar automáticamente los contenedores de backend. Un programa Python utiliza la API de estado NGINX Plus para monitorear la carga en Service1 y Service2 , y la API de servicio Docker Swarm para escalar los contenedores del backend hacia arriba o hacia abajo.
Las nuevas características introducidas en Docker 1.12 hacen de Swarm una plataforma más potente, pero se puede mejorar aprovechando NGINX Open Source y aún más utilizando NGINX Plus. La capacidad de NGINX Plus para reconfigurar dinámicamente los contenedores backend para equilibrar la carga mediante DNS, y la visibilidad proporcionada por la API de estado, lo convierten en una solución de contenedores muy poderosa.
Para probar NGINX Plus, comience hoy su prueba gratuita de 30 días o contáctenos para analizar sus casos de uso.
Y prueba las demostraciones disponibles en nuestro repositorio de GitHub .
"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.