BLOG | NGINX

Balanceamento de carga do Docker Swarm com NGINX e NGINX Plus

NGINX-Parte-de-F5-horiz-preto-tipo-RGB
Miniatura de Rick Nelson
Rick Nelson
Publicado em 14 de dezembro de 2016

Na nginx.conf 2016 em Austin em setembro, fiz uma apresentação sobre o uso do NGINX e do NGINX Plus em um cluster Docker Swarm . Nesta postagem, discuto como usar o NGINX e o NGINX Plus para 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 no nginx.conf (e 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 alguns 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 que você combine um conjunto de hosts Docker em um swarm , fornecendo uma arquitetura descentralizada, tolerante a falhas e autocorretiva. A nova plataforma também facilita a configuração de um cluster Swarm, protege todos os nós com uma chave e criptografa todas as comunicações entre os nós com TLS.

Ao mesmo tempo, a API do Docker foi expandida para reconhecer serviços , que são conjuntos de contêineres que usam a mesma imagem (semelhante aos serviços no Docker Compose, mas com mais recursos). Você pode criar e dimensionar serviços, fazer atualizações contínuas, criar verificações de integridade e muito mais. A descoberta de serviços 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 do Docker Swarm

Para esta discussão e demonstração, tenho três nós Swarm – um gerente e dois trabalhadores. O nó gerenciador é onde os comandos do Swarm são executados. O Swarm gerencia o agendamento, a descoberta de serviços DNS, o dimensionamento e o balanceamento de carga do contêiner (representado na figura pelas caixas pequenas) em todos os nós.

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

Para fornecer comunicações de rede privadas 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 Swarm.

Para balanceamento de carga de cluster do Docker Swarm, redes de sobreposição internas fornecem conectividade externa e interna
Figura 2. Conectividade de rede interna e externa em um cluster Docker Swarm

O balanceador de carga Docker Swarm é executado em todos os nós e pode balancear a carga de solicitações em qualquer um dos contêineres em qualquer um dos hosts do cluster. Em uma implantação do Swarm sem NGINX ou NGINX Plus, o balanceador de carga do Swarm manipula solicitações de entrada do cliente (representadas pelas setas verdes na Figura 3), bem como solicitações internas de serviço para serviço (representadas pelas setas vermelhas).

Sem NGINX ou NGINX Plus, o balanceamento de carga do Docker Swarm manipula o tráfego interno e externo apenas na Camada 4
Figura 3. Balanceamento de carga de solicitações de cliente e serviço a serviço 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 motivo é que o balanceador de carga Swarm é um balanceador de carga básico da Camada 4 (TCP). Muitos aplicativos exigem recursos adicionais, como estes, para citar apenas alguns:

  • Encerramento do SSL/TLS
  • Roteamento baseado em conteúdo (com base, por exemplo, na URL ou em um cabeçalho)
  • Controle de acesso e autorização
  • Reescreve e redireciona

Além disso, você pode já ter experiência com um balanceador de carga, e poder usá-lo com o Swarm permite que você aproveite as ferramentas e o conhecimento que já está usando.

Usando NGINX Open Source e NGINX Plus

NGINX Open Source e NGINX Plus são dois balanceadores de carga que fornecem recursos essenciais para aplicativos que estão ausentes no balanceador de carga Swarm nativo.

Usando NGINX Open Source

O NGINX Open Source fornece os recursos mencionados anteriormente (terminação SSL/TLS, etc.) e muito mais, incluindo:

  • Uma escolha de algoritmos de balanceamento de carga
  • Mais protocolos, por exemplo HTTP/2 e WebSocket
  • Registro configurável
  • Limites de tráfego, incluindo taxa de solicitação, largura de banda e conexões
  • Script 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ão e listas de negação

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 Swarm distribuem solicitações nessas portas para os contêineres NGINX.

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

Para os propósitos deste exemplo, o serviço que o NGINX fornece é a terminação SSL/TLS. Para ilustrar como isso funciona, implantamos um serviço de backend A no cluster e o dimensionamos 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 NGINX do grupo upstream para o serviço A, em vez de listar os endereços IP individuais dos contêineres. Dessa forma, podemos dimensionar o serviço A sem precisar alterar a configuração do NGINX.

Conforme mostrado na Figura 5, quando um cliente faz uma solicitação para o serviço A para o primeiro nó Swarm, o balanceador de carga Swarm naquele nó encaminha a solicitação para o NGINX. O NGINX processa a solicitação, neste exemplo fazendo a descriptografia SSL/TLS, e a encaminha para o VIP para o serviço A. O balanceador de carga Swarm encaminha a solicitação (agora não criptografada) para um dos contêineres para o serviço A, em qualquer um dos nós Swarm.

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

É possível ter solicitações de balanceamento de carga do NGINX diretamente para os contêineres de backend e também lidar com solicitações internas de serviço para serviço, mas apenas com uma solução mais complexa que exija alterar e recarregar a configuração do NGINX sempre que o serviço A for dimensionado. Discutirei mais tarde como isso é facilmente realizado com o NGINX Plus.

Usando NGINX Plus

Alguns dos recursos adicionais fornecidos pelo NGINX Plus são:

  • Verificações ativas de integridade do aplicativo – O NGINX Plus verifica continuamente os nós de backend para garantir que estejam íntegros e respondendo corretamente, e remove os nós não íntegros da rotação de balanceamento de carga.
  • Persistência de sessão – Também conhecida como sessões persistentes e necessária para aplicativos que exigem que os clientes continuem tendo suas solicitações enviadas para o mesmo backend. O NGINX Plus oferece suporte à drenagem de sessão quando você precisa deixar os servidores de backend offline sem afetar os clientes que têm sessões abertas.
  • Reconfiguração dinâmica – Isso fornece a capacidade de aumentar ou diminuir a escala de backends sem exigir que a configuração do NGINX seja alterada e recarregada. Isso é especialmente útil ao fazer descoberta de serviços com uma plataforma de microsserviços como o Swarm, e é um dos recursos mais importantes que permite que o NGINX Plus seja totalmente integrado a essas plataformas.

    Há dois métodos de reconfiguração dinâmica: uma API que permite enviar alterações ao NGINX Plus e DNS, que o NGINX Plus verifica continuamente em busca de alterações no número de nós anexados a um nome de domínio. Este é o método utilizado nesta demonstração do NGINX Plus para integração com a descoberta de serviço integrada no Swarm.

  • Monitoramento de atividade ao vivo – Fornece uma API para obter métricas abrangentes do NGINX Plus e um painel da web criado na API, onde você pode visualizar as métricas, bem como adicionar, remover e alterar servidores de back-end.

Na configuração NGINX Open Source descrita acima , o balanceador de carga Swarm distribui solicitações externas para os contêineres de backend e manipula solicitações de serviço para serviço entre eles. A função do NGINX é descarregar SSL/TLS.

Ao usar o NGINX Plus, as solicitações de clientes externos atingem primeiro o balanceador de carga do Swarm, mas o NGINX Plus faz o balanceamento de carga real para os contêineres de backend (Figura 6). Fazer com que as solicitações do cliente cheguem primeiro ao balanceador de carga do Swarm fornece uma maneira fácil de tornar o NGINX Plus altamente disponível.

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

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

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

Demonstrações

Para fornecer alguns exemplos de uso do Swarm para balanceamento de carga do Docker com e sem NGINX, criei três demonstrações. Todos os arquivos para essas demonstrações estão disponíveis no GitHub , junto com instruções detalhadas. As três demonstrações são:

Balanceamento de carga do Docker Swarm

Isso demonstra o balanceamento de carga do Docker Swarm de solicitações para um backend de aplicativo 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 SSL/TLS para solicitações externas. O balanceador de carga Swarm distribui solicitações para o mesmo backend de aplicativo web simples da demonstração anterior e lida com solicitações internas de serviço para serviço.

Balanceamento de carga do Docker Swarm com NGINX Plus

Esta demonstração tem duas partes. A primeira parte usa o NGINX Plus, que além de fazer o offload de SSL/TLS, balanceia a carga de solicitações diretamente para os contêineres de backend e também lida com solicitações internas de serviço para serviço. Ele é integrado à descoberta de serviços do Swarm, usando DNS dinâmico para resolver frequentemente o nome de domínio associado aos backends. O NGINX Plus está balanceando a carga de dois serviços de backend, Service1 e Service2 . Ele demonstra solicitações internas de serviço para serviço fazendo com que o Service1 faça 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ço DNS dinâmico do Swarm
Figura 8. O NGINX Plus usa o mecanismo de descoberta de serviço DNS dinâmico do Swarm ao balancear a carga de serviços de backend

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

Em uma topologia de balanceamento de carga do Docker, o Swarm usa o monitoramento de atividade ao vivo do NGINX Plus para rastrear a carga do serviço para fins de dimensionamento automático
Figura 9. O Docker Swarm usa o monitoramento de atividade ao vivo do NGINX Plus para rastrear a carga do serviço para fins de dimensionamento automático

Resumo

Os novos recursos introduzidos no Docker 1.12 tornam o Swarm uma plataforma mais poderosa, mas ele pode ser aprimorado 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 balancear a carga usando DNS e a visibilidade fornecida pela API de status criam uma solução de contêiner muito poderosa.

Para experimentar o NGINX Plus, comece hoje mesmo seu teste gratuito de 30 dias ou entre em contato conosco para discutir seus casos de uso.

E experimente as demonstrações disponíveis em nosso repositório GitHub .


"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."