Como configurar o balanceamento de carga de rede para vários protocolos IP

Neste guia, você verá instruções para criar balanceadores de carga de rede baseados em serviço de back-end que balanceiam a carga de tráfego TCP, UDP, ESP e ICMP. Use essa configuração se quiser balancear a carga do tráfego que usa protocolos IP diferentes de TCP ou UDP. Os balanceadores de carga de rede baseados em pool de destino não são compatíveis com esse recurso.

Para configurar um balanceador de carga de rede para protocolos IP diferentes de TCP ou UDP, crie uma regra de encaminhamento com o protocolo definido como L3_DEFAULT. Essa regra de encaminhamento aponta para um serviço de back-end com o protocolo definido como UNSPECIFIED.

Neste exemplo, usamos dois balanceadores de carga de rede para distribuir o tráfego entre VMs de back-end em dois grupos gerenciados de instâncias zonais na região us-central1. Os dois balanceadores de carga recebem tráfego no mesmo endereço IP externo.

Um balanceador de carga tem uma regra de encaminhamento com o protocolo TCP e a porta 80, e o outro tem uma regra de encaminhamento com o protocolo L3_DEFAULT. O tráfego TCP que chega ao endereço IP na porta 80 será processado pela regra de encaminhamento TCP. Todo o tráfego TCP, UDP, ESP e ICMP que não corresponde à regra de encaminhamento específica do TCP será processado pela regra de encaminhamento L3_DEFAULT.

Balanceador de carga de rede com grupos gerenciados de instâncias zonais
Balanceamento de carga de rede com grupos gerenciados de instâncias zonais

Esse cenário distribui o tráfego TCP entre instâncias íntegras. Para dar suporte a isso, crie verificações de integridade de TCP para garantir que o tráfego seja enviado apenas para instâncias íntegras.

O balanceador de carga de rede é regional. Todos os componentes do balanceador de carga precisam estar na mesma região.

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 guia de referência da API e do gcloud.

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

Esse guia pressupõe que você esteja familiarizado com a ferramenta bash.

Como criar os grupos gerenciados de instâncias por zona

Neste cenário de balanceamento de carga, você criará dois grupos gerenciados de instâncias zonais do Compute Engine e instalará um servidor de eco em cada instância.

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 ou outros processos com funcionalidade equivalente.

Como configurar o grupo de instâncias para tráfego TCP na porta 80

Console do Cloud

  1. Acesse a página Grupos de instâncias no Console do Cloud.

    Acessar a página "Grupos de instâncias"

  2. Clique em Criar grupo de instâncias.
  3. Escolha Novo grupo de instâncias gerenciadas à esquerda.
  4. Em Nome, insira ig-us-tcp-80.
  5. Em Local, selecione Única zona.
  6. Em Região, selecione us-central1.
  7. Em Zona, selecione us-central1-a.
  8. Em Modelo de instância, selecione Criar um novo modelo de instância.

    1. Em Nome, insira ig-us-template-tcp-80.
    2. Certifique-se de que o disco de inicialização esteja configurado como uma imagem Debian. Por exemplo, Debian GNU/Linux 9 (stretch). Estas instruções usam comandos que estão disponíveis apenas no Debian, como apt-get.
    3. Na guia Gerenciamento, insira o seguinte script no campo Script de inicialização em Gerenciamento, segurança, discos, rede, locatário único.

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    4. Em Rede, preencha o campo Tags com a tag network-lb-tcp-80.

    5. Clique em Salvar e continuar.

  9. Especifique o número de instâncias que você quer criar no grupo.

    Para este exemplo, em Modo de escalonamento automático, selecione:

    • Não fazer escalonamento automático
    • Em Número de instâncias, insira 2
  10. Clique em Criar para criar o novo grupo.

gcloud

As instruções gcloud deste guia pressupõem que você está usando o Cloud Shell ou outro ambiente com o bash instalado.

  1. Crie um modelo de instância de VM com o servidor HTTP usando o comando gcloud compute instance-templates create.

    gcloud compute instance-templates create ig-us-template-tcp-80 \
    --region=us-central1 \
    --tags=network-lb-tcp-80 \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'
    
  2. Crie um grupo gerenciado de instâncias na zona com o comando gcloud compute instance-groups managed create.

    gcloud compute instance-groups managed create ig-us-tcp-80 \
        --zone us-central1-a \
        --size 2 \
        --template ig-us-template-tcp-80
    

