Configurar um balanceador de carga de rede de passagem externa global com back-ends de NEG zonal

Neste documento, mostramos como criar um balanceador de carga de rede de passagem externa global para balancear o tráfego entre back-ends de NEG por zona implantados em várias regiões.

Antes de começar

Certifique-se de que sua configuração atenda aos seguintes pré-requisitos.

Instalar a CLI do Google Cloud

As instruções neste guia usam a Google Cloud CLI para configurar um balanceador de carga de rede de passagem externa global. Para instalar, consulte Instalar a CLI gcloud.

Funções exigidas

Se você for o criador do projeto, vai receber o papel de proprietário (roles/owner). Por padrão, o papel de proprietário (roles/owner) ou de editor (roles/editor) inclui as permissões necessárias para seguir este documento.

Se você não é o criador do projeto, as permissões necessárias precisam ser concedidas ao principal apropriado. Por exemplo, um principal pode ser uma Conta do Google (para usuários finais) ou uma conta de serviço.

Para ter as permissões necessárias para configurar um balanceador de carga de rede de transferência externa global com back-ends de grupo de instâncias de VM, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.

Para mais informações sobre papéis e permissões do Cloud Load Balancing, consulte Papéis e permissões. Para mais informações sobre como definir políticas do IAM com concessões condicionais para regras de encaminhamento, consulte Condições do IAM para regras de encaminhamento.

Visão geral da configuração

O diagrama a seguir mostra um balanceador de carga de rede de passagem externa global com back-ends de NEG zonais implantados nas regiões us-west1 e europe-west2. Para entender como funciona um balanceador de carga de rede de passagem externa global, consulte a seção Arquitetura no guia de visão geral.

Neste exemplo, os seguintes componentes são configurados:

  • Quatro VMs de back-end:

    • vm-us-1 e vm-us-2 na zona us-west1-a
    • vm-eu-1 e vm-eu-2 na zona europe-west2-a
  • Dois NEGs zonais com endpoints GCE_VM_IP:

    • Anexe nic0 de vm-us-1 e vm-us-2 ao NEG na zona us-west1-a.
    • Anexe nic0 de vm-eu-1 e vm-eu-2 ao NEG na zona europe-west2-a.
  • Um único balanceador de carga de rede de passagem externa global para equilibrar o tráfego TCP:80 entre os quatro endpoints de rede.

Um balanceador de carga de rede de passagem externa global envia tráfego para back-ends de NEG zonal implantados nas regiões "us-west1" e "europe-west2".
Distribuição de tráfego para back-ends de NEG zonal usando um balanceador de carga de rede de passagem externa global (clique para ampliar).

Configurar a rede e as sub-redes

O exemplo usa uma rede VPC de modo personalizado chamada lb-network com sub-redes em duas regiões diferentes.

É possível configurar um balanceador de carga de rede de passagem externa global para ter GCE_VM_IP endpoints de rede que podem referenciar a interface de rede de uma VM cujo tipo de pilha pode ser somente IPv4 ou de pilha dupla.

A tabela a seguir resume a compatibilidade entre os tipos de tráfego do balanceador de carga, as interfaces de rede da VM de back-end e os tipos de pilha de sub-rede da VPC. Confira os requisitos de compatibilidade da interface de rede da VM de back-end com as sub-redes da VPC, conforme descrito no guia de arquitetura do balanceador de carga de rede de passagem externa global.

Tipo de tráfego do balanceador de carga Tipo de pilha da interface de rede da VM de back-end Tipo de pilha da sub-rede VPC
Somente tráfego IPv4 IPV4_ONLY IPV4_ONLY ou IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Somente tráfego IPv6 IPV6_ONLY IPV6_ONLY ou IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Tráfego IPv4 e IPv6 IPV4_IPV6 IPV4_IPV6

