Configurar um balanceador de carga de rede de passagem externa com um pool de destino

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

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Clique em Criar instância.

  3. Defina o Nome como www1.

  4. Defina a Região como us-central1.

  5. Defina Zona como us-central1-b.

  6. Em Disco de inicialização, a imagem do SO padrão de Debian GNU/Linux 10 (buster) já está selecionada.

  7. Clique em Opções avançadas.

  8. Clique em Rede e configure o seguinte campo:

    1. Em Tags de rede, insira network-lb-tag.
  9. 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
     

    1. Clique em Criar.
  10. 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
     

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

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

  1. No Console do Google Cloud, acesse a página políticas de Firewall.

    Acesse as políticas de firewall

  2. Clique em Criar regra de firewall.

  3. Informe um Nome de www-firewall-network-lb.

  4. Selecione a Rede a que a regra de firewall se aplicará (Padrão).

  5. Em Destinos, selecione Tags de destino especificadas.

  6. No campo Tags de destino, insira network-lb-tag.

  7. Defina Filtro de origem como Intervalos IPv4.

  8. Defina os Intervalos de IPv4 de origem como 0.0.0.0/0, o que permite o tráfego de qualquer origem.

  9. Em Protocolos e portas especificados, marque a caixa de seleção TCP e insira 80.

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

  1. No console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Veja os endereços das instâncias na coluna IP externo.

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

  1. Liste as instâncias para conseguir os endereços IP delas na coluna EXTERNAL_IP.

    gcloud compute instances list
    
  2. 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

  1. Crie um endereço IP externo estático para o balanceador de carga.

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. 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
    
  3. 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
    
  4. 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 e us-central1-b em um pool de destino porque elas estão na mesma região us-central1.

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

  1. 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"
    }
    
  2. 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"
    }
    
  3. 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"
      ]
    }
    
  4. 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 e www3.

    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 e us-central1-b em um pool de destino porque elas estão na mesma região us-central1.

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

  1. 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"
  2. Localize www-rule, a regra de encaminhamento usada pelo balanceador de carga.
  3. 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