Como usar o balanceamento de carga para aplicativos altamente disponíveis


Neste tutorial, explicamos como usar o balanceamento de carga com um grupo de instâncias gerenciadas regional para redirecionar o tráfego para longe de instâncias de VM ocupadas ou indisponíveis, o que permite fornecer alta disponibilidade mesmo durante uma interrupção de zona.

Um grupo de instâncias gerenciadas regional distribui um aplicativo entre várias instâncias em várias zonas. Um balanceador de carga global direciona o tráfego em várias regiões por meio de um único endereço IP. Ao usar esses dois serviços para distribuir seu aplicativo por várias zonas, você garante que o aplicativo esteja disponível mesmo em casos extremos, como durante uma interrupção de zona.

Os balanceadores de carga podem ser usados para direcionar diversos tipos de tráfego. Neste tutorial, mostramos como criar um balanceador de carga global que direciona o tráfego HTTP externo, mas grande parte do conteúdo deste tutorial ainda é relevante para outros tipos de balanceadores de carga. Para saber mais sobre outros tipos de tráfego que podem ser direcionados com um balanceador de carga, consulte Tipos de Cloud Load Balancing.

Este tutorial inclui etapas detalhadas para iniciar um aplicativo da Web em um grupo de instâncias gerenciadas regional, configurar o acesso à rede, criar um balanceador de carga para direcionar o tráfego para o aplicativo da Web e observar o balanceador de carga simulando uma interrupção de zona. Dependendo da sua experiência com esses recursos, a conclusão deste tutorial leva cerca de 45 minutos.

Objetivos

  • Lançar um aplicativo da Web de demonstração em um grupo de instâncias gerenciadas.
  • Configurar um balanceador de carga global que direcione o tráfego HTTP em várias zonas.
  • Observar os efeitos do balanceador de carga simulando uma interrupção de zona.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

  • Compute Engine

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

Arquitetura do aplicativo

O aplicativo inclui os seguintes componentes do Compute Engine:

  • Rede VPC: uma rede virtual no Google Cloud que pode fornecer conectividade global usando rotas e regras de firewall próprias.
  • Regra de firewall: um firewall do Google Cloud que permite autorizar ou negar o tráfego para suas instâncias.
  • Modelo de instância: um modelo usado para criar cada instância de VM no grupo de instâncias gerenciadas.
  • Grupo de instâncias gerenciadas regional: um grupo de instâncias de VM que executam o mesmo aplicativo em várias zonas.
  • Endereço IP externo estático global: um endereço IP estático acessível em redes externas e que pode ser anexado a um recurso global.
  • Balanceador de carga global: um balanceador de carga que permite que as instâncias de back-end sejam distribuídas por várias regiões. Use o balanceador de carga global quando seus usuários precisarem acessar os mesmos aplicativos e conteúdo e você quiser fornecer acesso usando um único endereço IP anycast.
  • Verificação de integridade: uma política usada pelo balanceador de carga para avaliar a capacidade de resposta do aplicativo em cada instância da VM.

Como lançar o aplicativo da Web

Neste tutorial, é usado um aplicativo da Web armazenado no GitHub. Para saber mais sobre como o aplicativo foi implementado, consulte o repositório GoogleCloudPlatform/python-docs-samples no GitHub.

Inclua um script de inicialização em um modelo de instância para lançar o aplicativo da Web em todas as VMs em um grupo de instâncias. Além disso, execute o grupo de instâncias em uma rede VPC dedicada para impedir que as regras de firewall deste tutorial interfiram nos recursos existentes em execução no seu projeto.

Criar uma rede VPC

O uso de uma rede VPC protege os recursos existentes no seu projeto de serem afetados pelos recursos que você criará para este tutorial. Uma rede VPC também é necessária para restringir o tráfego recebido para que ele passe pelo balanceador de carga.