Como configurar o grupo de instâncias para tráfego TCP na porta 8080, UDP, ESP e ICMP

Console do Cloud

  1. Acesse a página Grupos de instâncias no Console do Cloud.

    Acessar a página "Grupos de instâncias"

  2. Clique em Criar grupo de instâncias.
  3. Escolha Novo grupo de instâncias gerenciadas à esquerda.
  4. Em Nome, insira ig-us-l3-default.
  5. Em Local, selecione Única zona.
  6. Em Região, selecione us-central1.
  7. Em Zona, selecione us-central1-c.
  8. Em Modelo de instância, selecione Criar um novo modelo de instância.

    1. Em Nome, insira ig-us-template-l3-default.
    2. Certifique-se de que o disco de inicialização esteja configurado como uma imagem Debian. Por exemplo, Debian GNU/Linux 9 (stretch). Estas instruções usam comandos que estão disponíveis apenas no Debian, como apt-get.
    3. Na guia Gerenciamento, insira o seguinte script no campo Script de inicialização em Gerenciamento, segurança, discos, rede, locatário único. O script de inicialização também configura o servidor Apache para detectar na porta 8080 em vez da porta 80.

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sed -ire 's/^Listen 80$/Listen 8080/g' /etc/apache2/ports.conf
      systemctl restart apache2
      
    4. Em Rede, preencha o campo Tags com a tag network-lb-l3-default.

    5. Clique em Salvar e continuar.

  9. Especifique o número de instâncias que você quer criar no grupo.

    Para este exemplo, em Modo de escalonamento automático, selecione:

    • Não fazer escalonamento automático
    • Em Número de instâncias, insira 2
  10. Clique em Criar para criar o novo grupo.

gcloud

As instruções gcloud deste guia pressupõem que você está usando o Cloud Shell ou outro ambiente com o bash instalado.

  1. Crie um modelo de instância de VM com o servidor HTTP usando o comando gcloud compute instance-templates create.

    O script de inicialização também configura o servidor Apache para detectar na porta 8080 em vez da porta 80.

    gcloud compute instance-templates create ig-us-template-l3-default \
    --region=us-central1 \
    --tags=network-lb-l3-default \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    systemctl restart apache2'
    
  2. Crie um grupo gerenciado de instâncias na zona com o comando gcloud compute instance-groups managed create.

    gcloud compute instance-groups managed create ig-us-l3-default \
        --zone us-central1-c \
        --size 2 \
        --template ig-us-template-l3-default
    

Como configurar regras de firewall

Crie as regras de firewall a seguir:

  • Uma regra de firewall que permite que o tráfego TCP externo alcance instâncias de back-end no grupo de instâncias ig-us-tcp-80 na porta 80 (usando a tag de destino network-lb-tcp-80).
  • Uma regra de firewall que permite que outro tráfego externo (TCP na porta 8080, UDP, ESP e ICMP) alcance instâncias de back-end no grupo de instâncias ig-us-l3-default (usando a tag de destino network-lb-l3-default).

Console

  1. Acesse a página "Firewalls" no Console do Google Cloud.
    Acessar a página "Firewalls"
  2. Crie a primeira regra de firewall para o tráfego TCP.
    1. Clique em Criar regra de firewall.
    2. Informe um Nome de allow-network-lb-tcp-80.
    3. Selecione a Rede a que a regra de firewall se aplicará (Padrão).
    4. Em Destinos, selecione Tags de destino especificadas.
    5. No campo Tags de destino, insira network-lb-tcp-80.
    6. Defina os Intervalos de IP de origem como 0.0.0.0/0, o que permite tráfego de qualquer origem. Isso permite que as sondagens de verificação de integridade e tráfego externo alcancem as instâncias de back-end.
    7. Em Protocolos e portas, selecione Portas e protocolos especificados. Clique na caixa de seleção ao lado de tcp e digite 80.
    8. 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.
  3. Crie a segunda regra de firewall para o tráfego UDP, ESP e ICMP.
    1. Clique em Criar regra de firewall.
    2. Informe um Nome de allow-network-lb-l3-default.
    3. Selecione a Rede a que a regra de firewall se aplicará (Padrão).
    4. Em Destinos, selecione Tags de destino especificadas.
    5. No campo Tags de destino, insira network-lb-l3-default.
    6. Defina os Intervalos de IP de origem como 0.0.0.0/0, o que permite tráfego de qualquer origem. Isso permite que as sondagens de verificação de integridade e tráfego externo alcancem as instâncias de back-end.
    7. Em Protocolos e portas, selecione Portas e protocolos especificados.
      1. Clique na caixa de seleção ao lado de tcp e digite 8080.
      2. Clique na caixa de seleção ao lado de udp.
      3. Clique na caixa de seleção ao lado de Outros protocolos e insira esp, icmp.
    8. 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

  1. Crie a primeira regra de firewall para o tráfego TCP.

    gcloud compute firewall-rules create allow-network-lb-tcp-80 \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80
    
  2. Crie a segunda regra de firewall para o tráfego UDP, ESP e ICMP. Esse firewall também permite que as sondagens de verificação de integridade do TCP alcancem as instâncias na porta 8080.

    gcloud compute firewall-rules create allow-network-lb-l3-default \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,icmp
    

