Como configurar o balanceamento de carga de rede

Neste guia, você vê instruções para criar uma configuração básica de balanceamento de carga de rede. Para seguir o exemplo, você precisa ter vários servidores da Web nas instâncias do Google Compute Engine em que o tráfego será balanceado. No cenário, é definida uma configuração de balanceamento de carga de camada 3 para distribuir 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, o tráfego HTTP tem a carga balanceada, mas é possível usar o balanceamento de carga de rede no tráfego UDP, TCP e SSL. Antes de começar, consulte os Conceitos do balanceamento de carga de rede para informações mais detalhadas sobre ele.

Antes de começar

Instale a ferramenta de linha de comando gcloud. Para ter uma visão geral completa da ferramenta, consulte o guia dela. Você encontra os comandos relacionados ao balanceamento de carga no grupo de comandos gcloud compute.

Também é possível usar a sinalização --help para acessar a ajuda detalhada dos comandos gcloud:

gcloud compute http-health-checks create --help

Se você ainda não executou a ferramenta de linha de comando gcloud, primeiro execute gcloud init para autenticá-la.

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.

Para usar este guia, você precisa estar familiarizado com a ferramenta bash (em inglês).

Configurar instâncias 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 atuam como VMs de back-end nos balanceadores de carga de rede precisam executar o ambiente convidado Linux, o ambiente convidado Windows ou outros processos que forneçam a mesma funcionalidade.

Configurar as instâncias

Console

  1. Acesse a página "Instâncias de VMs" no console do Google Cloud Platform.
    Acessar a página "Instâncias de VMs"
  2. Clique em Criar instância.
  3. Defina o Nome como www1.
  4. Defina a Região como us-central1.
  5. Defina a Zona como us-central1-b.
  6. Em Disco de inicialização, a imagem de SO padrão Debian GNU/Linux 9 (stretch) já estará selecionada.
  7. Clique em Gerenciamento, segurança, discos, rede, locatário único para ver configurações avançadas.
    1. Em Gerenciamento, 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>www1</h1></body></html>' | tee /var/www/html/index.html
      EOF
    2. Em Rede, preencha o campo Tags com network-lb-tag.
    3. Não altere os valores padrão dos outros campos.
    4. Clique em Criar.
  8. 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
    EOF
  9. 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
    EOF

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 de 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. Neste exemplo, você define a zona como "us-central1-b". Com a configuração do campo tags, é possível consultar 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-9 \
      --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
        EOF"
    gcloud compute instances create www2 \
      --image-family debian-9 \
      --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
        EOF"
    gcloud compute instances create www3 \
      --image-family debian-9 \
      --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
        EOF"

API

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

POST https://www.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/eip-images/global/images/debian-9-drawfork-v20181101",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/n1-standard-1",
  "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.

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

Console

  1. Acesse a página "Firewalls" no Console do Google Cloud Platform.
    Acessar a página "Firewalls"
  2. Clique em Criar regra de firewall.
  3. Defina o Nome como 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 os Intervalos de IP de origem como 0.0.0.0/0, o que permite o tráfego de qualquer origem.
  8. Em Protocolos e portas especificados, clique na caixa de seleção próxima a TCP e insira 80.
  9. 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

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

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

Conseguir os endereços IP externos das instâncias e verificar se elas estão sendo executadas

Console

  1. Acesse a página "Instâncias de VMs" no console do Google Cloud Platform.
    Acessar a página "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 se todas as instâncias respondem.

    curl http://[IP_ADDRESS]
    

API

Receba 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 no campo natIP.

GET https://www.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/n1-standard-1",
 "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-9-stretch"
   ],
   "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\n EOF"
   }
  ]
 },
 "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.

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 usa outra imagem, configure esse endereço como alias no eth0 ou como loopback em cada instância.

Console

  1. Acesse a página Criar um balanceador de carga no Console do Google Cloud Platform.
    Acessar a página "Criar um balanceador de carga"
  2. Em Balanceamento de carga TCP, clique no botão Iniciar configuração.

  3. Em Somente voltado para a Internet ou interno, selecione From Internet to my VMs.

  4. Em Várias regiões ou região única, selecione Single region only.

  5. Clique no botão Continuar.

Configurar o back-end

  1. Na tela Novo balanceador de carga TCP, defina o Nome do novo balanceador de carga como www-network-lb.
  2. Clique em Configuração de back-end.
  3. O Nome do balanceador de carga que você inseriu anteriormente é exibido, mas não é possível modificá-lo.
  4. Em Região, selecione us-central1.
  5. Em Back-ends, clique na guia Selecionar instâncias atuais e em Adicionar uma instância. Insira a instância www1. Repita esta etapa para as instâncias www2 e www3.
  6. Em Verificação de integridade, clique em Criar nova verificação de integridade ou Criar outra verificação de integridade:

    1. Defina o Nome da verificação de integridade como basic-check.
    2. Não altere as configurações padrão.
    3. Clique no botão Salvar e continuar.

    Um círculo azul com uma marca de seleção à esquerda de Configuração de back-end indica o sucesso da configuração.

Configurar a regra de encaminhamento

  1. Clique em Configuração do front-end.
  2. Defina o Nome como www-rule.
  3. Em IP, clique no menu suspenso e selecione Criar endereço IP.
    1. Na tela Reservar endereço IP estático, defina o Nome como lb-ip-1.
    2. Clique em Reservar.
  4. Defina a Porta como 80.
  5. Clique no botão Concluído.

    Um círculo azul com uma marca de seleção à esquerda de Configuração de front-end indica o sucesso da configuração.

Analisar a configuração

  1. Clique no botão Analisar e finalizar para verificar todas as configurações do balanceador de carga.
  2. Se as configurações estiverem corretas, clique em Criar. Leva alguns minutos para que o balanceador de carga seja criado.

    Na tela do balanceamento de carga, na coluna "Back-end" do novo balanceador de carga, você verá uma marca de seleção verde. Ela indica que o novo balanceador de carga é íntegro.

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 único pool de destino pelo fato de estarem na mesma região, us-central1.

  5. Adicione 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://www.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.

    Neste exemplo, são usadas as configurações padrão do mecanismo de verificação de integridade, mas também é possível personalizá-lo.

    POST https://www.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://www.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://www.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.

    As instâncias em um pool de destino precisam pertencer à mesma região, mas é 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 único pool de destino pelo fato de estarem na mesma região, us-central1.

  5. Adicione uma regra de encaminhamento.

    POST https://www.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 para as 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.

Observar o endereço IP externo da regra de encaminhamento

Console

  1. Acesse a guia Regras de encaminhamento na página do balanceamento de carga Avançado no Console do Google Cloud Platform.
    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

Execute o comando a seguir para visualizar o endereço IP externo da regra de encaminhamento www-rule 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-rule com o método forwardingRules.get

Na resposta, localize o campo IPAddress.

GET https://www.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"
}

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 mais informações sobre como funciona o balanceamento de carga de rede, consulte esta página.