Crie uma rede VPC para encapsular as regras de firewall para o aplicativo da Web de demonstração:

  1. No console Google Cloud , acesse a página Redes VPC.

    Acessar redes VPC

  2. Clique em Criar rede VPC.

  3. Em Nome, insira web-app-vpc.

  4. Defina Modo de criação da sub-rede como Personalizado.

  5. Crie uma sub-rede da seguinte maneira:

    1. Na seção Sub-redes, defina o campo Nome e insira web-app-vpc-subnet.
    2. No menu suspenso Região, selecione us-central1.
    3. Verifique se a opção Tipo de pilha de IP está definida como IPv4.
    4. Na seção Intervalo IPv4 principal, insira o intervalo IPv4 10.2.0.0/24.
  6. Na parte de baixo da página, clique em Criar.

Aguarde a criação da rede VPC antes de continuar.

Criar uma regra de firewall

Após a criação da rede VPC, configure uma regra de firewall para permitir o tráfego HTTP na rede VPC:

  1. No console Google Cloud , acesse a página Firewalls.

    Acessar Firewalls

  2. Clique em Criar regra de firewall.

  3. No campo Nome, use allow-web-app-http.

  4. Defina Rede como web-app-vpc.

  5. Verifique se as seguintes opções estão definidas conforme indicado:

    • A opção Direção do tráfego está definida como Entrada.
    • A opção Ação se houver correspondência está definida como Permitir.
  6. No menu suspenso Destinos, selecione Todas as instâncias na rede.

  7. Defina Filtro de origem como IPv4 ranges.

  8. No campo Intervalos de IPs de origem, insira 130.211.0.0/22, 35.191.0.0/16 para permitir verificações de integridade do balanceador de carga.

  9. Em Protocolos e portas, faça o seguinte:

    1. Selecione Portas e protocolos especificados.
    2. Selecione TCP.
    3. No campo Portas, insira 80 para permitir o acesso do tráfego HTTP.
  10. Clique em Criar.

Criar um modelo de instância

Crie um modelo que você usará para criar um grupo de instâncias da VM. Cada instância criada a partir do modelo inicia um aplicativo da Web de demonstração usando um script de inicialização.

  1. No console Google Cloud , acesse a página Modelos de instância.

    Acesse "Modelos de instância"

  2. Clique em Criar modelo de instância.

  3. Em Nome, insira load-balancing-web-app-template.

  4. Em Configuração da máquina, defina Tipo de máquina como e2-medium.

  5. Clique na seção Opções avançadas para abrir.

  6. Clique na seção Rede e faça o seguinte:

    1. Na seção Interfaces de rede, exclua as interfaces de rede clicando no ícone ao lado delas.
    2. Clique em Adicionar uma interface de rede e selecione a rede web-app-vpc. Isso força cada instância criada com este modelo a ser executada na rede criada anteriormente.
    3. No menu suspenso Sub-rede, selecione web-app-vpc-subnet.
    4. Clique em Concluído.
  7. Clique na seção Gerenciamento e faça o seguinte:

    1. Na seção Automação, insira o seguinte script de inicialização:

      apt-get update
      apt-get -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo
      

      O script recebe, instala e inicia o aplicativo da Web quando uma instância da VM é iniciada.

  8. Nas opções restantes, mantenha os valores padrão.

  9. Clique em Criar.

Aguarde a criação do modelo antes de continuar.

Criar um grupo de instâncias gerenciadas regional

Para executar o aplicativo da Web, use o modelo de instância para criar um grupo de instâncias gerenciadas regional:

  1. No console Google Cloud , acesse a página Grupos de instâncias.

    Acesse grupo de instâncias

  2. Clique em Criar grupo de instâncias.

  3. Em Nome, insira load-balancing-web-app-group.

  4. Em Modelo de instância, selecione load-balancing-web-app-template.

  5. Defina o Número de instâncias como 6. Se esse campo estiver desativado, desative o escalonamento automático primeiro.

    Para desativar o escalonamento automático, acesse a seção Escalonamento automático. No menu suspenso Modo de escalonamento automático, selecione Desativado: não fazer escalonamento automático.

  6. Para Local, selecione Várias zonas.

  7. Em Região, selecione us-central1.

  8. Em Zonas, selecione as seguintes zonas na lista suspensa:

    • us-central1-b
    • us-central1-c
    • us-central1-f
  9. Nas opções restantes, mantenha os valores padrão.

  10. Clique em Criar. Isso redireciona você de volta à página Grupos de instâncias.

    Talvez seja necessário aguardar alguns minutos até que todas as instâncias do grupo estejam em execução.

Como configurar o balanceador de carga

Para usar um balanceador de carga para direcionar o tráfego para seu aplicativo da Web, é preciso reservar um endereço IP externo para receber todo o tráfego de entrada. Em seguida, crie um balanceador de carga que aceite o tráfego desse endereço IP e redirecione esse tráfego para o grupo de instâncias.

Reservar um endereço IP estático

Use um endereço IP externo estático global para fornecer ao balanceador de carga um único ponto de entrada para receber todo o tráfego do usuário. O Compute Engine preserva endereços IP estáticos, mesmo se você alterar ou excluir qualquer recurso Google Cloud afiliado. Isso permite que o aplicativo da Web sempre tenha o mesmo ponto de entrada, mesmo que outras partes do aplicativo possam mudar.

  1. No console Google Cloud , acesse a página Endereços IP.

    Acessar endereços IP

  2. Selecione Reservar endereço IP estático externo.

  3. No campo Nome, use web-app-ipv4.

  4. Defina Versão IP como IPv4.

  5. Configure Tipo como Global.

  6. Clique em Reservar.

Criar um balanceador de carga

Nesta seção, explicamos as etapas necessárias para criar um balanceador de carga global que direciona o tráfego HTTP.

Esse balanceador de carga usa um front-end para receber tráfego de entrada e um back-end para distribuir esse tráfego para instâncias íntegras. Como o balanceador de carga é composto por vários componentes, essa tarefa é dividida em cinco partes:

  • Selecione o tipo de balanceador de carga
  • Nomeie o balanceador de carga
  • Configurar o front-end
  • Configure o back-end
  • Analisar e finalizar

Conclua todas as partes para criar o balanceador de carga.

Selecione o tipo de balanceador de carga

  1. No console Google Cloud , acesse a página Balanceamento de carga.

    Acessar o "Balanceamento de carga"

  2. Clique em Criar balanceador de carga.
  3. Em Tipo de balanceador de carga, selecione Balanceador de carga de aplicativo (HTTP/HTTPS) e clique em Próxima.
  4. Em Voltado ao público ou interno, selecione Voltado ao público (externo) e clique em Próxima.
  5. Em Implantação global ou de região única, selecione Melhor para cargas de trabalho globais e clique em Próxima.
  6. Em Geração do balanceador de carga, selecione Balanceador de carga de aplicativo externo global e clique em Próxima.
  7. Clique em Configurar.

Nomeie o balanceador de carga

  1. No painel à esquerda, em Nome do balanceador de carga, insira web-app-load-balancer.

Configurar o front-end

  1. Na página Configuração de front-end, em Nome, digite web-app-ipv4-frontend.
  2. Defina Protocolo como HTTP.
  3. Defina Versão do IP como IPv4.
  4. Defina o Endereço IP como web-app-ipv4.
  5. Defina a Porta como 80.
  6. Clique em Concluído para criar o front-end.

