Codelab: otimizações avançadas de balanceamento de carga

1. Introdução

Este é o codelab de otimizações avançadas de balanceamento de carga.

Neste codelab, você vai aprender a configurar opções avançadas de balanceamento de carga para o balanceador de carga de aplicativo externo global. Antes de começar, recomendamos que você consulte o documento sobre o balanceamento de carga na nuvem ( https://cloud.google.com/load-balancing/docs/load-balancing-overview).

c3fb1d3f027e8640.png

Figura 1. O fluxo de trabalho de escolher um endpoint de destino com o balanceador de carga de aplicativo externo global.

Topologia e casos de uso do Codelab

2f7368df335d3de9.png

Figura 2. Topologia de roteamento do balanceador de carga HTTP

Neste laboratório de código, você vai configurar dois grupos gerenciados de instâncias. 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 com suporte do balanceador de carga baseado no Envoy. Depois de implantar, você vai gerar uma carga simulada e verificar se as configurações definidas estão funcionando corretamente.

O que você vai aprender

  • Como configurar o ServiceLbPolicy para ajustar o balanceador de carga.

O que é necessário

2. 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]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

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
gcloud services enable networkservices.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     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
httplbs  AUTO         REGIONAL

Criar regras de firewall da VPC

Depois de criar a VPC, você vai criar uma regra 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                    NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
httplb-allow-http-rule  httplbs  INGRESS    700       tcp:80        False

Neste codelab, vamos ajustar a integridade das VMs. Também vamos criar regras de firewall para permitir o SSH.

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

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh].
Creating firewall...done.
NAME          NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
fw-allow-ssh  httplbs  INGRESS    1000      tcp:22        False

4. Configurar os grupos gerenciados de instâncias

Você precisa configurar grupos de instâncias gerenciadas 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 de instâncias gerenciadas que faz referência a um modelo de instância.

Os grupos de instâncias gerenciadas podem ser regionais ou zonais no escopo. Neste exercício, vamos criar grupos de instâncias gerenciadas por zona.

Nesta seção, você encontra um script de inicialização pré-criado que será referenciado na criação da instância. Esse script de inicialização instala e ativa os recursos do servidor da Web que vamos usar para simular um aplicativo da Web. Confira este script.

Criar os modelos de instância

A primeira etapa é criar um modelo de instância.

No Cloud Shell

gcloud compute instance-templates create test-template \
   --network=httplbs \
   --tags=allow-ssh,http-server \
   --image-family=debian-9 \
   --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

NAME           MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template  n1-standard-1               2021-11-09T09:24:35.275-08:00

Agora você pode verificar se os modelos de instância foram criados com o seguinte comando gcloud:

No Cloud Shell

gcloud compute instance-templates list

Saída

NAME                  MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template         n1-standard-1         2021-11-09T09:24:35.275-08:00

Criar os grupos de instâncias

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-a-mig \
--size=1 \
--template=test-template \
--zone=us-east1-a

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-a-mig  us-east1-a  zone   us-east1-a-mig       0     1            test-template      no

No Cloud Shell

gcloud compute instance-groups managed create us-east1-b-mig \
--size=5 \
--template=test-template \
--zone=us-east1-b

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-b-mig  us-east1-b  zone   us-east1-b-mig       0     5            test-template      no

Podemos verificar se os grupos de instâncias foram criados com o seguinte comando do gcloud:

No Cloud Shell

gcloud compute instance-groups list

Saída

NAME                  LOCATION      SCOPE   NETWORK         MANAGED INSTANCES
us-east1-a-mig        us-east1-a    zone    httplbs          Yes      1
us-east1-b-mig        us-east1-b    zone    httplbs          Yes      5

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 algo como o seguinte:

Página veiculada em: us-east1-a-mig-ww2h

Para garantir que os servidores da Web estejam funcionando corretamente, acesse Compute Engine -> Instâncias de VM. Verifique se as novas instâncias (por exemplo, us-east1-a-mig-xxx) foram criadas de acordo com as definições do grupo de instâncias.

Agora, faça uma solicitação na 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" em "Compute Engine", selecione uma instância criada pelo grupo e clique no IP externo (público).

Ou, em seu navegador, navegue até http://<IP_Address>

5. Configurar o balanceador de carga

Criar verificação de integridade

Primeiro, precisamos criar uma verificação de integridade básica para garantir que nossos serviços estejam funcionando. Vamos criar uma verificação de integridade básica, mas há muitas outras personalizações avançadas disponíveis.

No Cloud Shell

gcloud compute health-checks create http http-basic-check \
    --port 80

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check].
NAME              PROTOCOL
http-basic-check  HTTP

Reservar endereço IP externo

Nesta etapa, você precisará reservar um endereço IP estático disponível globalmente que será anexado posteriormente ao balanceador de carga.

No Cloud Shell

gcloud compute addresses create lb-ipv4-2 \
    --ip-version=IPV4 \
    --global

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].

Anote o endereço IP que foi 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 os grupos gerenciados de instâncias que criamos anteriormente.

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

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service].
NAME                  BACKENDS  PROTOCOL
east-backend-service            HTTP

Adicionar MIGs aos serviços de back-end

Agora que criamos os serviços de back-end, precisamos adicionar os grupos de instâncias gerenciadas criados anteriormente a cada serviço de back-end.

No Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global

No Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global

Para verificar se os back-ends foram adicionados, execute o comando a seguir.

No Cloud Shell

gcloud compute backend-services list

Saída

NAME                  BACKENDS                                                                                               PROTOCOL
east-backend-service  us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig  HTTP