gcloud

  1. Crie a rede VPC. Neste exemplo, a rede VPC é chamada de lb-network.

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. Na rede VPC (lb-network), crie sub-redes em duas regiões.

    Crie uma sub-rede chamada lb-subnet-us para os endpoints de rede na região us-west1.

    Para criar uma sub-rede somente IPv4, use o seguinte comando:

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    Para criar uma sub-rede de pilha dupla, use o seguinte comando:

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    Crie uma sub-rede chamada lb-subnet-eu para os endpoints de rede na região europe-west2.

    Para somente tráfego IPv4, use o seguinte comando para criar uma sub-rede somente IPv4:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

    Para o tráfego IPv4 e IPv6, use o seguinte comando para criar uma sub-rede de pilha dupla:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

Crie regras de firewall

Para configurar seu ambiente de produção com segurança, crie duas regras de firewall separadas:

  • Regra de firewall de verificação de integridade, configurada para permitir o tráfego de entrada de:

  • Regra de firewall de tráfego do usuário, configurada para permitir o tráfego de entrada de:

    • os intervalos de IP de origem do cliente específicos que precisam acessar o balanceador de carga e
    • o protocolo IP e as portas configurados nas regras de encaminhamento

Observe o seguinte:

  • Se o aplicativo estiver atendendo a todos os usuários da Internet sem nenhuma limitação, configure os intervalos de IP de origem 0.0.0.0/0 para tráfego IPv4 e ::/0 para tráfego IPv6.

  • Se você configurou a verificação de integridade para sondar o protocolo IP e as portas do balanceamento de carga, é possível configurar uma única regra de firewall mesclando as regras de firewall de verificação de integridade e de tráfego de usuários.

gcloud

  • Crie uma regra de firewall que permita que o tráfego TCP de todos os intervalos de origem alcance suas instâncias de VM de back-end na porta 80. Essa porta e protocolo são usados para balanceamento de carga e verificação de integridade.

    • Para permitir todo o tráfego IPv4, execute o seguinte comando:

      gcloud compute firewall-rules create firewall-allow-traffic-ipv4 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=0.0.0.0/0
      
    • Para permitir todo o tráfego IPv6, execute o seguinte comando:

      gcloud compute firewall-rules create firewall-allow-traffic-ipv6 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=::/0
      

Criar VMs de back-end

Para este exemplo de balanceamento de carga, crie quatro VMs, conforme destacado na seção Visão geral da configuração.

Neste exemplo, a interface nic0 da VM está associada à rede VPC lb-network e a uma das sub-redes, lb-subnet-us ou lb-subnet-eu. A interface de rede referenciada pelo endpoint GCE_VM_IP precisa estar na mesma sub-rede VPC associada ao NEG zonal.

A tabela a seguir resume a compatibilidade entre os tipos de tráfego do balanceador de carga, as interfaces de rede da VM de back-end e os tipos de pilha de sub-rede da VPC. Confira os requisitos de compatibilidade da interface de rede da VM de back-end com as sub-redes da VPC, conforme descrito no guia de arquitetura do balanceador de carga de rede de passagem externa global.

Tipo de tráfego do balanceador de carga Tipo de pilha da interface de rede da VM de back-end Tipo de pilha da sub-rede VPC
Somente tráfego IPv4 IPV4_ONLY IPV4_ONLY ou IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Somente tráfego IPv6 IPV6_ONLY IPV6_ONLY ou IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Tráfego IPv4 e IPv6 IPV4_IPV6 IPV4_IPV6

gcloud

Execute o comando gcloud compute instances create quatro vezes para criar as quatro VMs, usando as seguintes quatro combinações para VM_NAME, REGION, ZONE e SUBNET. O script Bash é idêntico para todas as quatro VMs.

VM_NAME REGION ZONE SUBNET
vm-us-1 us-west1 us-west1-a lb-subnet-us
vm-us-2 us-west1 us-west1-a lb-subnet-us
vm-eu-1 europe-west2 europe-west2-a lb-subnet-eu
vm-eu-2 europe-west2 europe-west2-a lb-subnet-eu