Configure o back-end

  1. No painel esquerdo, clique em Configuração de back-end.
  2. Clique no menu suspenso Serviços e buckets de back-end para abrir um menu e clique em Criar um serviço de back-end.
  3. Na nova janela, para o Nome do serviço de back-end, insira web-app-backend.
  4. Na seção Back-ends, faça o seguinte:
    1. Defina Grupo de instâncias como load-balancing-web-app-group.
    2. Defina Números de portas como 80. Isso permite o tráfego HTTP entre o balanceador de carga e o grupo de instâncias.
    3. Em Modo de balanceamento, selecione Utilização.
    4. Clique em Concluído.
  5. Crie a verificação de integridade para o back-end do balanceador de carga da seguinte maneira:

    1. Clique no menu suspenso Verificação de integridade e em Criar uma verificação de integridade. Uma nova janela será aberta.
    2. Na nova janela, em Nome, digite web-app-load-balancer-check.
    3. Defina Protocolo como HTTP.
    4. Em Porta, digite 80.
    5. Para este tutorial, defina o Caminho da solicitação como /health, que é o caminho a que o aplicativo da Web de demonstração está configurado para responder.
    6. Defina os seguintes Critérios de integridade:

      1. Defina Intervalo de verificação como 3 segundos. Isso define o período entre o início de uma sondagem e o início da próxima.
      2. Defina Tempo limite como 3 segundos. Isso define o tempo que Google Cloud aguardará a resposta de uma sondagem. O valor precisa ser menor ou igual ao intervalo de verificação.
      3. Defina Limite íntegro como 2 sucessos consecutivos. Isso define o número sequencial de sondagens que precisam ser bem-sucedidas para que a instância seja considerada íntegra.
      4. Defina Limite não íntegro como 2 falhas consecutivas. Isso define o número de falhas seguidas em sondagens para que a instância seja considerada não íntegra.
    7. Clique em Criar para criar a verificação de integridade.

  6. Nas opções restantes, mantenha os valores padrão.

  7. Clique em Criar para criar o serviço de back-end.

Analisar e finalizar

Verifique suas configurações de balanceamento de carga antes de criar o balanceador de carga:

  1. No painel esquerdo da página Criar balanceador de carga de aplicativo externo global, clique em Analisar e finalizar.
  2. Na página Revisar e finalizar, verifique se o front-end usa um endereço IP com um protocolo HTTP.

  3. Na mesma página, verifique as seguintes configurações de back-end:

    • O Serviço de back-end é web-app-backend.
    • O Protocolo do endpoint é HTTP.
    • A Verificação de integridade é web-app-load-balancer-check.
    • O Grupo de instâncias é load-balancing-web-app-group.
  4. Clique em Criar para concluir a criação do balanceador de carga.

Pode ser necessário aguardar alguns minutos para que a criação do balanceador de carga seja concluída.

Testar o balanceador de carga

Verifique se é possível se conectar ao aplicativo da Web usando o balanceador de carga da seguinte maneira:

  1. No console Google Cloud , acesse a página Balanceamento de carga.

    Acessar o "Balanceamento de carga"

  2. Na coluna Nome, clique em web-app-load-balancer para expandir o balanceador de carga que você acabou de criar.

  3. Para se conectar ao web app usando os endereços IP estáticos externos, faça o seguinte:

    1. Na seção Front-end, copie o endereço IP mostrado na coluna IP:Porta.
    2. Abra uma nova guia do navegador e cole o endereço IP na barra de endereço. Isso mostrará o aplicativo da Web de demonstração.

      Aplicativo de demonstração da Web.

    Observe que, sempre que você atualiza a página, o balanceador de carga se conecta a diferentes instâncias em diferentes zonas. Isso acontece porque você não está se conectando diretamente a uma instância, você está se conectando ao balanceador de carga, que seleciona a instância para redirecionar o acesso.

    Quando terminar, feche a guia do navegador com o aplicativo de demonstração da Web.

Simular uma interrupção de zona

