BLOG | NGINX

Balanceamento de carga de grupos de dimensionamento automático da AWS com NGINX Plus

NGINX-Parte-de-F5-horiz-preto-tipo-RGB
Miniatura de Michael Pleshakov
Michael Pleshakov
Publicado em 06 de março de 2017

Um dos recursos mais benéficos da nuvem é a capacidade de dimensionar automaticamente o número de instâncias de computação. Com o AWS Auto Scaling , você pode alterar o número de instâncias do EC2 em um grupo de Auto Scaling , manual ou automaticamente, com base na programação ou na demanda. O dimensionamento automático ajuda a reduzir custos ajustando o número de instâncias para o número certo para a carga de trabalho atual. Além disso, o Auto Scaling reinicia instâncias com falha, o que adiciona resiliência aos seus aplicativos.

O balanceamento de carga é crucial ao usar o dimensionamento automático. A AWS fornece balanceamento de carga de instâncias de grupos de Auto Scaling integrando seus balanceadores de carga integrados – Elastic Load Balancer (ELB), agora oficialmente chamado de Classic Load Balancer, e Application Load Balancer (ALB) – com Auto Scaling. O NGINX Plus fornece balanceamento de carga de nuvem avançado para qualquer ambiente de nuvem, incluindo AWS, e oferece suporte a grupos de dimensionamento automático da AWS.

Há três razões principais para escolher o NGINX Plus como um substituto ou uma adição aos balanceadores de carga de nuvem AWS integrados:

  1. O NGINX Plus oferece vários recursos avançados que o ELB e o ALB não possuem.
  2. O modelo de preços para os balanceadores de carga da AWS (especialmente ALB) é complexo, dificultando a previsão de custos. O preço do NGINX Plus é direto, quer você compre a assinatura do NGINX Plus diretamente de nós ou execute instâncias pré-criadas do NGINX Plus no AWS Marketplace , que são cobradas a uma taxa horária definida.
  3. O NGINX Plus não vincula você a APIs específicas da plataforma, permitindo que você reutilize a configuração de balanceamento de carga em várias plataformas de nuvem.

Para ver como o NGINX Plus se compara (e funciona em conjunto com) as soluções integradas da AWS, leia nossas postagens de blog sobre ELB e ALB .

Nesta postagem do blog, mostramos dois métodos de configuração do NGINX Plus para balancear a carga de grupos de dimensionamento automático e explicamos quando faz sentido usar cada método:

  1. Usando NGINX Plus na frente do ELB
  2. Usando o NGINX Plus com software de integração fornecido pela NGINX, Inc.

Depois de ler esta postagem do blog, você estará pronto para implantar o NGINX Plus na AWS para fornecer balanceamento de carga avançado para grupos de dimensionamento automático.

O ambiente de dimensionamento automático da AWS de exemplo

Estamos usando um ambiente de aplicativo de exemplo para ilustrar os dois métodos de uso do NGINX Plus para balancear a carga de grupos de dimensionamento automático. Nosso aplicativo web de backend consiste em dois serviços – Backend Um e Backend Dois – cada um exposto na porta 80. Para cada serviço, há um grupo de dimensionamento automático de várias instâncias de aplicativo. O balanceador de carga roteia as solicitações do cliente para o backend apropriado com base no URI da solicitação:

  • Solicitações para /backend‑one vão para o Backend One.
  • Solicitações para /backend‑two vão para o Backend Two.

Para que os grupos do AWS Auto Scaling funcionem de forma otimizada, você precisa colocar um balanceador de carga em nuvem como o NGINX Plus na frente deles.

Quando dimensionamos os grupos de dimensionamento automático do aplicativo (automaticamente ou manualmente), a configuração do balanceador de carga deve ser atualizada para refletir o novo número de instâncias do aplicativo. Os balanceadores de carga integrados da AWS fazem isso automaticamente. Para o NGINX Plus, precisamos propagar eventos de dimensionamento para a configuração com um dos métodos mencionados acima (NGINX Plus na frente do ELB ou NGINX Plus com o software de integração).

Outra maneira de atualizar a configuração do NGINX Plus em resposta a eventos de dimensionamento é com um registro de serviço externo. O NGINX Plus oferece suporte à integração com sistemas de descoberta de serviços que fornecem uma interface DNS , como o Consul . Nesta postagem do blog, nos concentramos em soluções que não dependem do uso de sistemas externos e que são fáceis de configurar e usar.

