Neste guia, fornecemos instruções para criar uma configuração de balanceador de carga de rede de passagem externa com back-ends de pool de destino. No exemplo, pressupomos que você tenha vários servidores da Web em instâncias do Compute Engine pelas quais quer equilibrar o tráfego. No cenário, é definida uma configuração de balanceamento de carga de camada 4 para distribuir o tráfego HTTP entre instâncias íntegras. Além disso, verificações básicas de integridade HTTP são configuradas para garantir que o tráfego seja enviado apenas para essas instâncias.
Neste exemplo, a carga balanceia o tráfego HTTP, mas é possível usar balanceadores de carga de rede baseados em pool de destino para balancear a carga de tráfego TCP, UDP e SSL. Antes de começar, leia Visão geral do balanceador de carga de rede de passagem externa para informações conceituais sobre balanceadores de carga de rede de passagem externa.
Antes de começar
Instale a CLI do Google Cloud. Para ter uma visão geral completa da ferramenta, consulte o guia dela. Encontre comandos relacionados ao balanceamento de carga no grupo de comandos gcloud compute
.
Também é possível acessar a ajuda detalhada de qualquer comando gcloud
usando a sinalização --help
:
gcloud compute http-health-checks create --help
Caso ainda não tenha usado a CLI do Google Cloud, primeiro execute
gcloud init
para autenticar.
Além disso, você precisa criar um endereço IP externo estático para o balanceador de carga. Se você usa uma imagem fornecida pelo Compute Engine, as instâncias de máquina virtual (VM, na sigla em inglês) são automaticamente configuradas para processar esse endereço IP. Se você usa outra imagem, configure esse endereço como alias no eth0 ou como loopback em cada instância.
Esse guia pressupõe que você esteja familiarizado com a ferramenta bash.
Como configurar instâncias de VM do Compute Engine
Neste cenário de balanceamento de carga, você cria três instâncias de VM do Compute Engine, instala o Apache nelas e adiciona uma regra de firewall para que o tráfego HTTP chegue a elas.
As instâncias que participam como VMs de back-end para balanceadores de carga de rede de passagem externa precisam executar o ambiente convidado Linux, o ambiente convidado Windows ou outros processos com funcionalidade equivalente.
Como configurar as instâncias de back-end
Console
No console do Google Cloud, acesse a página Instâncias de VMs.
Clique em Criar instância.
Defina o Nome como
www1
.Defina a Região como us-central1.
Defina Zona como us-central1-b.
Em Disco de inicialização, a imagem do SO padrão de
Debian GNU/Linux 10 (buster)
já está selecionada.Clique em Opções avançadas.
Clique em Rede e configure o seguinte campo:
- Em Tags de rede, insira
network-lb-tag
.
- Em Tags de rede, insira
Clique em Gerenciamento. Insira o script a seguir no campo Script de inicialização.
#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
- Clique em Criar.
Crie uma instância chamada
www2
com as mesmas configurações, mas insira o script a seguir no campo Script de inicialização, Automação.#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
Crie uma instância chamada
www3
com as mesmas configurações, mas insira o script a seguir no campo Script de inicialização, Automação.#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
gcloud
Os comandos abaixo são todos executados no sistema local e pressupõem um prompt de comando bash
.
Para ver status, atributos e nomes de imagem do SO, use o comando gcloud compute images list
.
Crie três novas máquinas virtuais em uma zona específica e atribua a mesma tag a todas elas. Esse exemplo define a zona como us-central1-b. Com a configuração do campo
tags
, é possível mencionar todas essas instâncias simultaneamente, assim como acontece nas regras de firewall. Esses comandos também instalam o Apache em todas as instâncias e fornecem a elas uma página inicial exclusiva.gcloud compute instances create www1 \ --image-family debian-10 \ --image-project debian-cloud \ --zone us-central1-b \ --tags network-lb-tag \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
gcloud compute instances create www2 \ --image-family debian-10 \ --image-project debian-cloud \ --zone us-central1-b \ --tags network-lb-tag \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
gcloud compute instances create www3 \ --image-family debian-10 \ --image-project debian-cloud \ --zone us-central1-b \ --tags network-lb-tag \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"
api
Criar a instância www1
na zona us-central1-b
com o método instances.insert
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances { "canIpForward": false, "deletionProtection": false, "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "www1", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719", "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2", "metadata": { "items": [ { "key": "startup-script", "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html" } ] }, "name": "www1", "networkInterfaces": [ { "network": "projects/[PROJECT_ID]/global/networks/default", "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default" } ], "tags": { "items": [ "network-lb-tag" ] } }
Crie instâncias chamadas www2
e www3
com as mesmas configurações, mas substitua www1
nos campos deviceName
, value
e name
.
Como criar uma regra de firewall para permitir o tráfego externo para essas instâncias de VM
Console
No Console do Google Cloud, acesse a página políticas de Firewall.
Clique em Criar regra de firewall.
Informe um Nome de
www-firewall-network-lb
.Selecione a Rede a que a regra de firewall se aplicará (Padrão).
Em Destinos, selecione Tags de destino especificadas.
No campo Tags de destino, insira
network-lb-tag
.Defina Filtro de origem como Intervalos IPv4.
Defina os Intervalos de IPv4 de origem como
0.0.0.0/0
, o que permite o tráfego de qualquer origem.Em Protocolos e portas especificados, marque a caixa de seleção TCP e insira
80
.Clique em Criar. Pode levar um tempo para que o console exiba a nova regra de firewall. Talvez seja necessário clicar em Atualizar para vê-la.
gcloud
gcloud compute firewall-rules create www-firewall-network-lb \ --target-tags network-lb-tag --allow tcp:80
api
Criar uma regra de firewall que permita todo o tráfego da sub-rede com o **método** firewalls.insert
POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls { "name": "www-firewall-network-lb", "direction": "INGRESS", "priority": 1000, "targetTags": [ "network-lb-tag" ], "allowed": [ { "IPProtocol": "tcp", "ports": [ "80" ] } ], "sourceRanges": [ "0.0.0.0/0" ] }
Como receber os endereços IP externos das instâncias e verificar se elas estão sendo executadas
Console
No console do Google Cloud, acesse a página Instâncias de VMs.
Veja os endereços das instâncias na coluna IP externo.
Verifique se as instâncias estão em execução. Basta ver se há uma marca de seleção verde à esquerda do nome da instância. Se não houver, consulte a página de Solução de problemas geral de instâncias.
gcloud
Liste as instâncias para conseguir os endereços IP delas na coluna
EXTERNAL_IP
.gcloud compute instances list
Verifique se cada instância está em execução.
Na linha de comando, execute
curl
usando o endereço IP externo de cada instância para confirmar que todas elas respondem.curl http://[IP_ADDRESS]
api
Receber informações sobre a instância www1
com o método instances.get
Verifique se o campo status
está preenchido com RUNNING
e procure o endereço IP externo em natIP
.
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1 { "kind": "compute#instance", "id": "6734015273571474749", "creationTimestamp": "2018-11-09T11:45:23.487-08:00", "name": "www1", "description": "", "tags": { "items": [ "network-lb-tag" ], "fingerprint": "9GVlO4gPawg=" }, "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2", "status": "RUNNING", "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b", "canIpForward": false, "networkInterfaces": [ { "kind": "compute#networkInterface", "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default", "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default", "networkIP": "10.128.0.2", "name": "nic0", "accessConfigs": [ { "kind": "compute#accessConfig", "type": "ONE_TO_ONE_NAT", "name": "External NAT", "natIP": "35.192.37.233", "networkTier": "PREMIUM" } ], "fingerprint": "lxD5f5ua_sw=" } ], "disks": [ { "kind": "compute#attachedDisk", "type": "PERSISTENT", "mode": "READ_WRITE", "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1", "deviceName": "www1", "index": 0, "boot": true, "autoDelete": true, "licenses": [ "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster" ], "interface": "SCSI", "guestOsFeatures": [ { "type": "VIRTIO_SCSI_MULTIQUEUE" } ] } ], "metadata": { "kind": "compute#metadata", "fingerprint": "IyHRmHoJx6E=", "items": [ { "key": "startup-script", "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html" } ] }, "serviceAccounts": [ { "email": "674259759219-compute@developer.gserviceaccount.com", "scopes": [ "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/trace.append" ] } ], "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1", "scheduling": { "onHostMaintenance": "MIGRATE", "automaticRestart": true, "preemptible": false }, "cpuPlatform": "Intel Haswell", "labelFingerprint": "42WmSpB8rSM=", "startRestricted": false, "deletionProtection": false }
Repita essa chamada de API para www2
e www3
.
Como configurar o serviço de balanceamento de carga
Em seguida, configure o serviço de balanceamento de carga.
Quando você configura o serviço de balanceamento de carga, as instâncias de máquina virtual recebem pacotes destinados ao endereço IP externo estático configurado. Se você usa uma imagem fornecida pelo Compute Engine, as instâncias são configuradas automaticamente para processar esse endereço IP. Se está usando outra imagem, configure esse endereço como alias no eth0 ou loopback em cada instância.
Console
Não é possível usar o console do Google Cloud para criar balanceadores de carga de rede de passagem externa baseados em pool de destino. Em vez disso, use a gcloud ou a API REST.
gcloud
Crie um endereço IP externo estático para o balanceador de carga.
gcloud compute addresses create network-lb-ip-1 \ --region us-central1
Adicione um recurso de verificação de integridade HTTP legada.
Neste exemplo, são usadas as configurações padrão do mecanismo de verificação de integridade, mas também é possível personalizá-lo.
gcloud compute http-health-checks create basic-check
Adicione um pool de destino
Adicione um pool de destino à mesma região das instâncias de máquina virtual. Use a verificação de integridade criada na etapa anterior para esse pool. Os pools de destino exigem um serviço de verificação de integridade para funcionarem.
gcloud compute target-pools create www-pool \ --region us-central1 --http-health-check basic-check
Adicione as instâncias ao pool de destino.
gcloud compute target-pools add-instances www-pool \ --instances www1,www2,www3 \ --instances-zone us-central1-b
Instâncias dentro de um pool de destino pertencem à mesma região, porém é possível espalhá-las por diferentes zonas dessa região. Por exemplo, é possível ter instâncias nas zonas
us-central1-f
eus-central1-b
em um pool de destino porque elas estão na mesma regiãous-central1
.Adicionar uma regra de encaminhamento
Adicione uma regra de encaminhamento que atenda em nome de um endereço IP externo e um intervalo de portas que aponte para o pool de destino. No campo
--address
, use o endereço IP numérico ou o nome totalmente qualificado dele.gcloud compute forwarding-rules create www-rule \ --region us-central1 \ --ports 80 \ --address network-lb-ip-1 \ --target-pool www-pool
api
Crie um endereço IP externo estático para o balanceador de carga.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses { "name": "network-lb-ip-1" }
Adicione uma verificação de integridade HTTP legada.
Esse exemplo usa as configurações padrão do mecanismo de verificação de integridade, mas também é possível personalizá-lo.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks { "name": "basic-check" }
Adicione um pool de destino.
Adicione um pool de destino à mesma região das instâncias de máquina virtual. Use a verificação de integridade criada na etapa anterior para esse pool. Os pools de destino exigem um serviço de verificação de integridade para funcionarem.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools { "name": "www-pool", "healthChecks": [ "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check" ] }
Adicione as instâncias ao pool de destino.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance { "instances": [ { "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1" } ] }
Repita essa chamada de API para as instâncias
www2
ewww3
.Instâncias dentro de um pool de destino pertencem à mesma região, porém é possível espalhá-las por diferentes zonas dessa região. Por exemplo, é possível ter instâncias nas zonas
us-central1-f
eus-central1-b
em um pool de destino porque elas estão na mesma regiãous-central1
.Adicione uma regra de encaminhamento.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules { "name": "www-rule", "portRange": "80", "loadBalancingScheme": "EXTERNAL", "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb" }
Enviar tráfego às instâncias
Agora que o serviço de balanceamento de carga foi configurado, comece a enviar tráfego para a regra de encaminhamento e veja a distribuição dele por instâncias diferentes.
Como procurar o endereço IP externo da regra de encaminhamento
Console
- Acesse a guia Regras de encaminhamento na página de balanceamento de carga Avançada no Console do Google Cloud.
Acessar a guia "Regras de encaminhamento" - Localize
www-rule
, a regra de encaminhamento usada pelo balanceador de carga. - Na coluna Endereço IP de
www-rule
, anote o endereço IP externo listado.
gcloud
Insira o comando a seguir para visualizar o endereço IP externo da regra de encaminhamento www-rule
usado pelo balanceador de carga.
gcloud compute forwarding-rules describe www-rule --region us-central1
api
Visualizar o endereço IP externo da regra de encaminhamento www-rule
com o método forwardingRules.get
Na saída, procure o campo IPAddress
.
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule { "kind": "compute#forwardingRule", "id": "5133886346582800002", "creationTimestamp": "2018-11-09T14:21:33.574-08:00", "name": "www-rule", "description": "", "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1", "IPAddress": "35.232.228.9", "IPProtocol": "TCP", "portRange": "80-80", "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb", "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule", "loadBalancingScheme": "EXTERNAL", "networkTier": "PREMIUM" }
ICMP não compatível com instâncias de back-end
Os balanceadores de carga de rede de passagem externa não entregam pacotes ICMP para instâncias de back-end. Se
você enviar um pacote ICMP, por exemplo, com ping
ou traceroute
, a resposta
não virá das instâncias de back-end do balanceador de carga.
A infraestrutura do Google Cloud pode enviar uma resposta ICMP, mesmo que você tenha regras de firewall que proíbam o tráfego ICMP nas instâncias de back-end do balanceador de carga. Não é possível alterar esse comportamento.
Como usar o comando curl
para acessar o endereço IP externo
A resposta do comando curl
será alternada aleatoriamente entre as três instâncias.
Se ocorrer falha na resposta, aguarde cerca de 30 segundos para que a configuração seja totalmente carregada e as instâncias sejam marcadas como íntegras antes de tentar novamente:
$ while true; do curl -m1 IP_ADDRESS; done
A seguir
- Para saber como os balanceadores de carga de rede de passagem externa funcionam com pools de destino, consulte esta página de visão geral.
- Para saber como os balanceadores de carga de rede funcionam com serviços de back-end regionais em vez de pools de destino, consulte:
- Para configurar a proteção avançada contra DDoS de rede para um balanceador de carga de rede de passagem externa usando o Google Cloud Armor, consulte Configurar a proteção avançada contra DDoS de rede.
- Para saber mais sobre problemas e soluções alternativas ao usar um balanceador de carga de rede de passagem externa para tráfego UDP, consulte Usar UDP com balanceadores de carga de rede de passagem externa.
- Para excluir recursos para que você não seja cobrado por eles, consulte Limpar uma configuração de balanceamento de carga.