1. Introdução
Bem-vindo ao codelab do balanceador de carga HTTPs externo com gerenciamento avançado de tráfego (Envoy)!
A versão mais recente do balanceador de carga HTTP(S) externo com gerenciamento de tráfego avançado contém todos os recursos do balanceador de carga HTTP(S) externo global clássico, mas com uma lista cada vez maior de recursos avançados de gerenciamento de tráfego. Alguns desses recursos são novos nos nossos balanceadores de carga, e outros oferecem recursos aprimorados para recursos atuais. Uma lista parcial desses recursos inclui:
- Divisão de tráfego ponderada
- Solicitar espelhamento
- Detecção de outlier
- Tentativas de solicitação
- Injeção de falhas
- Outras opções de afinidade de sessão de back-end
- Outras opções de transformação de cabeçalho
- Compartilhamento de recursos entre origens (CORS, na sigla em inglês)
- Novos algoritmos de balanceamento de carga
O que você vai aprender
- Como configurar um grupo gerenciado de instâncias e a VPC e as regras de firewall associadas
- Como usar os recursos avançados de gerenciamento de tráfego do novo balanceador de carga
- Como validar se os recursos avançados de gerenciamento de tráfego estão funcionando conforme o esperado.
O que é necessário
- Conhecimento básico de redes e HTTP
- Conhecimento básico de linha de comando do Unix/Linux
Topologia e caso de uso do codelab
Figura 1: topologia de roteamento do balanceador de carga HTTP
Neste codelab, você vai configurar três grupos gerenciados de instâncias, um no leste, um no oeste e um no centro. Você vai criar um balanceador de carga HTTPS externo global. O balanceador de carga vai usar vários recursos da lista de recursos avançados compatíveis com o balanceador de carga baseado no Envoy. Depois da implantação, gere uma carga simulada e verifique se as configurações definidas estão funcionando corretamente.
2. Configuração e requisitos
Configuração de ambiente autoguiada
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.
- O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
- O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID
. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Inicie o Cloud Shell
Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.
No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:
O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:
Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.
Antes de começar
No Cloud Shell, verifique se o ID do projeto está configurado.
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID
Ativar APIs
Ative todos os serviços necessários
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. criar a rede VPC
Crie uma rede VPC
No Cloud Shell
gcloud compute networks create httplbs --subnet-mode=auto
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs]. NAME: httplbs SUBNET_MODE: AUTO BGP_ROUTING_MODE: REGIONAL IPV4_RANGE: GATEWAY_IPV4:
Criar regras de firewall da VPC
Depois de criar a VPC, crie regras de firewall. A regra de firewall será usada para permitir que todos os IPs acessem o IP externo do site do aplicativo de teste na porta 80 para tráfego http.
No Cloud Shell
gcloud compute firewall-rules create httplb-allow-http-rule \ --allow tcp:80 \ --network httplbs \ --source-ranges 0.0.0.0/0 \ --priority 700
Saída
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule]. Creating firewall...done. NAME: httplb-allow-http-rule NETWORK: httplbs DIRECTION: INGRESS PRIORITY: 700 ALLOW: tcp:80 DENY: DISABLED: False
4. Configurar os grupos gerenciados de instâncias
Você precisa configurar grupos gerenciados de instâncias que incluem os padrões para recursos de back-end usados pelo balanceador de carga HTTP. Primeiro, vamos criar modelos de instância que definem a configuração das VMs a serem criadas em cada região. Em seguida, para um back-end em cada região, vamos criar um grupo gerenciado de instâncias que faz referência a um modelo de instância.
Os grupos gerenciados de instâncias podem ser zonais ou regionais no escopo. Para este exercício prático, vamos criar três grupos gerenciados de instâncias regionais: um em us-east1, um em us-west1 e outro em us-central1.
Nesta seção, você pode conferir um script de inicialização pré-criado que será referenciado na criação da instância. Esse script de inicialização instala e ativa recursos de servidor da Web que serão usados para simular um aplicativo da Web. Se quiser, analise o script.
Criar os modelos de instância leste, oeste e central
A primeira etapa é criar o modelo de instância us-east-1.
No Cloud Shell
gcloud compute instance-templates create us-east1-template \ --region=us-east1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-east1-template]. NAME: us-east1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:02:37.511-08:00
A próxima etapa é criar o modelo de instância us-west-1.
No Cloud Shell
gcloud compute instance-templates create us-west1-template \ --region=us-west1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-west1-template]. NAME: us-west1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:03:08.577-08:00
A próxima etapa é criar o modelo de instância us-central-1.
No Cloud Shell
gcloud compute instance-templates create us-central1-template \ --region=us-central1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-central1-template]. NAME: us-central1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:03:44.179-08:00
Agora é possível verificar se os modelos de instância foram criados com sucesso usando o seguinte comando gcloud:
No Cloud Shell
gcloud compute instance-templates list
Saída
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP us-central1-template n1-standard-1 2021-11-09T09:25:37.263-08:00 us-east1-template n1-standard-1 2021-11-09T09:24:35.275-08:00 us-west1-template n1-standard-1 2021-11-09T09:25:08.016-08:00
Criar os grupos gerenciados de instâncias leste, oeste e central
Agora precisamos criar um grupo gerenciado de instâncias com base nos modelos de instância criados anteriormente.
No Cloud Shell
gcloud compute instance-groups managed create us-east1-mig \ --base-instance-name=us-east1-mig \ --size=1 \ --template=us-east1-template \ --zone=us-east1-b
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-mig]. NAME: us-east1-mig LOCATION: us-east1-b SCOPE: zone BASE_INSTANCE_NAME: us-east1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-east1-template AUTOSCALED: no
No Cloud Shell
gcloud compute instance-groups managed create us-west1-mig \ --base-instance-name=us-west1-mig \ --size=1 \ --template=us-west1-template \ --zone=us-west1-a
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroupManagers/us-west1-mig]. NAME: us-west1-mig LOCATION: us-west1-a SCOPE: zone BASE_INSTANCE_NAME: us-west1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-west1-template AUTOSCALED: no
No Cloud Shell
gcloud compute instance-groups managed create us-central1-mig \ --base-instance-name=us-central1-mig \ --size=1 \ --template=us-central1-template \ --zone=us-central1-a
Saída
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-a/instanceGroupManagers/us-central1-mig]. NAME: us-central1-mig LOCATION: us-central1-a SCOPE: zone BASE_INSTANCE_NAME: us-central1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-central1-template AUTOSCALED: no
Podemos verificar se os grupos de instâncias foram criados com sucesso usando o seguinte comando gcloud:
No Cloud Shell
gcloud compute instance-groups list
Saída
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-central1-mig us-central1 zone httplbs Yes 1 us-west1-mig us-west1 zone httplbs Yes 1 us-east1-mig us-east1 zone httplbs Yes 1
Verificar a funcionalidade do servidor da Web
Cada instância é configurada para executar um servidor da Web Apache com um script PHP simples que renderiza:
Para garantir que os servidores da Web estejam funcionando corretamente, navegue até Compute Engine -> Instâncias de VM. Verifique se as novas instâncias (por exemplo, us-east1-mig-xxx) foram criadas de acordo com as definições do grupo de instâncias.
Agora, faça uma solicitação da Web no navegador para garantir que o servidor da Web esteja em execução. Isso pode levar um minuto para começar. Na página "Instâncias de VM" do Compute Engine, selecione uma instância criada pelo grupo de instâncias e clique no IP externo (público) dela.
Ou, no navegador, acesse http://<IP_Address>
5. Configurar o balanceador de carga
Criar verificação de integridade
Primeiro, crie uma verificação de integridade básica para garantir que os serviços estejam funcionando corretamente. Vamos criar uma verificação de integridade básica. Há muitas outras personalizações avançadas disponíveis.
No Cloud Shell
gcloud compute health-checks create http http-basic-check \ --port 80
Reservar endereço IP externo
Para esta etapa, é necessário reservar um endereço IP estático disponível globalmente que será anexado ao balanceador de carga mais tarde.
No Cloud Shell
gcloud compute addresses create lb-ipv4-2 \ --ip-version=IPV4 \ --global
Anote o endereço IP reservado.
gcloud compute addresses describe lb-ipv4-2 \ --format="get(address)" \ --global
Criar serviços de back-end
Agora precisamos criar um serviço de back-end para cada um dos grupos de instâncias gerenciadas que criamos anteriormente. Uma para leste, oeste e central.
Como criar um serviço de back-end para o grupo gerenciado de instâncias do leste.
No Cloud Shell
gcloud compute backend-services create east-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
Criando um serviço de back-end para o grupo gerenciado de instâncias do Oeste.
No Cloud Shell
gcloud compute backend-services create west-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
Como criar um serviço de back-end para o grupo gerenciado de instâncias central.
No Cloud Shell
gcloud compute backend-services create central-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
Adicionar MIGs aos serviços de back-end
Agora que criamos os respectivos serviços de back-end para cada cluster de aplicativo, precisamos adicionar os grupos gerenciados de instâncias criados anteriormente a cada serviço de back-end.
Adicione o MIG leste ao serviço de back-end.
No Cloud Shell
gcloud compute backend-services add-backend east-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-east1-mig \ --instance-group-zone=us-east1-b \ --global
Adicione o MIG West ao serviço de back-end.
No Cloud Shell
gcloud compute backend-services add-backend west-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-west1-mig \ --instance-group-zone=us-west1-a \ --global
Adicione o MIG central ao serviço de back-end.
No Cloud Shell
gcloud compute backend-services add-backend central-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-central1-mig \ --instance-group-zone=us-central1-a \ --global
Criar mapa de URL
O mapa de URL é onde os recursos avançados de gerenciamento de tráfego deste laboratório vão ficar. Precisamos criar um arquivo .yaml que contenha a configuração. No arquivo .yaml, criamos uma correspondência de prefixo em /roundrobbin. Portanto, apenas o tráfego correspondente a /roundrobbin será afetado por essas configurações. Especificamos que 50% do tráfego devem ir para o east-backend-service e 50% para o west-backend-service. Além disso, adicionamos um valor de cabeçalho de resposta:{test}, que estará presente em todas as respostas. Por fim, adicionamos que todo o tráfego deve ser espelhado para o central-backend-service. O tráfego é duplicado e enviado aqui apenas para fins de teste.
Salve o exemplo como um arquivo .yaml na sua máquina.
defaultService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service kind: compute #urlMap name: web-map-http hostRules: - hosts: - '*' pathMatcher: matcher1 pathMatchers: - defaultService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service name: matcher1 routeRules: - matchRules: - prefixMatch: /roundrobbin priority: 2 headerAction: responseHeadersToAdd: - headerName: test headerValue: value replace: True routeAction: weightedBackendServices: - backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service weight: 50 - backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/west-backend-service weight: 50 retryPolicy: retryConditions: ['502', '504'] numRetries: 3 perTryTimeout: seconds: 1 nanos: 50 requestMirrorPolicy: backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/central-backend-service
Crie o mapa de URL importando o documento da sua máquina. O caminho de origem varia de acordo com o local em que você salva o arquivo .yaml.
No Cloud Shell
gcloud compute url-maps import web-map-http \ --source /Users/[USERNAME]/Documents/Codelab/lbconfig.yaml \ --global
Criar front-end HTTP
A etapa final na criação do balanceador de carga é criar o front-end. Isso vai mapear o endereço IP reservado anteriormente para o mapa de URLs do balanceador de carga criado.
No Cloud Shell
gcloud compute target-http-proxies create http-lb-proxy-adv \ --url-map=web-map-http
Em seguida, crie uma regra de encaminhamento global que mapeie o endereço IP reservado anteriormente para o proxy HTTP.
No Cloud Shell
gcloud compute forwarding-rules create http-content-rule \ --load-balancing-scheme EXTERNAL_MANAGED \ --address=lb-ipv4-2 \ --global \ --target-http-proxy=http-lb-proxy-adv \ --ports=80
6. Verificar se os recursos avançados de tráfego estão funcionando
Para verificar se o recurso de divisão de tráfego implementado está funcionando, gere alguma carga. Para isso, vamos criar uma nova VM para simular a carga.
Criar regra de firewall "Permitir SSH"
Para usar SSH na VM de onde vamos gerar tráfego, primeiro crie uma regra de firewall que permita o tráfego SSH para a VM.
No Cloud Shell
gcloud compute firewall-rules create fw-allow-ssh \ --network=httplbs \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
Saída
NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
Criar a siege-vm
Agora, crie a siege-vm, que será usada para gerar carga.
No Cloud Shell
gcloud compute instances create siege-vm \ --network=httplbs \ --zone=us-east4-c \ --machine-type=e2-medium \ --tags=allow-ssh,http-server \ --metadata=startup-script='sudo apt-get -y install siege'
Saída
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-east4-c e2-medium 10.150.0.3 34.85.218.119 RUNNING
Em seguida, use o SSH na VM criada. Depois de criada, clique em SSH para iniciar um terminal e se conectar.
Depois de se conectar, execute o comando a seguir para gerar carga. Use o endereço IP que você reservou anteriormente para o balanceador de carga HTTP externo.
No Cloud Shell
siege -c 250 http://[$lb-ipv4-2]/roundrobbin
Saída
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file [alert] Zip encoding disabled; siege requires zlib support to enable it: No such file or directory ** SIEGE 4.0.2 ** Preparing 250 concurrent users for battle. The server is now under siege...
Verificar a distribuição de carga
Agora que o Siege está em execução, é hora de verificar se o tráfego está sendo distribuído igualmente para os grupos de instâncias gerenciadas leste e oeste. Além disso, é possível verificar se o espelhamento de tráfego está funcionando e se o tráfego está sendo enviado para o grupo de instâncias gerenciadas central.
No console do Cloud, no menu de navegação, clique em Serviços de rede > Balanceamento de carga. Selecione o balanceador de carga web-map-http. Acesse a guia "Monitoramento" para ver o gráfico abaixo.
Você poderá ver a divisão de tráfego em tempo real para essa MIG. O tráfego é dividido igualmente porque você configurou uma divisão de round robin 50/50.
Para verificar se a política de espelhamento de tráfego criada está funcionando, confira a utilização do grupo de instâncias gerenciadas central-backend-service. Para fazer isso, navegue até "Compute", "Compute Engine", "Grupos de instâncias" e selecione "us-central1-mig". Em seguida, navegue até a guia "Monitoramento".
Você vai notar que os gráficos foram preenchidos, mostrando que o tráfego foi espelhado para esse grupo de instâncias gerenciadas.
Interromper o cerco
Agora que você demonstrou que a divisão avançada de tráfego está funcionando, é hora de interromper o cerco. Para isso, volte ao terminal SSH de siege-vm e pressione CTRL+C para interromper a execução do siege.
Validar o envio do cabeçalho de resposta
Antes de fazer a limpeza, valide rapidamente se o cabeçalho de resposta adequado está sendo enviado pelo balanceador de carga HTTP. Você o configurou para enviar o teste de cabeçalho com o valor de conteúdo. Executar o comando curl no Cloud Shell vai gerar a resposta esperada.
No Cloud Shell
curl -svo /dev/null http://lb-ipv4-2/roundrobbin
Saída
* Trying lb-ipv4-2.. * TCP_NODELAY set * Connected to lb-ipv4-2 ( lb-ipv4-2) port 80 (#0) > GET /roundrobbin HTTP/1.1 > Host: lb-ipv4-2 > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 404 Not Found < date: Wed, 10 Nov 2021 17:05:27 GMT < server: envoy < Content-Length: 273 < content-type: text/html; charset=iso-8859-1 < via: 1.1 google < test: value < { [273 bytes data] * Connection #0 to host 34.149.2.26 left intact * Closing connection 0
7. Limpeza do laboratório
Agora que terminamos de usar o ambiente do laboratório, é hora de desativá-lo. Execute os comandos a seguir para excluir o ambiente de teste.
No Cloud Shell
gcloud compute instances delete siege-vm --zone=us-east4-c gcloud compute forwarding-rules delete http-content-rule --global gcloud compute target-http-proxies delete http-lb-proxy-adv gcloud compute url-maps delete web-map-http gcloud compute backend-services delete east-backend-service --global gcloud compute backend-services delete west-backend-service --global gcloud compute backend-services delete central-backend-service --global gcloud compute addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud compute instance-groups managed delete us-east1-mig --zone us-east1-b gcloud compute instance-groups managed delete us-west1-mig --zone us-west1-a gcloud compute instance-groups managed delete us-central1-mig --zone us-central1-a gcloud compute instance-templates delete "us-east1-template" gcloud compute instance-templates delete "us-west1-template" gcloud compute instance-templates delete "us-central1-template" gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
8. Parabéns!
Você concluiu o codelab "Balanceador de carga HTTPs externo com gerenciamento de tráfego avançado (Envoy)".
O que vimos
- Como configurar um grupo gerenciado de instâncias e a VPC e as regras de firewall associadas
- Como usar os recursos avançados de gerenciamento de tráfego do novo balanceador de carga
- Como validar se os recursos avançados de gerenciamento de tráfego estão funcionando conforme o esperado.
Próximas etapas
- Teste outros recursos avançados de roteamento, como reescrita de URL, adição de cabeçalhos CORS e muito mais ( link).