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ê 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.
Antes de começar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure 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 por meio de 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:
No Console do Google Cloud, acesse a página Redes VPC.
Clique em Criar rede VPC.
Em Nome, insira
web-app-vpc
.Defina o Modo de criação da sub-rede como Automático.
Na parte inferior da página, clique em Criar.
Aguarde o término da criação da rede VPC antes de continuar.
Criar 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:
No console do Google Cloud, abra a página Firewalls.
Clique em Criar regra de firewall.
No campo Nome, use
allow-web-app-http
.Defina Rede como
web-app-vpc
.Em Destinos, selecione Todas as instâncias na rede.
Defina Filtro de origem como
IPv4 ranges
.Em Intervalos de IP de origem, insira
0.0.0.0/0
para permitir o acesso a todos os endereços IP.Em Protocolos e portas, selecione Portas e protocolos especificados.
Marque TCP e insira80
para permitir o acesso do tráfego HTTP.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 por meio de um script de inicialização.
No Console do Google Cloud, acesse a página Modelos de instância.
Clique em Criar modelo de instância.
Em Nome, insira
load-balancing-web-app-template
.Em Configuração da máquina, defina Tipo de máquina como
e2-micro
.Em Firewall, selecione Permitir tráfego HTTP.
Expanda a seção Opções avançadas.
Expanda a seção Gerenciamento.
Na seção Automação, insira o seguinte script de inicialização:
sudo apt update && sudo apt -y install git gunicorn3 python3-pip git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/compute/managed-instances/demo sudo pip3 install -r requirements.txt sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
O script recebe, instala e inicia o aplicativo da Web quando a instância da VM é iniciada.
Expanda a seção Rede.
Na seção Interfaces de rede, 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.Clique em Criar.
Aguarde o término da 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:
No Console do Google Cloud, acesse a página Grupos de instâncias.
Clique em Criar grupo de instâncias.
Selecione Novo grupo gerenciado de instâncias (sem estado).
Em Nome, insira
load-balancing-web-app-group
.Em Modelo de instância, selecione
load-balancing-web-app-template
.Defina o Número de instâncias como
6
. Se esse campo estiver desativado, desative o escalonamento automático primeiro.Para Local, selecione Várias zonas.
Em Região, selecione us-central1.
Em Zonas, selecione as seguintes zonas na lista suspensa:
- us-central1-b
- us-central1-c
- us-central1-f
Selecione Permitir redistribuição de instâncias.
Em Modo de escalonamento automático, selecione Desativado: não fazer escalonamento automático.
Clique em Criar. Isso redireciona você de volta à página Grupos de instâncias.
Para verificar se suas instâncias estão executando o aplicativo da Web de demonstração corretamente, siga estas etapas:
- Na página Grupos de instâncias, clique em
load-balancing-web-app-group
para ver as instâncias nesse grupo. Em IP externo, clique em um endereço IP para conectar essa instância. Uma nova guia do navegador será aberta, exibindo o aplicativo de demonstração da Web:
Quando terminar, feche a guia do navegador com o aplicativo de demonstração da Web.
- Na página Grupos de instâncias, clique em
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 afiliado do Google Cloud. Isso permite que o aplicativo da Web sempre tenha o mesmo ponto de entrada, mesmo que outras partes do aplicativo possam mudar.
No Console do Google Cloud, acesse a página Endereços IP externos.
Clique em Reservar endereço estático.
Em Nome, insira
web-app-ipv4
.Defina Versão IP como IPv4.
Configure Tipo como Global.
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 várias partes.
- Configuração de back-end
- Configuração de front-end
- Analisar e finalizar
Conclua todas as etapas para criar o balanceador de carga.
Iniciar a configuração
No console do Google Cloud, acesse a página Balanceamento de carga.
- Clique em Criar balanceador de carga.
- Em Tipo de balanceador de carga, selecione Balanceador de carga de aplicativo (HTTP/HTTPS) e clique em Próxima.
- Em Voltado ao público ou interno, selecione Voltado ao público (externo) e clique em Próxima.
- Em Implantação global ou de região única, selecione Melhor para cargas de trabalho globais e clique em Próxima.
- Em Geração do balanceador de carga, selecione Balanceador de carga de aplicativo externo global e clique em Próxima.
- Clique em Configurar.
Configuração básica
- Em Nome do balanceador de carga, insira
web-app-load-balancer
.
Configuração de back-end
- No painel esquerdo da página Criar balanceador de carga de aplicativo externo global, clique em Configuração de back-end.
- Clique em Criar ou selecione serviços e buckets de back-end para abrir um menu suspenso. Clique em Serviços de back-end e em Criar um serviço de back-end.
- Na nova janela, para o Nome do aplicativo de back-end, insira
web-app-backend
. - Defina Grupo de instâncias como
load-balancing-web-app-group
. - Defina Números de portas como
80
. Isso permite o tráfego HTTP entre o balanceador de carga e o grupo de instâncias. - Em Modo de balanceamento, selecione Utilização.
- Clique em Concluído para criar o back-end.
Crie a verificação de integridade para o back-end do balanceador de carga:
- Em Verificação de integridade, selecione Criar uma verificação de integridade (ou Criar outra verificação de integridade) no menu suspenso. Uma nova janela será aberta.
- Na nova janela, em Nome, digite
web-app-load-balancer-check
. - Defina Protocolo como HTTP.
- Em Porta, digite
80
. - 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. Defina os seguintes Critérios de integridade:
- 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. - Defina Tempo limite como
3
segundos. Isso define o tempo que o Google Cloud aguardará pela resposta de uma sondagem. O valor precisa ser menor ou igual ao intervalo de verificação. - 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. - 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.
- Defina Intervalo de verificação como
Clique em Salvar e continuar para criar a verificação de integridade.
Clique em Criar para criar o serviço de back-end.
Configuração de front-end
- No painel esquerdo da página Criar balanceador de carga de aplicativo externo global, clique em Configuração de front-end.
- Na página Configuração de front-end, em Nome, digite
web-app-ipv4-frontend
. - Defina Protocolo como
HTTP
. - Defina Versão do IP como
IPv4
. - Defina Endereço IP como
web-app-ipv4
. - Defina Porta como
80
. - Clique em Concluído para criar o front-end.
Analisar e finalizar
Verifique suas configurações de balanceamento de carga antes de criar o balanceador de carga:
- No painel esquerdo da página Criar balanceador de carga de aplicativo externo global, clique em Analisar e finalizar.
Na página Analisar e finalizar, 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
.
- O Serviço de back-end é
Na mesma página, verifique se o Front-end usa um endereço IP com um Protocolo
HTTP
.
No painel esquerdo da página Criar balanceador de carga de aplicativo externo global, 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.
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.
Monitore para quais zonas o balanceador de carga está direcionando o tráfego.
No Console do Google Cloud, acesse o Cloud Shell.
O Cloud Shell é aberto em um painel do Console do Google Cloud. A inicialização da sessão pode levar alguns segundos.
Salve o endereço IP externo estático do seu balanceador de carga:
Para ver o endereço IP externo da regra de encaminhamento do front-end do balanceador de carga, digite o seguinte comando no seu terminal:
gcloud compute forwarding-rules describe web-app-ipv4-frontend --global
Copie
EXTERNAl_IP_ADDRESS
da saída:IPAddress: EXTERNAl_IP_ADDRESS ...
Crie uma variável bash local:
export LOAD_BALANCER_IP=EXTERNAl_IP_ADDRESS
em que
EXTERNAl_IP_ADDRESS
é o endereço IP externo que você copiou.
Para monitorar a 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 done
Esse script tenta se conectar continuamente ao aplicativo da Web por meio do endereço IP para o front-end do balanceador de carga e mostra em qual zona o aplicativo da Web está sendo executado para cada conexão.
A saída resultante precisa incluir as zonas
us-central1-b
,us-central1-c
eus-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.
Enquanto o monitoramento estiver em execução, comece a simular a interrupção da zona.
- No Cloud Shell, abra uma segunda sessão de terminal clicando no botão Adicionar.
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)$
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.
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.
(Opcional) Como restringir o tráfego recebido
Ao criar o grupo de instâncias gerenciadas regional, é possível acessar cada instância diretamente por meio do seu endereço IP temporário externo. No entanto, agora que você preparou um balanceador de carga e um endereço IP estático externo, talvez você queira modificar o firewall da rede para que o tráfego de entrada precise passar pelo balanceador de carga.
Se você quiser restringir o tráfego de entrada ao balanceador de carga, modifique o firewall da rede para desativar o endereço IP externo temporário de cada instância.
Edite a regra de firewall para restringir o tráfego HTTP, para que o aplicativo da Web possa ser acessado apenas pelo balanceador de carga:
No Console do Google Cloud, acesse a página Firewalls.
Em Nome, clique em
allow-web-app-http
.Clique em Editar.
Modifique os Intervalos de IPs de origem para permitir apenas testes de verificação de integridade:
- Exclua
0.0.0.0/0
. - Na mesma linha, digite
130.211.0.0/22
e pressione Tab. - Na mesma linha, digite
35.191.0.0/16
e pressione Tab.
- Exclua
Clique em Salvar.
Confirme que não é possível se conectar ao aplicativo da Web através do endereço IP externo temporário de uma instância específica:
No Console do Google Cloud, acesse a página Grupos de instâncias.
Clique em
load-balancing-web-app-group
para ver as instâncias nesse grupo.Em IP externo, clique em um endereço IP para conectar essa instância. Uma nova guia do navegador é aberta, mas o aplicativo da Web não é mostrado. Por fim, a página mostrará um erro de tempo limite.
Quando terminar, feche a guia do navegador da instância.
Verifique se é possível se conectar ao aplicativo da Web usando o balanceador de carga:
No Console do Google Cloud, acesse a página Balanceamento de carga.
Em Nome, clique em
web-app-load-balancer
para expandir o balanceador de carga que você acabou de criar.Para se conectar ao aplicativo da Web por meio dos endereços IP estáticos externos, veja Front-end e IP:Porta e copie o endereço IP. Em seguida, abra uma nova guia do navegador e cole o endereço IP na barra de endereços. Isso mostrará 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.
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.
Como excluir o projeto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Como excluir recursos específicos
Excluir o balanceador de carga
No Console do Google Cloud, acesse a página Balanceamento de carga.
Clique na caixa de seleção ao lado de
web-app-load-balancer
.Clique em
Excluir na parte superior da página.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
No Console do Google Cloud, acesse a página Endereços IP externos.
Clique na caixa de seleção ao lado de
web-app-ipv4
.Clique em
Liberar endereço estático na parte superior da página. Na nova janela, clique em Excluir para confirmar a remoção.
Como excluir o grupo de instâncias
- In the Google Cloud console, go to the Instance groups page.
-
Select the checkbox for
your
load-balancing-web-app-group
instance group. - To delete the instance group, click Delete.
Como excluir o modelo de instância
No Console do Google Cloud, acesse a página Modelos de instância.
Clique na caixa de seleção ao lado de
load-balancing-web-app-template
.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
No Console do Google Cloud, acesse a página Redes VPC.
Clique em
web-app-vpc
.Clique em
Excluir na parte superior da página. Na nova janela, clique em Excluir para confirmar a remoção.
A seguir
- Teste outro tutorial:
- Saiba mais sobre os grupos de instâncias gerenciadas.
- Saiba mais sobre o balanceamento de carga.
- Saiba mais sobre como otimizar a latência do aplicativo com o balanceamento de carga.
- Saiba mais sobre como projetar sistemas robustos.
- Saiba mais sobre como criar aplicativos da Web escalonáveis e resilientes no Google Cloud.