É possível observar a funcionalidade do balanceador de carga simulando a indisponibilidade generalizada de uma interrupção de zona. Essa simulação força todas as instâncias localizadas em uma zona especificada a relatar um status não íntegro no caminho da solicitação /health. Quando essas instâncias relatam um status não íntegro, elas geram uma falha na verificação de integridade do balanceamento de carga, solicitando que o balanceador de carga pare de direcionar o tráfego para elas.

  1. Monitore para quais zonas o balanceador de carga está direcionando o tráfego.

    1. No Google Cloud console, acesse o Cloud Shell.

      Abra o Cloud Shell

      O Cloud Shell é aberto em um painel do console doGoogle Cloud . A inicialização da sessão pode levar alguns segundos.

    2. Salve o endereço IP externo estático do balanceador de carga da seguinte maneira:

      1. Para ver o endereço IP externo da regra de encaminhamento do front-end do balanceador de carga, insira o seguinte comando no seu terminal:

        gcloud compute forwarding-rules describe web-app-ipv4-frontend --global
        

        A saída será assim. Copie o EXTERNAl_IP_ADDRESS da saída.

        IPAddress: EXTERNAl_IP_ADDRESS
        ...
        
      2. Crie uma variável bash local:

        export LOAD_BALANCER_IP=EXTERNAl_IP_ADDRESS
        

        Substitua EXTERNAl_IP_ADDRESS pelo endereço IP externo que você copiou.

    3. Para monitorar para quais zonas o balanceador de carga está direcionando o tráfego, execute o seguinte script bash:

      while true
      do
          BODY=$(curl -s "$LOAD_BALANCER_IP")
          NAME=$(echo -n "$BODY" | grep "load-balancing-web-app-group" | perl -pe 's/.+?load-balancing-web-app-group-(.+?)<.+/\1/')
          ZONE=$(echo -n "$BODY" | grep "us-" | perl -pe 's/.+?(us-.+?)<.+/\1/')
          echo $ZONE
          sleep 2 # Wait for 2 seconds
      done
      

      Esse script tenta se conectar continuamente ao aplicativo da Web usando o endereço IP do front-end do balanceador de carga e mostra em qual zona o aplicativo da Web está sendo executado em cada conexão.

      A saída resultante precisa incluir as zonas us-central1-b, us-central1-c e us-central1-f:

      us-central1-f
      us-central1-b
      us-central1-c
      us-central1-f
      us-central1-f
      us-central1-c
      us-central1-f
      us-central1-c
      us-central1-c
      

      Mantenha esse terminal aberto.

  2. Enquanto o monitoramento estiver em execução, comece a simular a interrupção da zona.

    1. No Cloud Shell, abra uma segunda sessão de terminal clicando no botão Adicionar.
    2. Crie uma variável bash local para o ID do projeto:

      export PROJECT_ID=PROJECT_ID
      

      em que PROJECT_ID é o ID do projeto atual, que é exibido em cada nova linha no Cloud Shell:

      user@cloudshell:~ (PROJECT_ID)$
      
    3. Crie uma variável bash local para a zona que você quer desativar. Para simular uma falha da zona us-central1-f, use o seguinte comando:

      export DISABLE_ZONE=us-central1-f
      

      Em seguida, execute o seguinte script bash. Esse script faz com que as instâncias do aplicativo da Web de demonstração na zona desativada produzam respostas não íntegras para a verificação de integridade do balanceador de carga. Respostas não íntegras solicitam que o balanceador de carga direcione o tráfego para longe dessas instâncias.

      export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($DISABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group")
      for i in $MACHINES;
      do
        NAME=$(echo "$i" | cut -f1 -d,)
        IP=$(echo "$i" | cut -f2 -d,)
        echo "Simulating zonal failure for zone $DISABLE_ZONE, instance $NAME"
        curl -q -s "http://$IP/makeUnhealthy" >/dev/null --retry 2
      done
      

      Após um pequeno atraso, o balanceador de carga para de direcionar o tráfego para as zonas não íntegras. Portanto, a saída da primeira janela do terminal para de listar a zona us-central1-f:

      us-central1-c
      us-central1-c
      us-central1-c
      us-central1-b
      us-central1-b
      us-central1-c
      us-central1-b
      us-central1-c
      us-central1-c
      

      Isso indica que o balanceador de carga está direcionando o tráfego apenas para instâncias íntegras e com resposta.

      Mantenha os dois terminais abertos.

    4. No segundo terminal, crie uma variável bash local para a zona que você quer restaurar. Para restaurar o tráfego para a zona us-central1-f, use o seguinte comando:

      export ENABLE_ZONE=us-central1-f
      

      Em seguida, execute o seguinte script bash. Esse script faz com que as instâncias do aplicativo da Web de demonstração na zona ativada produzam respostas íntegras à verificação de integridade do balanceador de carga. Respostas íntegras solicitam ao balanceador de carga que comece a distribuir o tráfego de volta para essas instâncias.

      export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($ENABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group")
      for i in $MACHINES;
      do
        NAME=$(echo "$i" | cut -f1 -d,)
        IP=$(echo "$i" | cut -f2 -d,)
        echo "Simulating zonal restoration for zone $ENABLE_ZONE, instance $NAME"
        curl -q -s "http://$IP/makeHealthy" >/dev/null --retry 2
      done
      

      Após alguns minutos, a saída da primeira janela de terminal lista gradualmente a zona us-central1-f de novo:

      us-central1-b
      us-central1-b
      us-central1-c
      us-central1-f
      us-central1-c
      us-central1-c
      us-central1-b
      us-central1-c
      us-central1-f
      

      Isso indica que o balanceador de carga está direcionando o tráfego de entrada para todas as zonas novamente.

      Feche os dois terminais quando encerrar.

Limpar

Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, você aprenderá a excluir e desativar esses recursos.

Se você tiver criado um projeto separado para este tutorial, exclua o projeto inteiro. Se o projeto tiver recursos que você quer manter, exclua apenas os recursos criados neste tutorial.

Excluir o projeto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Como excluir recursos específicos

As seções a seguir descrevem como excluir os recursos específicos que você criou durante este tutorial.

Excluir o balanceador de carga

  1. No console Google Cloud , acesse a página Balanceamento de carga.

    Acessar o "Balanceamento de carga"

  2. Clique na caixa de seleção ao lado de web-app-load-balancer.

  3. Clique em Excluir na parte superior da página.

  4. Na nova janela, marque todas as caixas de seleção. Em seguida, clique em Excluir balanceador de carga e recursos selecionados para confirmar a exclusão.

Como excluir o endereço IP externo estático

Aguarde até que o balanceador de carga seja excluído antes de excluir o endereço IP externo estático.

  1. No Google Cloud console, acesse a página Endereços IP externos.

    Acessar Endereços IP externos

  2. Clique na caixa de seleção ao lado de web-app-ipv4.

  3. Clique em Liberar endereço estático na parte de cima da página. Na nova janela, clique em Liberar para confirmar a liberação.

Como excluir o grupo de instâncias

Aguarde até que o balanceador de carga seja excluído antes de excluir o grupo de instâncias.

  1. In the Google Cloud console, go to the Instance groups page.

    Go to Instance groups

  2. Select the checkbox for your load-balancing-web-app-group instance group.
  3. To delete the instance group, click Delete.

Como excluir o modelo de instância

É preciso concluir a exclusão do grupo de instâncias antes de excluir o modelo de instância. Não será possível excluir um modelo de instância se um grupo de instâncias gerenciadas o estiver usando.

  1. No console Google Cloud , acesse a página Modelos de instância.

    Acesse "Modelos de instância"

  2. Clique na caixa de seleção ao lado de load-balancing-web-app-template.

  3. Clique em Excluir na parte superior da página. Na nova janela, clique em Excluir para confirmar a remoção.

Como excluir a rede VPC

É preciso concluir a exclusão do grupo de instâncias antes de excluir a rede VPC. Não será possível excluir uma rede VPC se ela ainda for usada por outros recursos.

  1. No console Google Cloud , acesse a página Redes VPC.

    Acessar redes VPC

  2. Clique em web-app-vpc.

  3. Clique em Excluir rede VPC na parte de cima da página. Na nova janela, clique em Excluir para confirmar a remoção.

A seguir