Como configurar os balanceadores de carga

Em seguida, configure os balanceadores de carga. Um balanceador de carga para processar o tráfego TCP na porta 80 e outro para lidar com o tráfego TCP na porta 8080, UDP, ESP e ICMP. Os dois balanceadores de carga usarão o mesmo endereço IP externo com suas respectivas regras de encaminhamento.

Quando você configura um balanceador de carga, as instâncias de VM de back-end 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 você estiver usando outra imagem, configure esse endereço como um alias em eth0 ou como um loopback em cada instância.

gcloud

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

    gcloud compute addresses create network-lb-ip \
        --region us-central1
    
  2. Crie uma verificação de integridade TCP para a porta 80. Ela é usada para verificar a integridade dos back-ends no grupo de instâncias ig-us-tcp-80.

    gcloud compute health-checks create tcp tcp-health-check-80 \
        --region us-central1 \
        --port 80
    
  3. Crie uma verificação de integridade TCP para a porta 8080. Ela é usada para verificar a integridade dos back-ends no grupo de instâncias ig-us-l3-default.

    gcloud compute health-checks create tcp tcp-health-check-8080 \
        --region us-central1 \
        --port 8080
    
  4. Crie o primeiro balanceador de carga para o tráfego TCP na porta 80.

    1. Crie um serviço de back-end com o protocolo TCP.

      gcloud beta compute backend-services create backend-service-tcp-80 \
          --protocol TCP \
          --health-checks tcp-health-check-80 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. Adicione o grupo de instâncias de back-end ao serviço de back-end:

      gcloud beta compute backend-services add-backend backend-service-tcp-80 \
          --instance-group ig-us-tcp-80 \
          --instance-group-zone us-central1-a \
          --region us-central1
      
    3. Crie uma regra de encaminhamento para encaminhar o tráfego TCP de entrada na porta 80 para o serviço de back-end. O TCP é o protocolo de regra de encaminhamento padrão e não precisa ser definido explicitamente.

      Use o endereço IP reservado na etapa 1 como o endereço IP externo estático do balanceador de carga.

      gcloud beta compute forwarding-rules create forwarding-rule-tcp-80 \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports 80 \
          --address network-lb-ip \
          --backend-service backend-service-tcp-80
      
  5. Crie o segundo balanceador de carga para tráfego TCP na porta 8080, UDP, ESP e ICMP.

    1. Crie um serviço de back-end com o protocolo UNSPECIFIED.

      gcloud beta compute backend-services create backend-service-l3-default \
          --protocol UNSPECIFIED \
          --health-checks tcp-health-check-8080 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. Adicione o grupo de instâncias de back-end ao serviço de back-end:

      gcloud beta compute backend-services add-backend backend-service-l3-default \
          --instance-group ig-us-l3-default \
          --instance-group-zone us-central1-c \
          --region us-central1
      
    3. Crie uma regra de encaminhamento com o protocolo definido como L3_DEFAULT para processar o restante do tráfego de protocolo IP compatível (TCP na porta 8080, UDP, ESP e ICMP). Todas as portas precisam ser configuradas com regras de encaminhamento L3_DEFAULT.

      Use o mesmo endereço IP externo do balanceador de carga anterior.

      gcloud beta compute forwarding-rules create forwarding-rule-l3-default \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --address network-lb-ip \
          --backend-service backend-service-l3-default
      

Como testar o balanceador de carga

Agora que o serviço de balanceamento de carga foi configurado, comece a enviar tráfego para o endereço IP externo do balanceador de carga e veja o tráfego ser distribuído às instâncias de back-end.

