Configure um balanceador de carga de rede de passagem externo com um conjunto de destinos

Este guia faculta instruções para criar uma configuração de balanceador de carga de rede de encaminhamento externo com back-ends de grupos de destino. O exemplo pressupõe que tem vários servidores Web em instâncias do Compute Engine nos quais quer equilibrar o tráfego. Este cenário configura uma configuração de balanceamento de carga da camada 4 para distribuir o tráfego HTTP por instâncias em bom estado. As verificações de estado HTTP básicas estão configuradas para garantir que o tráfego é enviado apenas para instâncias em bom estado.

Este exemplo equilibra a carga do tráfego HTTP, mas pode usar balanceadores de carga de rede de encaminhamento externo baseados em conjunto de destino para equilibrar a carga do tráfego TCP, UDP e SSL. Antes de começar, leia a Vista geral do balanceador de carga de rede de encaminhamento externo para informações conceptuais sobre os balanceadores de carga de rede de encaminhamento externo.

Antes de começar

Instale a CLI do Google Cloud. Para uma vista geral completa da ferramenta, consulte o guia da ferramenta gcloud. Pode encontrar comandos relacionados com o equilíbrio de carga no grupo de comandos gcloud compute.

Também pode obter ajuda detalhada para qualquer comando gcloud através da flag --help:

gcloud compute http-health-checks create --help

Se não executou o Google Cloud CLI anteriormente, execute primeiro o comando gcloud init para fazer a autenticação.

Além disso, tem de criar um endereço IP externo estático para o balanceador de carga. Se estiver a usar uma imagem fornecida pelo Compute Engine, as instâncias da máquina virtual (VM) são configuradas automaticamente para processar este endereço IP. Se estiver a usar qualquer outra imagem, tem de configurar este endereço como um alias em eth0 ou como um loopback em cada instância.

Este guia pressupõe que está familiarizado com o bash.

Configurar instâncias de VM do Compute Engine

Para este cenário de equilíbrio de carga, vai criar três instâncias de VM do Compute Engine e instalar o Apache nas mesmas. Adiciona uma regra de firewall que permite que o tráfego HTTP alcance as instâncias.

As instâncias que participam como VMs de back-end para equilibradores de carga de rede de encaminhamento direto externos têm de estar a executar o ambiente convidado do Linux, o ambiente convidado do Windows ou outros processos adequados que ofereçam uma funcionalidade equivalente.

Configurar as instâncias de back-end

Consola

  1. Na Trusted Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Clique em Criar instância.

  3. Defina Nome como www1.

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

  5. Defina a Zona como us-central1-b.

  6. Em Disco de arranque, a imagem do SO predefinida do Debian GNU/Linux 12 (bookworm) já está selecionada.

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

  8. Clique em Rede e configure o seguinte campo:

    1. Para etiquetas de rede, introduza network-lb-tag.
  9. Clique em Gestão. Introduza o seguinte script no campo Script de arranque.

     #! /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 denominada www2 com as mesmas definições, exceto com o seguinte script inserido no campo Automatização, Script de arranque.

      #! /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 denominada www3 com as mesmas definições, exceto com o seguinte script inserido no campo Automatização, Script de arranque.

        #! /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 seu sistema local e pressupõem um pedido de comando bash.

Para ver os nomes, os atributos e o estado das imagens do SO, use o comando gcloud compute images list.

  1. Crie três novas máquinas virtuais numa determinada zona e atribua-lhes todas a mesma etiqueta. Este exemplo define a zona como us-central1-b. A definição do campo tags permite-lhe fazer referência a todas estas instâncias de uma só vez, como com uma regra de firewall. Estes comandos também instalam o Apache em cada instância e atribuem a cada instância uma página inicial única.

    gcloud compute instances create www1 \
      --image-family debian-12 \
      --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-12 \
      --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-12 \
      --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

Crie a instância www1 na zona us-central1-b com o instances.insert método

POST https://compute.s3nsapis.fr/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-12-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 com os nomes www2 e www3 com as mesmas definições, exceto substitua www1 nos campos deviceName, value e name.

Criar uma regra de firewall para permitir tráfego externo para estas instâncias de VM

Consola

  1. Na Trusted Cloud consola, aceda à página Políticas de firewall.

    Aceder a Políticas de firewall

  2. Clique em Criar regra de firewall.

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

  4. Selecione a Rede à qual a regra de firewall se aplica (Predefinição).

  5. Em Segmentações, selecione Etiquetas de segmentação especificadas.

  6. No campo Etiquetas alvo, introduza network-lb-tag.

  7. Defina o Filtro de origem como Intervalos IPv4.

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

  9. Em Protocolos e portas especificados, selecione a caixa de verificação TCP e introduza 80.

  10. Clique em Criar. Pode demorar algum tempo até que a consola apresente a nova regra de firewall ou pode ter de clicar em Atualizar para ver a regra.

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

api

Crie uma regra de firewall que permita todo o tráfego na sub-rede com o método firewalls.insert **

POST https://compute.s3nsapis.fr/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"
  ]
}

Obter os endereços IP externos das suas instâncias e verificar se estão em execução

Consola

  1. Na Trusted Cloud consola, aceda à página Instâncias de VM.

    Aceder às instâncias de VM

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

  3. Verifique se as suas instâncias estão em execução procurando uma marca de verificação verde à esquerda do nome da instância. Se não vir uma marca de verificação verde, consulte a página de resolução de problemas gerais para instâncias.

