Em setembro, na nginx.conf 2016, em Austin, fiz uma apresentação sobre o uso do NGINX e do NGINX Plus em um cluster do Docker Swarm. Neste post, explico como usar o NGINX e o NGINX Plus para o balanceamento de carga do Docker Swarm em conjunto com os recursos introduzidos no Docker 1.12. Todos os arquivos que usei durante minha demonstração na nginx.conf (e outros mais) estão disponíveis no GitHub para você experimentar.
Visão geral
A versão 1.12 do Docker, lançada no final de julho de 2016, integra o Docker Engine e o Swarm e adiciona novos recursos de orquestração para criar uma plataforma semelhante a outras plataformas de contêineres, como o Kubernetes. No Docker 1.12, o Modo Swarm permite combinar um conjunto de hosts Docker em um swarm, oferecendo uma arquitetura descentralizada, tolerante a falhas e com autorrecuperação. A nova plataforma também facilita a configuração de um cluster Swarm, protege todos os nós com uma chave e criptografa com TLS todas as comunicações entre os nós.
Ao mesmo tempo, a API do Docker foi ampliada para reconhecer os serviços, que são conjuntos de contêineres que usam a mesma imagem (semelhantes aos serviços do Docker Compose, mas com mais recursos). Você pode criar e dimensionar serviços, realizar atualizações graduais, criar verificações de integridade e muito mais. A descoberta de serviços por DNS e o balanceamento de carga são integrados, e você também pode configurar redes de sobreposição em todo o cluster.
Topologia para balanceamento de carga no Docker Swarm
Para esta discussão e demonstração, tenho três nós do Swarm: um gerenciador e dois workers. É no nó gerenciador que os comandos do Swarm são executados. O Swarm cuida do agendamento, da descoberta de serviços via DNS, do dimensionamento e do balanceamento de carga dos contêineres (representados na figura pelas pequenas caixas) em todos os nós.

Para permitir a comunicação por rede privada entre contêineres dentro de um cluster, os contêineres podem ser conectados a várias redes de sobreposição internas que abrangem todos os nós do cluster. Os contêineres podem ser expostos fora do cluster por meio do balanceador de carga do Swarm.

O balanceador de carga do Docker Swarm é executado em todos os nós e pode distribuir as solicitações entre quaisquer contêineres em qualquer um dos hosts do cluster. Em uma implantação do Swarm sem o NGINX ou o NGINX Plus, o balanceador de carga do Swarm processa tanto as solicitações recebidas dos clientes (representadas pelas setas verdes na Figura 3) quanto as solicitações internas entre serviços (representadas pelas setas vermelhas).

Agora que o Swarm inclui balanceamento de carga, por que você precisaria de outro balanceador de carga? Um dos motivos é que o balanceador de carga do Swarm é um balanceador básico de Camada 4 (TCP). Muitos aplicativos exigem recursos adicionais, como estes, para citar apenas alguns:
- Terminação SSL/TLS
- Roteamento baseado em conteúdo (com base, por exemplo, na URL ou em um cabeçalho)
- Controle de acesso e autorização
- Reescritas e redirecionamentos
Além disso, talvez você já tenha experiência com um balanceador de carga, e poder usá-lo com o Swarm permite aproveitar as ferramentas e os conhecimentos que você já utiliza.
Como usar o NGINX Open Source e o NGINX Plus
NGINX Open Source e NGINX Plus são dois balanceadores de carga que oferecem recursos essenciais para aplicações, ausentes no balanceador de carga nativo do Swarm.
Como usar o NGINX Open Source
NGINX Open Source oferece os recursos mencionados anteriormente (terminação SSL/TLS etc.) e muito mais, incluindo:
- Uma variedade de algoritmos de balanceamento de carga
- Mais protocolos, como HTTP/2 e WebSocket
- Registro em log configurável
- Limites de tráfego, incluindo taxa de requisições, largura de banda e conexões
- Criação de scripts para casos de uso avançados, usando Lua, Perl e JavaScript (com o módulo dinâmico nginScript [Editor – Agora chamado de módulo dinâmico NGINX JavaScript])
- Recursos de segurança, como listas de permissões e de bloqueios
A maneira mais simples de usar o NGINX Open Source é implantá-lo como um serviço, com um ou mais contêineres. As portas necessárias para o serviço NGINX são expostas no cluster, e os balanceadores de carga do Swarm distribuem as solicitações nessas portas para os contêineres NGINX.