Usando NGINX Plus na frente do ELB

Se você já estiver usando grupos de dimensionamento automático e ELB, a maneira mais fácil de trazer alguns dos recursos avançados do NGINX Plus para seu aplicativo é colocar o NGINX Plus na frente dos balanceadores de carga de nuvem ELB, conforme mostrado no diagrama:

Uma maneira de usar o NGINX Plus como balanceador de carga na nuvem para grupos de dimensionamento automático da AWS é colocá-lo em frente aos ELBs, que fazem o balanceamento de carga para os grupos.

Neste caso, o NGINX Plus atua como um proxy/balanceador de carga para um ou mais ELBs. Usando seus recursos avançados de roteamento, o NGINX Plus encaminha solicitações para o ELB apropriado com base no URI da solicitação. O ELB então passa a solicitação para uma das instâncias no grupo Auto Scaling. Nessa configuração, o ELB fornece suporte para dimensionamento.

Aqui está a configuração do NGINX Plus.

resolver 169.254.169.253 válido=10s; upstream backend-one { zona backend-one 64k; servidor DNS-nome-do-ELB-para-Backend-Um resolver; } upstream backend-two { zona backend-two 64k; servidor DNS-nome-do-ELB-para-Backend-Dois resolver; } servidor { ouvir 80; localização /backend-one { proxy_set_header Host $host; proxy_pass http://backend-one; } localização /backend-two { proxy_set_header Host $host; proxy_pass http://backend-two; } }
  • A diretiva resolver define o servidor DNS que o NGINX Plus usa para resolver os nomes DNS das instâncias internas do ELB. Aqui está o endereço IP do servidor DNS da AWS.
  • Criamos dois blocos upstream , um para cada grupo de dimensionamento automático correspondente aos nossos serviços, Backend Um e Backend Dois. Identificamos o grupo de dimensionamento automático pelo nome DNS do ELB que balanceia a carga do tráfego para ele.

    Usando o parâmetro resolve , dizemos ao NGINX Plus para resolver novamente o nome periodicamente – a frequência é definida pelo parâmetro válido para a diretiva resolver discutida no tópico anterior. Aqui, definimos para 10 segundos porque os endereços IP do ELB estão sujeitos a alterações frequentes.

    A diretiva de zona aloca memória (aqui até 64 KB) para armazenar os endereços IP resolvidos.

  • Definimos um servidor virtual que escuta na porta 80. Os blocos de localização informam ao NGINX Plus para passar solicitações de /backend‑one para o ELB para o grupo de dimensionamento automático do Backend One e solicitações de /backend‑two para o ELB para o grupo de dimensionamento automático do Backend Two.

Como você pode ver, esse método é fácil de configurar e usar, especialmente se você já estiver usando o ELB. No entanto, existem várias desvantagens:

  • Opções limitadas de balanceamento de carga. Como o NGINX Plus passa solicitações para o ELB, não diretamente para as instâncias de backend, é o ELB que faz o balanceamento de carga. Por esse motivo, você não pode aproveitar os algoritmos de balanceamento de carga mais sofisticados e as opções de persistência de sessão do NGINX Plus.
  • Redundância. O NGINX Plus pode fazer balanceamento de carga, então o ELB é redundante – estamos usando-o apenas porque ele é nativamente integrado com o Auto Scaling.
  • Suporte de protocolo limitado. Ao contrário do NGINX Plus, o ELB não oferece suporte a WebSocket e UDP.

O próximo método não depende do ELB e, consequentemente, não tem essas desvantagens.

Usando o NGINX Plus com o software de integração

Com esse método, você instala software de integração adicional junto com o NGINX Plus. O software ( nginx-asg-sync ) monitora constantemente os grupos de dimensionamento automático. Ao detectar que um evento de dimensionamento ocorreu, ele adiciona ou remove instâncias de backend da configuração do NGINX Plus. Conforme mostrado, o nginx-asg-sync aprende sobre alterações em grupos de dimensionamento automático por meio da API de dimensionamento automático da AWS.

Para usar o NGINX Plus como balanceador de carga na nuvem para grupos do AWS Auto Scaling, instale o software de integração nginx-asg-sync para aprender sobre alterações de grupo automaticamente na API do AWS Auto Scaling.

Para usar o software de integração, execute as seguintes etapas:

  1. Configurar acesso à API da AWS
  2. Instalar o software de integração
  3. Configurar NGINX Plus
  4. Configurar o software de integração

As instruções pressupõem que os grupos de dimensionamento automático para os backends já existam. Eles também presumem que o NGINX Plus está sendo executado em uma AMI do Amazon Linux.

Etapa 1 – Configurar acesso à API da AWS

A comunicação com a API de dimensionamento automático é autenticada, portanto, você deve fornecer credenciais para nginx-asg-sync . A AWS usa funções do IAM para manipular credenciais, então você precisa criar uma função para a instância do NGINX Plus antes de iniciá-la. Para obter instruções passo a passo, consulte Funções do IAM para Amazon EC2 na documentação da AWS.

  1. Crie uma função do IAM e anexe a política predefinida AmazonEC2ReadOnlyAccess a ela. Esta política permite acesso somente leitura às APIs do EC2.
  2. Ao iniciar a instância do NGINX Plus, adicione esta função do IAM à instância.

Etapa 2 – Instalar o software de integração

Para instalar o software de integração, baixe o pacote para seu sistema operacional do repositório nginx-asg-sync do GitHub e instale-o na instância onde o NGINX Plus está em execução.

  • Para Amazon Linux, CentOS e RHEL:

    $ sudo rpm -i nome-do-pacote .rpm
    
  • Para Ubuntu:

    $ sudo dpkg -i nome-do-pacote .deb
    

Para obter instruções completas de instalação, consulte a documentação no GitHub.

Etapa 3 – Configurar o NGINX Plus

O software de integração atualiza a configuração do NGINX Plus usando as APIs de reconfiguração dinâmica e monitoramento de atividades ao vivo . Para que o software funcione corretamente, você deve configurar essas APIs e também declarar os grupos upstream necessários:

  • Configure os endpoints da API para reconfiguração instantânea e monitoramento de atividades em tempo real. O software de integração usa esses endpoints para adicionar e remover instâncias de backend de grupos upstream.
  • Crie um bloco upstream para cada grupo de dimensionamento automático. Não defina nenhum servidor no bloco, pois o nginx-asg-sync os adiciona e remove automaticamente em resposta a eventos de dimensionamento.

O exemplo a seguir representa a configuração do nosso aplicativo web simples:

upstream backend-one { zona backend-one 64k;
estado /var/lib/nginx/state/backend-one.conf;
}

upstream backend-two {
zona backend-two 64k;
estado /var/lib/nginx/state/backend-two.conf;
}

servidor {
ouvir 80;

zona de status backend;

localização /backend-one {
proxy_set_header Host $host;
proxy_pass http://backend-one;
}

localização /backend-two {
proxy_set_header Host $host;
proxy_pass http://backend-two;
}
}

servidor {
ouvir 8080;

raiz /usr/share/nginx/html;

localização = / {
retornar 302 /status.html;
}

localização = /status.html {}

localização /status {
access_log off;
status;
}

localização /upstream_conf {
upstream_conf;
}
}
  • Como no exemplo do ELB, declaramos dois grupos upstream – backend‑one e backend‑two , que correspondem aos nossos grupos de dimensionamento automático. Aqui, no entanto, não adicionamos nenhum servidor aos grupos upstream, porque os servidores serão adicionados pelo nginx‑aws‑sync . A diretiva de estado nomeia o arquivo onde a lista dinamicamente configurável de servidores é armazenada, permitindo que ela persista após reinicializações do NGINX Plus.
  • Definimos um servidor virtual que escuta na porta 80. Em contraste com o exemplo do ELB, o NGINX Plus passa solicitações para /backend‑one diretamente para as instâncias do grupo Backend One, e solicitações para /backend‑two diretamente para as instâncias do grupo Backend Two.
  • Definimos um segundo servidor virtual escutando na porta 8080 e configuramos as APIs do NGINX Plus nele:

    • A API on-the-fly está disponível em 127.0.0.1:8080/upstream_conf
    • A API de status está disponível em 127.0.0.1:8080/status

Etapa 4 – Configurar o software de integração

O software de integração é configurado no arquivo aws.yaml na pasta /etc/nginx . Para nossa aplicação, definimos a seguinte configuração:

região: us-west-2upstream_conf_endpoint: http://127.0.0.1:8080/upstream_conf
status_endpoint: http://127.0.0.1:8080/status
sync_interval_in_seconds: 5
upstreams:
- nome: backend-one
autoscaling_group: backend-one-group
porta: 80
tipo: http
- nome: backend-two
autoscaling_group: backend-two-group
porta: 80
tipo: http
  • A chave de região define a região da AWS onde implantamos nosso aplicativo.
  • As chaves upstream_conf_endpoint e status_endpoint definem os endpoints da API do NGINX Plus, que configuramos na Etapa 3 .
  • A chave sync_interval_in_seconds define o intervalo de sincronização: nginx-asg-sync verifica atualizações de dimensionamento a cada 5 segundos.
  • A chave upstreams define a lista de grupos upstream. Para cada grupo upstream especificamos:

    • nome – O nome que especificamos para o bloco upstream na Etapa 3.
    • autoscaling_group – O nome do grupo de dimensionamento automático correspondente.
    • porta – A porta na qual nossos serviços de backend são expostos.
    • kind – O protocolo do tráfego NGINX Plus balanceia a carga para o aplicativo de backend, aqui http . Se o aplicativo usar TCP/UDP, especifique stream .

Depois de editar o arquivo aws.yaml , reinicie o software:

$ sudo reiniciar nginx-asg-sync

Testando balanceamento de carga e dimensionamento

Nas etapas acima, configuramos o NGINX Plus para balancear a carga de grupos de dimensionamento automático para nosso aplicativo. Agora podemos testar. O NGINX Plus distribui solicitações com o URI /backend‑one para as instâncias do grupo Backend One e solicitações com o URI /backend‑two para as instâncias do grupo Backend Two.

Podemos ver como o NGINX Plus seleciona novas instâncias quando dimensionamos nossos grupos de dimensionamento automático. Primeiro, acessamos o painel de monitoramento de atividades ao vivo , acessível em /status.html na porta 8080 da instância do NGINX Plus. Na guia Upstream , vemos as instâncias em nossos grupos de dimensionamento automático:

Ao usar o NGINX Plus como um balanceador de carga na nuvem, a guia "Upstreams" no painel de monitoramento de atividades ao vivo mostra as instâncias do aplicativo em cada grupo do AWS Auto Scaling.

Agora, ampliamos o grupo Backend One de três para cinco instâncias alterando a capacidade do grupo Auto Scaling. Depois que as novas instâncias são iniciadas, o nginx-asg-sync as adiciona à configuração do NGINX Plus. Em breve as novas instâncias aparecerão no painel:

Quando o número de instâncias de aplicativo em um grupo do AWS Auto Scaling muda, o painel de monitoramento de atividades ao vivo do NGINX Plus mostra os novos membros do grupo imediatamente.

Tornando o NGINX Plus altamente disponível

Até agora, lançamos apenas uma instância do NGINX Plus. No entanto, para alta disponibilidade, recomendamos criar um grupo de dimensionamento automático para o próprio NGINX Plus e usar o ELB na frente das instâncias do NGINX Plus. Como alternativa ao ELB, você pode usar o Route 53 para rotear o tráfego para instâncias do NGINX Plus. O diagrama da nossa implantação com ELB se parece com isso:

Para uma configuração de alta disponibilidade do NGINX Plus como balanceador de carga em nuvem para grupos de dimensionamento automático da AWS, coloque o NGINX Plus atrás do ELB ou do Route 53.

Escolhendo o método certo

Então, qual método de configuração do NGINX Plus para balancear a carga de grupos de dimensionamento automático é melhor para você? A tabela compara brevemente os dois:

  NGINX Plus na frente do ELB NGINX Plus com o software de integração
Vantagens Configuração simples e sem instalação de software adicional. Benefícios completos de todos os recursos do NGINX Plus, sem nenhuma limitação imposta pelo método ELB.
Desvantagens Limita o número de recursos do NGINX Plus que você pode usar, incluindo protocolos suportados. Aumenta o custo da implantação, bem como a latência. Requer instalação e configuração do software de integração.
Resumo Use este método se suas desvantagens forem aceitáveis. Use este método para aproveitar ao máximo os recursos do NGINX Plus.

Resumo

O AWS Auto Scaling oferece o benefício de ajustar o número de instâncias do aplicativo ao nível de demanda. O NGINX Plus fornece recursos avançados de balanceamento de carga que podem ser usados em conjunto com grupos de dimensionamento automático da AWS.

Experimente o NGINX Plus com seus grupos de dimensionamento automático da AWS – comece seu teste gratuito de 30 dias ou entre em contato conosco para discutir seus casos de uso .


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