Para criar VMs de back-end com interfaces de rede somente IPv4, use o comando a seguir.

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_ONLY \
    --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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Para criar VMs de back-end com interfaces de rede de pilha dupla, use o comando a seguir.

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_IPV6,ipv6-network-tier=PREMIUM \
    --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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Criar NEGs zonais com GCE_VM_IP endpoints

Para este exemplo de balanceamento de carga, crie dois NEGs zonais com endpoints GCE_VM_IP.

  • NEG por zona neg-us na zona us-west1-a. O NEG zonal consiste em dois endpoints de rede:
    • Anexe nic0 de vm-us-1 e vm-us-2 ao NEG zonal neg-us
  • NEG por zona neg-eu em europe-west2-a. O NEG zonal consiste em dois endpoints de rede:
    • Anexe nic0 de vm-eu-1 e vm-eu-2 ao NEG zonal neg-eu

Ao criar um NEG zonal com endpoints GCE_VM_IP, é preciso associá-lo explicitamente a uma sub-rede da VPC antes de adicionar endpoints ao NEG. O balanceador de carga entrega pacotes à interface de rede que está na sub-rede VPC associada ao NEG. Neste exemplo, os endpoints do NEG zonal vão apontar para nic0 das VMs.

gcloud

  1. Crie um NEG zonal GCE_VM_IP chamado neg-us na zona us-west1-a.

    gcloud compute network-endpoint-groups create neg-us \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet-us
    
  2. Adicione endpoints ao NEG zonal neg-us.

    gcloud compute network-endpoint-groups update neg-us \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-us-1' \
        --add-endpoint='instance=vm-us-2'
    
  3. Crie um NEG zonal GCE_VM_IP chamado neg-eu na zona europe-west2-a.

    gcloud compute network-endpoint-groups create neg-eu \
        --network-endpoint-type=gce-vm-ip \
        --zone=europe-west2-a \
        --network=lb-network \
        --subnet=lb-subnet-eu
    
  4. Adicione endpoints ao NEG zonal neg-eu.

    gcloud compute network-endpoint-groups update neg-eu \
        --zone=europe-west2-a \
        --add-endpoint='instance=vm-eu-1' \
        --add-endpoint='instance=vm-eu-2'
    

Reservar endereços IP externo globais

Um balanceador de carga de rede de passagem externa global requer dois endereços IP externo globais, um de cada grupo de disponibilidade. Esses dois endereços IP são anexados à regra de encaminhamento do balanceador de carga.

Para um balanceador de carga de rede de passagem externa global, os endereços IP da regra de encaminhamento são completamente dissociados das sub-redes VPC. Os endereços IP pertencem a pools de endereços IP externo globais do Google ou a prefixos delegados públicos IPv4 externos globais BYOIP de grupos de disponibilidade distintos e não estão associados a nenhuma sub-rede VPC.

Quando você configura uma regra de encaminhamento IPv6, os endereços IP da regra de encaminhamento são alocados como prefixos /96.

gcloud

Para o tráfego IPv4:

  1. Reserve o primeiro endereço IP externo global chamado lb-ipv4-ag0 no grupo de disponibilidade 0.

    gcloud beta compute addresses create lb-ipv4-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV4
    
  2. Reserve o segundo endereço IP externo global lb-ipv4-ag1 no grupo de disponibilidade 1.

    gcloud beta compute addresses create lb-ipv4-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV4
    

Para o tráfego IPv6:

  1. Reserve o primeiro endereço IP externo global chamado lb-ipv6-ag0 no grupo de disponibilidade 0.

    gcloud beta compute addresses create lb-ipv6-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV6
    
  2. Reserve o segundo endereço IP externo global lb-ipv6-ag1 no grupo de disponibilidade 1.

    gcloud beta compute addresses create lb-ipv6-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV6
    

Configurar o balanceador de carga

A configuração de um balanceador de carga de rede de passagem externa global envolve a criação de uma verificação de integridade, um serviço de back-end e uma regra de encaminhamento.