Para os fins deste exemplo, o serviço fornecido pelo NGINX é o encerramento de SSL/TLS. Para ilustrar como isso funciona, implantamos um serviço de backend A no cluster e o escalamos para ter três contêineres (duas instâncias em um nó e uma instância em outro, conforme mostrado na Figura 5). O Swarm atribui um endereço IP virtual (VIP) ao serviço A para uso dentro do cluster. Usamos esse VIP na configuração do NGINX para o grupo upstream do serviço A, em vez de listar os endereços IP individuais dos contêineres. Dessa forma, podemos escalar o serviço A sem precisar alterar a configuração do NGINX.
Como mostra a Figura 5, quando um cliente faz uma solicitação ao serviço A para o primeiro nó do Swarm, o balanceador de carga do Swarm nesse nó encaminha a solicitação ao NGINX. O NGINX processa a solicitação — neste exemplo, realizando a descriptografia SSL/TLS — e a encaminha ao VIP do serviço A. O balanceador de carga do Swarm encaminha a solicitação (agora não criptografada) a um dos contêineres do serviço A, em qualquer um dos nós do Swarm.

É possível fazer com que o NGINX balanceie as solicitações de carga diretamente entre os contêineres de backend e também processe solicitações internas entre serviços, mas somente com uma solução mais complexa, que exige alterar e recarregar a configuração do NGINX sempre que o serviço A é escalado. Mais adiante, explicarei como isso pode ser feito facilmente com o NGINX Plus.
Como usar o NGINX Plus
Alguns dos recursos adicionais oferecidos pelo NGINX Plus são:
- Verificações ativas da integridade dos aplicativos – O NGINX Plus verifica continuamente os nós de backend para garantir que estejam íntegros e respondendo corretamente, além de remover os nós com problemas da rotação de balanceamento de carga.
- Persistência de sessão – Também conhecida como sessões persistentes, é necessária para aplicações que exigem que as solicitações dos clientes continuem sendo enviadas ao mesmo backend. O NGINX Plus oferece suporte à drenagem de sessões quando é necessário colocar servidores de backend offline sem afetar os clientes que têm sessões abertas.
- Reconfiguração dinâmica – Permite aumentar ou reduzir a escala dos back-ends sem precisar alterar e recarregar a configuração do NGINX. Isso é especialmente útil ao realizar a descoberta de serviços com uma plataforma de microsserviços como o Swarm e é um dos recursos mais importantes para a integração completa do NGINX Plus com essas plataformas. Há dois métodos de reconfiguração dinâmica: uma API que permite enviar alterações ao NGINX Plus e o DNS, que o NGINX Plus verifica continuamente em busca de mudanças no número de nós associados a um nome de domínio. Esse é o método usado nesta demonstração do NGINX Plus para integração com a descoberta de serviços integrada do Swarm.
- Monitoramento de atividades em tempo real – Fornece uma API para obter métricas abrangentes do NGINX Plus e um painel web baseado na API, no qual você pode visualizar as métricas, bem como adicionar, remover e alterar servidores de backend.
Na configuração do NGINX Open Source descrita acima, o balanceador de carga do Swarm distribui as solicitações externas aos contêineres de backend e também processa as solicitações entre os serviços. A função do NGINX é realizar o descarregamento de SSL/TLS.
Ao usar o NGINX Plus, as solicitações de clientes externos chegam primeiro ao balanceador de carga do Swarm, mas é o NGINX Plus que realiza o balanceamento de carga propriamente dito para os contêineres de backend (Figura 6). Fazer com que as solicitações dos clientes cheguem primeiro ao balanceador de carga do Swarm é uma maneira fácil de garantir a alta disponibilidade do NGINX Plus.

Da mesma forma, o balanceador de carga do Swarm recebe solicitações entre serviços, mas é o NGINX Plus que efetivamente as distribui entre os serviços (Figura 7).