Procure o endereço IP externo do balanceador de carga.

Console

  1. Na página de balanceamento de carga Avançado, acesse a guia Regras de encaminhamento.
    Acessar a guia "Regras de encaminhamento"
  2. Localize forwarding-rule-tcp-80 ou forwarding-rule-l3-default. Neste exemplo, usamos o mesmo endereço IP para os dois balanceadores de carga. Portanto, ambos funcionarão.
  3. Na coluna Endereço IP, anote o endereço IP externo listado.

gcloud

Insira o comando a seguir para visualizar o endereço IP externo da regra de encaminhamento usada pelo balanceador de carga.

gcloud beta compute forwarding-rules describe forwarding-rule-tcp-80 \
    --region us-central1

Este exemplo usa o mesmo endereço IP para as duas regras de encaminhamento. Portanto, o uso de forwarding-rule-l3-default também funcionará.

Enviar tráfego ao balanceador de carga

Este procedimento envia tráfego externo ao balanceador de carga. Execute os testes a seguir para garantir que o tráfego TCP na porta 80 esteja sendo balanceado pelo grupo de instâncias ig-us-tcp-80 enquanto o restante do tráfego (TCP na porta 8080, UDP, ESP e ICMP) está sendo manipulado pelo grupo de instâncias ig-us-l3-default.

Como verificar o comportamento com solicitações TCP na porta 80

  1. Faça solicitações da Web (por TCP na porta 80) para o balanceador de carga usando curl para contatar o endereço IP dele.

    $ while true; do curl -m1 IP_ADDRESS; done
    
  2. Observe o texto retornado pelo comando curl. O nome da VM de back-end que gera a resposta é exibido nesse texto. Por exemplo: Page served from: VM_NAME. As respostas devem vir apenas de instâncias no grupo de instâncias ig-us-tcp-80.

    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:

Como verificar o comportamento com solicitações TCP na porta 8080

  1. Faça solicitações da Web (por TCP na porta 8080) para o balanceador de carga usando curl para contatar o endereço IP dele.

    $ while true; do curl -m1 IP_ADDRESS:8080; done
    
  2. Observe o texto retornado pelo comando curl. As respostas devem vir apenas de instâncias no grupo de instâncias ig-us-l3-default.

    Isso mostra que qualquer tráfego enviado para o endereço IP do balanceador de carga na porta 8080 está sendo processado apenas por back-ends no grupo de instâncias ig-us-l3-default.

Como verificar o comportamento com solicitações ICMP

Para verificar o comportamento com o tráfego ICMP, capture a saída do comando tcpdump para confirmar que apenas VMs de back-end no grupo de instâncias ig-us-l3-default estão processando solicitações ICMP enviadas para o balanceador de carga.

  1. SSH para as VMs de back-end.

    1. No Console do Cloud, acesse a página Instâncias de VM.
      Acessar a página "Instâncias de VM"

    2. Na lista de instâncias de máquina virtual, clique em SSH na linha da instância à qual você quer se conectar.

  2. Execute o seguinte comando para usar tcpdump para começar a detectar o tráfego ICMP.

    sudo tcpdump icmp -w ~/icmpcapture.pcap -s0 -c 10000
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    Deixe a janela SSH aberta.

  3. Repita as etapas 1 e 2 para as quatro VMs de back-end.

  4. Faça solicitações ICMP para o balanceador de carga usando ping para contatar o endereço IP dele.

    ping IP_ADDRESS
    
  5. Volte para a janela SSH aberta de cada VM e interrompa o comando de captura tcpdump. Use Ctrl+C para fazer isso.

  6. Para cada VM, verifique a saída do comando tcpdump no arquivo icmpcapture.pcap.

    sudo tcpdump -r ~/icmpcapture.pcap -n
    

    Para VMs de back-end no grupo de instâncias ig-us-l3-default, você verá entradas de arquivo como:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    22:13:07.814486 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 1, length 64
    22:13:07.814513 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 1, length 64
    22:13:08.816150 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 2, length 64
    22:13:08.816175 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 2, length 64
    22:13:09.817536 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 3, length 64
    22:13:09.817560 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 3, length 64
    ...
    

    Para VMs de back-end no grupo de instâncias ig-us-tcp-80, você verá que nenhum pacote foi recebido e o arquivo estará em branco:

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    

A seguir