Balanceamento de carga do Docker Swarm com NGINX e NGINX Plus

NGINX | 14 de dezembro de 2016

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.

A topologia do balanceamento de carga do Docker, com um nó gerenciador do Swarm e dois nós de trabalho do Swarm
Figura 1. Um cluster do Docker Swarm com um nó gerenciador e dois nós de trabalho

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.

Para o balanceamento de carga do cluster Docker Swarm, as redes de sobreposição internas fornecem conectividade externa e interna
Figura 2. Conectividade de rede interna e externa em um cluster do Docker 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).

Sem NGINX ou NGINX Plus, o balanceamento de carga do Docker Swarm processa o tráfego interno e externo apenas na Camada 4
Figura 3. Balanceamento de carga de solicitações de clientes e entre serviços em um cluster Swarm sem NGINX ou NGINX Plus

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.

Figura 4. Os balanceadores de carga do Swarm distribuem as solicitações dos serviços NGINX entre as instâncias

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.

Figura 5. O NGINX fornece terminação SSL/TLS para solicitações de clientes externos

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

Em uma topologia de balanceamento de carga de cluster, o NGINX Plus distribui as solicitações dos clientes (encaminhadas a ele pelo balanceador de carga do Docker Swarm) entre as instâncias do serviço
Figura 6. O balanceador de carga do Docker Swarm encaminha as solicitações dos clientes ao NGINX Plus para o balanceamento de carga entre as instâncias do serviço

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

Em uma topologia de balanceamento de carga do Docker Swarm, o NGINX Plus distribui as solicitações entre serviços (encaminhadas a ele pelo balanceador de carga do Docker Swarm) entre as instâncias de serviço
Figura 7. O balanceador de carga do Docker Swarm encaminha solicitações entre serviços ao NGINX Plus para distribuí-las entre as instâncias de serviço

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

Em uma topologia de balanceamento de carga do Docker Swarm, o NGINX Plus usa o mecanismo de descoberta de serviços por DNS dinâmico do Swarm
Figura 8. O NGINX Plus usa o mecanismo de descoberta de serviços por DNS dinâmico do Swarm ao balancear a carga dos serviços de backend

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.

Em uma topologia de balanceamento de carga do Docker, o Swarm usa o monitoramento de atividade em tempo real do NGINX Plus para acompanhar a carga dos serviços para fins de escalonamento automático
Figura 9. O Docker Swarm usa o monitoramento de atividades em tempo real do NGINX Plus para acompanhar a carga dos serviços para fins de escalonamento automático

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.


Compartilhar
Tags: F5 NGINX, Tech

Sobre o autor

Rick Nelson
Rick NelsonVice-presidente regional de Engenharia de Soluções

Mais publicações de Rick Nelson

Publicações relacionadas no blog

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade
NGINX | 10/10/2024

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
NGINX | 17/06/2024

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
NGINX | 14/07/2021

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
NGINX | 02/04/2019

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
NGINX | 24/05/2018

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
NGINX | 19/04/2016

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.