gcloud

  1. Crie uma verificação de integridade TCP configurada para gerar sondagens TCP:80

    gcloud compute health-checks create tcp hc-tcp-80 \
      --global \
      --port=80
    
  2. Crie um serviço de back-end global com o esquema de balanceamento de carga EXTERNAL_PASSTHROUGH.

    gcloud beta compute backend-services create lb-backend-service \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --health-checks=hc-tcp-80 \
      --global
    
  3. Adicione os NEGs zonais como back-ends ao serviço de back-end.

    Adicione o NEG zonal na zona us-west1-a ao serviço de back-end.

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-us \
        --network-endpoint-group-zone=us-west1-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    

    Adicione o NEG zonal na zona europe-west2-a ao serviço de back-end.

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-eu \
        --network-endpoint-group-zone=europe-west2-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    
  4. Crie uma regra de encaminhamento global para veicular o tráfego TCP:80. Você precisa criar duas regras de encaminhamento para processar o tráfego IPv4 e IPv6.

    Verifique se a versão IP da sua regra de encaminhamento corresponde ao tipo de pilha das interfaces de rede da VM de back-end.

    A regra de encaminhamento faz referência a endereços IP de cada grupo de disponibilidade.

    Para o tráfego IPv4:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv4 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
    

    Para o tráfego IPv6:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv6 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
    

Testar o balanceador de carga

  1. Consiga os endereços IP reservados anexados à regra de encaminhamento.

      gcloud beta compute forwarding-rules describe lb-forwarding-rule-ipv4 \
          --global
    

    Isso retorna dois endereços IP, um para cada grupo de disponibilidade. Esses endereços IP são chamados de IP_ADDRESS_AVAILABILITY_GROUP_0 e IP_ADDRESS_AVAILABILITY_GROUP_1.

  2. Envie o tráfego para um dos endereços IP.

      curl http://IP_ADDRESS_AVAILABILITY_GROUP_0
    
      curl http://IP_ADDRESS_AVAILABILITY_GROUP_1
    

Você vai receber respostas das VMs de back-end em regiões diferentes, dependendo da sua localização e da integridade do back-end.

Verificar a tabela de roteamento local para os endereços IP do balanceador de carga

As tabelas de roteamento local das VMs de back-end contêm os endereços IP do balanceador de carga de rede de passagem externa global.

Para verificar as rotas locais na VM de back-end, conecte-se a ela usando SSH e execute o seguinte comando:

  ip route list table local

A resposta é a seguinte:

local 10.1.2.5 dev ens4 proto kernel scope host src 10.1.2.5
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 136.124.69.214 dev ens4 proto 66 scope host
local 136.124.83.205 dev ens4 proto 66 scope host

No exemplo anterior, 136.124.69.214 e 136.124.83.205 são os endereços IP atribuídos à regra de encaminhamento do balanceador de carga. As entradas de linha local 136.124.69.214 dev ens4 proto 66 scope host e local 136.124.83.205 dev ens4 proto 66 scope host na tabela de roteamento local da VM permitem que pacotes endereçados aos endereços IP do balanceador de carga sejam aceitos pelo back-end. O Cloud de Confiance ambiente de convidado é responsável por adicionar essa entrada.

A entrada da tabela de roteamento local na VM de back-end aceita o pacote para entrega local do host, em que a pilha de rede o entrega ao aplicativo em escuta. Os pacotes de resposta do aplicativo são enviados diretamente ao cliente.

O endereço IP do balanceador de carga não é configurado na interface de rede da VM. Para verificar isso, execute o seguinte comando:

  ip addr list

A resposta é a seguinte: Os endereços IP (136.124.69.214 e 136.124.83.205) aparecem na tabela de roteamento local, mas não estão configurados na interface de rede.

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens4:  mtu 1460 qdisc fq_codel state UP group default qlen 1000
    link/ether 42:01:0a:01:02:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.1.2.13/32 metric 100 scope global dynamic ens4
       valid_lft 84283sec preferred_lft 84283sec
    inet6 fe80::4001:aff:fe01:20d/64 scope link
       valid_lft forever preferred_lft forever

A seguir