Configurar 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 uma visão geral completa da ferramenta, consulte o Guia da ferramenta gcloud. Você encontra 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

Se você nunca usou a ferramenta de linha de comando gcloud, execute primeiro gcloud init para fazer a autenticação.

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.

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 participam como VMs de back-end para balanceadores de carga de rede precisam executar o ambiente convidado Linux, o ambiente convidado Windows apropriado ou outros processos com funcionalidade equivalente.

Configurar as instâncias

Console

  1. Acesse a página "Instâncias de VM" no Console do Google Cloud Platform.
    Acessar a página "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 9 (stretch) já está selecionada.
  7. Clique em Gerenciamento, segurança, discos, rede, locatário único para ver configurações avançadas.
  8. Na guia 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
    EOF
  9. Em Rede, preencha o campo Tags com network-lb-tag.
  10. Deixe os valores padrão no restante dos campos.
  11. 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
    EOF
  • 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 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-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

    Criar 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.
      Acessar a página "Firewalls"
    2. Clique em Create firewall rule.
    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 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

    Criar uma regra de firewall que permita todo o tráfego da 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 VM" 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 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://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 balanceador de carga no Console do Google Cloud.
      Acessar a página "Criar 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, insira um Nome www-network-lb no novo balanceador de carga.
    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 essa 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. Insira basic-check como o Nome da verificação de integridade.
      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 de front-end.
    2. Informe um Nome de www-rule.
    3. Em IP, clique no menu suspenso e selecione Criar endereço IP.
      1. Na tela Reservar um novo endereço IP estático, insira o Nome 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.

      Esse exemplo usa 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://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.

      Esse exemplo usa 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.

      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://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 de balanceamento de carga Avançado 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://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.