gcloud

  1. Liste as suas instâncias para obter os respetivos endereços IP na coluna EXTERNAL_IP.

    gcloud compute instances list
    
  2. Verifique se cada instância está em execução.

    Na linha de comandos, execute curl usando o endereço IP externo de cada instância para confirmar que todas as instâncias respondem.

    curl http://[IP_ADDRESS]
    

api

Obtenha informações sobre a instância www1 com o método instances.get

Certifique-se de que o campo status indica RUNNING e procure o endereço IP externo no campo natIP.

GET https://compute.s3nsapis.fr/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-12-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.s3ns-system.iam.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 esta chamada API para www2 e www3.

Configurar o serviço de balanceamento de carga

Em seguida, configure o serviço de balanceamento de carga.

Quando configura o serviço de equilíbrio de carga, as suas instâncias de máquinas virtuais recebem pacotes destinados ao endereço IP externo estático que configura. Se estiver a usar uma imagem fornecida pelo Compute Engine, as suas instâncias são configuradas automaticamente para processar este endereço IP. Se estiver a usar outra imagem, tem de configurar este endereço como um alias em eth0 ou como um loopback em cada instância.

Consola

Não pode usar a Trusted Cloud consola para criar equilibradores de carga de rede de encaminhamento externo baseados em conjunto de destinos. Em alternativa, use o 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 funcionamento de HTTP antigo

    Este exemplo usa as predefinições do mecanismo de verificação de funcionamento, mas também pode personalizar a verificação de funcionamento por si.

    gcloud compute http-health-checks create basic-check
    
  3. Adicione um grupo de destino

    Adicione um conjunto de destino na mesma região que as instâncias da máquina virtual. Use a verificação de funcionamento criada no passo anterior para este conjunto de destino. Os conjuntos de destino requerem um serviço de verificação de estado para funcionar.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. Adicione as suas instâncias ao grupo de destino

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    As instâncias num conjunto de destino têm de pertencer à mesma região, mas podem estar distribuídas por diferentes zonas na mesma região. Por exemplo, pode ter instâncias na zona us-central1-f e instâncias na zona us-central1-b num único conjunto de destino porque estão na mesma região, us-central1.

  5. Adicione uma regra de encaminhamento

    Adicione uma regra de encaminhamento que sirva em nome de um intervalo de portas e de endereços IP externos que apontam para o seu conjunto de destino. Para o campo --address, use o endereço IP numérico ou o respetivo nome totalmente qualificado.

    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.s3nsapis.fr/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. Adicione uma verificação de funcionamento de HTTP antiga

    Este exemplo usa as predefinições do mecanismo de verificação do estado de funcionamento, mas também pode personalizá-lo.

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. Adicione um grupo de destinos

    Adicione um conjunto de destino na mesma região que as instâncias da máquina virtual. Use a verificação de funcionamento criada no passo anterior para este conjunto de destino. Os conjuntos de destino requerem um serviço de verificação de estado para funcionar.

    POST https://compute.s3nsapis.fr/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 suas instâncias ao grupo de destino

    POST https://compute.s3nsapis.fr/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    Repita esta chamada API para as instâncias www2 e www3.

    As instâncias num conjunto de destino têm de pertencer à mesma região, mas podem estar distribuídas por diferentes zonas na mesma região. Por exemplo, pode ter instâncias na zona us-central1-f e instâncias na zona us-central1-b num único conjunto de destino porque estão na mesma região, us-central1.

  5. Adicione uma regra de encaminhamento

    POST https://compute.s3nsapis.fr/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 para as suas instâncias

Agora que o serviço de balanceamento de carga está configurado, pode começar a enviar tráfego para a regra de encaminhamento e ver o tráfego disperso para diferentes instâncias.

Procurar o endereço IP externo da regra de encaminhamento

Consola

  1. Aceda ao separador Regras de encaminhamento na página de balanceamento de carga Avançado na Trusted Cloud consola.
    Aceda ao separador Regras de encaminhamento
  2. Localize www-rule, a regra de encaminhamento usada pelo balanceador de carga.
  3. Na coluna Endereço IP para www-rule, tome nota do endereço IP externo indicado.

gcloud

Introduza o seguinte comando para ver o endereço IP externo da www-rule regra de encaminhamento usada pelo balanceador de carga.

gcloud compute forwarding-rules describe www-rule --region us-central1

api

Veja o endereço IP externo da regra de encaminhamento www-rulecom o forwardingRules.get método

Na saída, procure o campo IPAddress.

GET https://compute.s3nsapis.fr/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"
}

O ICMP não é suportado para instâncias de back-end

Os balanceadores de carga de rede de encaminhamento externo não enviam pacotes ICMP para instâncias de back-end. Se enviar um pacote ICMP, por exemplo, com ping ou traceroute, a resposta não é proveniente das instâncias de back-end do balanceador de carga.

Trusted Cloud A infraestrutura pode enviar uma resposta ICMP, mesmo que 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 este comportamento.

Usar o comando curl para aceder ao endereço IP externo

A resposta ao comando curl alterna aleatoriamente entre as três instâncias. Se a sua resposta não tiver êxito inicialmente, pode ter de aguardar aproximadamente 30 segundos para que a configuração seja totalmente carregada e as suas instâncias sejam marcadas como em bom estado antes de tentar novamente:

$ while true; do curl -m1 IP_ADDRESS; done

O que se segue?