Criar um mapa de URL

Agora vamos criar um mapa de URLs.

gcloud compute url-maps create web-map-http \
    --default-service=east-backend-service \
    --global

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http].
NAME          DEFAULT_SERVICE
web-map-http  backendServices/east-backend-service

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 URL do balanceador de carga que você criou.

No Cloud Shell

gcloud compute target-http-proxies create http-lb-proxy-adv \
    --url-map=web-map-http

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv].
NAME               URL_MAP
http-lb-proxy-adv  web-map-http

Em seguida, crie uma regra de encaminhamento global que mapeia 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

Neste ponto, é possível confirmar se o balanceador de carga está funcionando com o endereço IP que você anotou anteriormente.

6. Verificar se o balanceador de carga está funcionando

Para verificar se o recurso de balanceamento de carga está funcionando, você precisa gerar alguma carga. Para isso, vamos criar uma nova VM para simular a carga.

Crie Siege-vm

Agora você vai criar a siege-vm que vai usar para gerar carga.

No Cloud Shell

gcloud compute instances create siege-vm \
    --network=httplbs \
    --zone=us-east1-a \
    --machine-type=e2-medium \
    --tags=allow-ssh,http-server \
    --metadata=startup-script='sudo apt-get -y install siege'

Saída

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm].
NAME      ZONE             MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
siege-vm  us-central1-ir1  e2-medium                  10.132.0.15  34.143.20.68  RUNNING

Em seguida, use o SSH na VM criada. Depois que ele for criado, 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 20 http://$lb-ipv4-2

Saída

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

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 aos dois grupos de instâncias gerenciadas.

Stop the Siege (em inglês)

Agora que você demonstrou que a divisão avançada de tráfego está funcionando, é hora de interromper o cerco. Volte ao terminal SSH de siege-vm e pressione CTRL+C para interromper a execução do siege.

7. Configurar a política de balanceamento de carga do serviço

Criar uma política de balanceador de carga de serviço

Agora que a configuração básica foi concluída, vamos criar uma política de Service Lb e testar os recursos avançados. Como exemplo, vamos configurar o serviço para usar algumas configurações avançadas de balanceamento de carga. Neste exemplo, vamos criar uma política para testar o recurso de redução automática de capacidade. Mas sinta-se à vontade para testar outros recursos.

No Cloud Shell

gcloud beta network-services service-lb-policies create http-policy \
    --auto-capacity-drain --location=global

Podemos verificar se a política foi criada com o seguinte comando gcloud:

No Cloud Shell

gcloud beta network-services service-lb-policies list --location=global

Saída

NAME
http-policy

Anexar a política de LB do serviço ao serviço de back-end

Agora vamos anexar a nova política ao serviço de back-end acima.

No Cloud Shell

gcloud beta compute backend-services update east-backend-service \
    --service-lb-policy=http-policy --global

8. Tweak Backend Health

A nova política service lb foi aplicada ao seu serviço de back-end. Tecnicamente, você pode pular para a limpeza diretamente. No entanto, como parte do codelab, também vamos fazer alguns ajustes de produção para mostrar como a nova política funciona.

O recurso de diminuição da capacidade automática remove automaticamente um MIG de back-end do balanceador de carga quando o número total de back-ends saudáveis cai abaixo de um limite (25%). Para testar esse recurso, vamos usar o SSH nas VMs em us-east1-b-mig e torná-las inativas. Com o limite de 25%, você vai precisar usar SSH em quatro das VMs e encerrar o servidor Apache.

Para isso, escolha quatro VMs e execute SSH para elas. Para isso, clique no SSH para iniciar um terminal e se conectar. Em seguida, execute o comando abaixo.

sudo apachectl stop

Nesse ponto, o recurso de esgotamento automático da capacidade será acionado, e a us-east1-b-mig não vai receber novas solicitações.

9. Verificar se o recurso de diminuição automática de capacidade está funcionando

Reiniciar o Cerco

Para verificar o novo recurso, vamos reutilizar a VM de teste. Vamos usar SSH para acessar a VM criada na etapa anterior. Depois que ele for criado, 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 20 http://$lb-ipv4-2

Saída

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

Nesse ponto, você vai notar que todas as solicitações são enviadas para us-east1-a-mig.

Stop the Siege (em inglês)

Agora que você demonstrou que a divisão avançada de tráfego está funcionando, é hora de interromper o cerco. Para fazer isso, volte ao terminal SSH do siege-vm e pressione CTRL+C para interromper a execução do siege.

10. Etapas de limpeza

Agora que terminamos o ambiente do laboratório, é hora de desmontá-lo. Execute os comandos a seguir para excluir o ambiente de teste.

No Cloud Shell

gcloud compute instances delete siege-vm --zone=us-east1-a

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 addresses delete lb-ipv4-2 --global
gcloud compute health-checks delete http-basic-check 

gcloud beta network-services service-lb-policies delete http-policy --location=global

gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a
gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b

gcloud compute instance-templates delete test-template 

gcloud compute firewall-rules delete httplb-allow-http-rule
gcloud compute firewall-rules delete fw-allow-ssh

gcloud compute networks delete httplbs 

11. Parabéns!

Parabéns por concluir o codelab.

O que vimos

  • Criação de um balanceador de carga de aplicativo externo com a política de balanceamento de carga de serviço.
  • Configure seu serviço de back-end com o recurso de drenagem de capacidade automática.

Próximas etapas

  • Teste outros recursos fornecidos pela política de balanceamento de carga do serviço.