Demonstrações
Para fornecer alguns exemplos de como usar o Swarm para balanceamento de carga do Docker com e sem o NGINX, criei três demonstrações. Todos os arquivos dessas demonstrações estão disponíveis no GitHub, juntamente com instruções detalhadas. As três demonstrações são:
- Balanceamento de carga com Docker Swarm
- Balanceamento de carga do Docker Swarm com NGINX Open Source
- Balanceamento de carga do Docker Swarm com o NGINX Plus
Balanceamento de carga do Docker Swarm
Isso demonstra o balanceamento de carga de solicitações do Docker Swarm para o backend de uma aplicação web simples, sem NGINX ou NGINX Plus.
Balanceamento de carga do Docker Swarm com NGINX Open Source
Esta demonstração adiciona o NGINX Open Source para fornecer descarregamento de SSL/TLS para solicitações externas. O balanceador de carga do Swarm distribui as solicitações para o mesmo backend simples de aplicativo web da demonstração anterior e processa solicitações internas entre serviços.
Balanceamento de carga do Docker Swarm com o NGINX Plus
Esta demonstração tem duas partes. A primeira usa o NGINX Plus, que, além de realizar o descarregamento de SSL/TLS, balanceia as solicitações diretamente entre os contêineres de backend e também processa solicitações internas entre serviços. Ele é integrado à descoberta de serviços do Swarm e usa DNS dinâmico para resolver novamente, com frequência, o nome de domínio associado aos backends. O NGINX Plus faz o balanceamento de carga de dois serviços de backend, Service1 e Service2. Ela demonstra solicitações internas entre serviços fazendo com que o Service1 envie uma solicitação ao Service2.

A segunda parte mostra como combinar a API de status do NGINX com a API de serviços do Docker para dimensionar automaticamente os contêineres de backend. Um programa em Python usa a API de status do NGINX Plus para monitorar a carga no Service1 e no Service2, e a API de serviços do Docker Swarm para aumentar ou reduzir a quantidade de contêineres de backend.

Resumo
Os novos recursos introduzidos no Docker 1.12 tornam o Swarm uma plataforma mais poderosa, mas ela pode ser aprimorada aproveitando o NGINX Open Source e, ainda mais, usando o NGINX Plus. A capacidade do NGINX Plus de reconfigurar dinamicamente os contêineres de backend para realizar o balanceamento de carga usando DNS, aliada à visibilidade fornecida pela API de status, resulta em uma solução de contêineres extremamente poderosa.
Para experimentar o NGINX Plus, inicie sua avaliação gratuita de 30 dias hoje mesmo ou entre em contato conosco para falar sobre seus casos de uso.
E experimente as demonstrações disponíveis em nosso repositório no GitHub.
Sobre o autor

Publicações relacionadas no blog

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade
Descubra como o F5 NGINX One aprimora o gerenciamento e a observabilidade de ambientes híbridos e multicloud ao oferecer um console web centralizado baseado em SaaS, com insights em tempo real, conformidade automatizada e gerenciamento simplificado de configurações.

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa
Descubra como transformar uma definição de esquema OpenAPI em uma configuração NGINX totalmente funcional, operando como um API Gateway com a segurança de um Web Application Firewall e um Portal do Desenvolvedor, usando uma abordagem declarativa de API.

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor
Picos de tráfego e sobrecarga de servidores são preocupações sérias para varejistas online em qualquer época, mas especialmente durante a “Cyber Season” de compras de fim de ano. Detalhamos como você pode aproveitar as soluções de entrega de aplicações de nível de produção da NGINX para se preparar para aumentos repentinos de tráfego.

Distribuição segura de chaves privadas SSL com o NGINX
Descrevemos três maneiras progressivamente mais seguras de proteger chaves privadas SSL ao configurar o NGINX para processar tráfego HTTPS: permitir acesso de leitura apenas ao usuário root, criptografar as chaves com senhas armazenadas separadamente e distribuir as senhas a partir de um repositório central.
Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX
O módulo JavaScript do NGINX lançado com o NGINX Plus R15 oferece suporte a subsolicitações, possibilitando uma classe totalmente nova de casos de uso para o NGINX Plus. Este exemplo completo também usa a API do NGINX Plus e os módulos de chave-valor para converter solicitações de API dos clientes em solicitações separadas para as APIs dos microsserviços que compõem um aplicativo.
Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus
Confira dicas para evitar o esgotamento de portas efêmeras com ajustes no kernel do Linux, conexões keepalive e conexões vinculadas dinamicamente a endereços IP locais.