Balanceamento de carga de rede ponderada por instância

1. Introdução

É possível configurar um balanceador de carga de rede para distribuir o tráfego entre as instâncias de back-end do balanceador com base nos pesos relatados por uma verificação de integridade HTTP usando o balanceamento de carga ponderado.

O balanceamento de carga ponderado requer que você configure estes dois itens:

  • Defina a política do balanceador de carga de localidade (região administrativa LbPolicy) do serviço de back-end como WEIGHTED_MAGLEV.
  • É preciso configurar o serviço de back-end com uma verificação de integridade HTTP/HTTP2/HTTPS. As respostas da verificação de integridade HTTP precisam conter um campo de cabeçalho de resposta HTTP personalizado X-Load-Balancing-Endpoint-Weight para especificar os pesos com valores inteiros de 0 a 1.000 em representação decimal para cada instância de back-end.

Se você usa o mesmo grupo de instâncias como back-end para vários balanceadores de carga de rede com base em serviço de back-end com balanceamento de carga ponderado, é recomendável usar um caminho de solicitação exclusivo para cada verificação de integridade do serviço de back-end. Para mais informações, consulte Critérios de sucesso para verificações de integridade HTTP, HTTPS e HTTP/2.

A verificação de integridade HTTP precisa retornar uma resposta HTTP 200 (OK) para que as verificações de integridade sejam aprovadas e a instância de back-end seja considerada íntegra. Em situações em que todas as instâncias de back-end passam nas verificações de integridade e retornam X-Load-Balancing-Endpoint-Weight com peso zero, o balanceador de carga distribui novas conexões entre os back-ends íntegros, tratando-os com peso igual. O balanceador de carga também pode distribuir novas conexões entre back-ends não íntegros. Para mais informações, consulte Distribuição de tráfego.

Para exemplos de balanceamento de carga ponderado, consulte Seleção de back-end e rastreamento de conexão.

O balanceamento de carga ponderado pode ser usado nos seguintes cenários:

  • Se algumas conexões processarem mais dados que outras, ou se algumas ficarem mais tempo que outras, a distribuição da carga de back-end poderá ficar desigual. Ao sinalizar um peso por instância menor, uma instância com carga alta pode reduzir a parcela de novas conexões enquanto continua atendendo às conexões atuais.
  • Se um back-end estiver sobrecarregado e a atribuição de mais conexões puder interromper as conexões atuais, esses back-ends não atribuirão peso zero a si mesmo. Ao sinalizar peso zero, uma instância de back-end para de atender novas conexões, mas continua a atender às existentes.
  • Se um back-end estiver drenando as conexões atuais antes da manutenção, ele atribuirá peso zero a si mesmo. Ao sinalizar o peso zero, a instância de back-end para de atender novas conexões, mas continua a atender às existentes.

O que você vai aprender

  • Como configurar um balanceador de carga de rede para distribuir o tráfego entre as instâncias de back-end do balanceador com base nos pesos relatados por uma verificação de integridade HTTP usando o balanceamento de carga ponderado.

Configuração de ambiente autoguiada

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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 Você pode atualizar a qualquer momento.
  • 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. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, poderá gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. 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:

55efc1aaa7a4d3ad.png

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:

7ffe5cbb04455448.png

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.

2. Iniciar configuração

O codelab requer um único projeto.

Neste tutorial, você vai criar um grupo de instâncias com três instâncias de VM e atribuir pesos a cada uma delas. Você cria uma verificação de integridade HTTP para relatar pesos da instância do back-end. O balanceador de carga de rede ponderado está ativado no serviço de back-end com a política do balanceador de carga de localidade como WEIGHTED_MAGLEV.

Antes de começar

gcloud services enable compute.googleapis.com

Observação:não é possível usar o console do Google Cloud para configurar a política do balanceador de carga de localidade e atribuir pesos às instâncias de VM. Use a Google Cloud CLI.

Crie redes VPC, sub-redes e regras de firewall

Criar uma rede VPC, sub-rede e regras de entrada permitem que as regras de firewall permitam conexões com as VMs de back-end do balanceador de carga.

  1. Crie uma rede VPC e uma sub-rede. A) Para criar a rede VPC, execute o comando gcloud compute networks create :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. Neste exemplo, o intervalo de endereços IPv4 principal da sub-rede é 10.10.0.0/24.

Para criar a sub-rede, execute o comando gcloud compute networks subnets create :

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

Substitua:

  • NETWORK_NAME: o nome da rede VPC a ser criada.
  • SUBNET_NAME: o nome da sub-rede a ser criada.
  1. Crie uma regra de firewall de permissão de entrada para que os pacotes enviados às portas TCP 80 e 443 de destino sejam entregues às VMs de back-end. Neste exemplo, a regra de firewall permite conexões de qualquer endereço IP de origem. A regra de firewall se aplica a VMs com a tag de rede network-lb-tag. Para criar a regra de firewall, execute o comando gcloud compute firewall-rules create:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

Substitua FIREWALL_RULE_NAME pelo nome da regra de firewall a ser criada.

Criar instâncias de VM e atribuir pesos

Crie três instâncias de VM e atribua pesos:

  1. Configure três instâncias de VM de back-end para retornar os pesos no cabeçalho X-Load-Balancing-Endpoint-Weight com respostas HTTP. Para este tutorial, configure uma instância de back-end para relatar um peso de zero, uma segunda instância de back-end para relatar um peso de 100 e uma terceira instância de back-end para relatar um peso de 900. Para criar as instâncias, execute o comando gcloud compute instances create:
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  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
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  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
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    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
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

Crie um grupo de instâncias

Neste tutorial, você aprende a criar um grupo de instâncias não gerenciadas contendo todas as três instâncias de VM(instance-0, instance-100, and instance-900).

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

Substitua INSTANCE_GROUP pelo nome do grupo de instâncias a ser criado.

Crie uma verificação de integridade HTTP

Neste tutorial, você fornece instruções para criar uma verificação de integridade HTTP para ler a resposta HTTP que contém o peso da VM de back-end."

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Substitua HTTP_HEALTH_CHECK_NAME pelo nome da verificação de integridade HTTP a ser criada.

Criar serviço de back-end

No exemplo a seguir, explicamos como criar um serviço de back-end externo regional configurado para usar o balanceamento de carga ponderada.

  1. Criar um serviço de back-end com a verificação de integridade HTTP e definir a política do balanceador de carga de localidade como WEIGHTED_MAGLEV.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • Substitua BACKEND_SERVICE_NAME pelo nome do serviço de back-end a ser criado.
  1. Adicione o grupo de instâncias principal ao serviço de back-end.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Reservar um endereço IP externo regional para o balanceador de carga.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

Substitua ADDRESS_NAME pelo nome do endereço IP a ser criado. Use o comando compute addresses describe para ver o resultado. Anote o endereço IP externo estático reservado ("IP_ADDRESS'").

gcloud compute addresses describe ADDRESS_NAME
  1. Crie uma regra de encaminhamento usando o endereço IP externo regional reservado "IP_ADDRESS". Conecte a regra de encaminhamento ao serviço de back-end.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Substitua o seguinte: FORWARDING_RULE: o nome da regra de encaminhamento a ser criada. IP_ADDRESS: é o endereço IP a ser atribuído à instância. Use o endereço IP externo estático reservado, não o nome do endereço.

Verificar pesos de back-end usando a API de serviço de back-end

Verifique se os pesos do back-end são informados corretamente à verificação de integridade de HTTP.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

A saída será semelhante a esta:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth