Configurar o roteamento com base em parâmetros de cabeçalho e consulta para o balanceador de carga clássico do aplicativo

Esta página inclui dois exemplos do balanceador de carga clássico do aplicativo:

Para configurar o gerenciamento de tráfego para o balanceador de carga de aplicativo externo global e o balanceador de carga de aplicativo externo regional, consulte as seguintes páginas:

Antes de começar

Configurar o roteamento com base em parâmetros de consulta

Este exemplo mostra o uso de parâmetros de consulta para fazer testes A/B por meio da correspondência na string de consulta.

Adicionar dois grupos de instâncias de back-end

Para que o roteamento seja útil, você precisa ter vários back-ends.

Para configurar dois back-ends, as VMs precisam estar em dois grupos de instâncias. Neste guia, descrevemos como criar grupos de instâncias gerenciadas com VMs do Linux que têm o Apache em execução para, em seguida, configurar o balanceamento de carga.

Os grupos de instâncias gerenciadas fornecem VMs que executam os servidores de back-end de um balanceador de carga HTTP externo. Para fins de demonstração, os back-ends exibem nomes de host próprios.

Para simplificar, os back-ends residem na mesma região. Se você quiser uma configuração multirregional, precisará ter um modelo de instância configurado para a segunda região.

Console

  1. Criar um modelo de instância. No console do Google Cloud, acesse a página Modelos de instância.

    Acessar "Modelos de instância"

    1. Clique em Criar modelo de instância.
    2. Em Nome, insira lb-backend-template.
    3. Verifique se o disco de inicialização está definido como uma imagem Debian. Por exemplo, Debian GNU/Linux 10 (buster). Estas instruções usam comandos que estão disponíveis apenas no Debian, como apt-get.
    4. Clique em Opções avançadas.
    5. Clique em Rede e configure o seguinte campo:
      1. Em Tags de rede, insira allow-health-check.
    6. Clique em Gerenciamento. Insira o script a seguir no campo Script de inicialização.

      #! /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
      
    7. Clique em Criar.

  2. Crie um grupo de instâncias gerenciadas. Acesse a página Grupos de instâncias no console do Google Cloud.

    Acesse grupo de instâncias

    1. Clique em Criar grupo de instâncias.
    2. Selecione Novo grupo gerenciado de instâncias (sem estado). Para mais informações, consulte MIGs sem estado ou com estado.
    3. Em Nome, insira first-example-ig.
    4. Em Local, selecione Única zona.
    5. Em Região, selecione a região de sua preferência. O exemplo usa us-east1.
    6. Em Zona, selecione us-east1-b.
    7. Em Modelo de instância, selecione o modelo de instância lb-backend-template.
    8. Em Número máximo de instâncias, insira 2.
    9. Em Modo de escalonamento automático, selecione Off:do not autoscale.
    10. Clique em Criar.

Crie outro grupo de instâncias gerenciadas como este. Nomeie o segundo grupo como second-example-ig e baseie-o no modelo lb-backend-template.

gcloud

  1. Crie um modelo de instância.

    gcloud compute instance-templates create `lb-backend-template` \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-10 \
       --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://metadata.google.internal/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. Crie o primeiro grupo de instâncias gerenciadas com base no modelo.

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. Crie o segundo grupo de instâncias gerenciadas com base no modelo.

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

Como configurar uma regra de firewall

Neste exemplo, você criará a regra de firewall fw-allow-health-check. Essa é uma regra de entrada que permite o tráfego dos sistemas de verificação de integridade do Google Cloud (130.211.0.0/22 e 35.191.0.0/16). Este exemplo usa a tag de destino allow-health-check para identificar as VMs.

Console

  1. No Console do Google Cloud, acesse a página políticas de Firewall.
    Acessar políticas de firewall
  2. Clique em Criar regra de firewall para gerar a segunda regra:
  3. Informe um Nome de fw-allow-health-check.
  4. Em Rede, selecione Default.
  5. Em Destinos, selecione Tags de destino especificadas.
  6. Preencha o campo Tags de destino com allow-health-check.
  7. Defina Filtro de origem como Intervalos IPv4.
  8. Defina Intervalos IPv4 de origem como 130.211.0.0/22 e 35.191.0.0/16.
  9. Em Protocolos e portas, selecione Portas e protocolos especificados.
  10. Marque a caixa de seleção TCP e insira 80 como números de porta.
  11. Clique em Criar.

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

Como reservar um endereço IP externo

Agora que suas instâncias estão funcionando, configure um endereço IP externo, estático e global que seus clientes possam usar para alcançar seu balanceador de carga.

Console

  1. Acesse a página "Endereços IP externos" no Console do Google Cloud.
    Acessar a página "Endereços IP externos"
  2. Clique em Reservar endereço estático para reservar um endereço IPv4.
  3. Atribua um Nome de lb-ipv4-1.
  4. Defina o "Nível de rede" como Padrão.
  5. Defina Versão IP como IPv4.
  6. Defina Tipo como Global.
  7. Clique em Reservar.
  8. Certifique-se de que o Tipo esteja definido como Global.
  9. Clique em Reservar.

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

Anote o endereço IPv4 que foi reservado:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Como configurar os back-ends do balanceador de carga

Console

No momento, o console do Google Cloud não é compatível com a configuração de roteamento com base em cabeçalho e parâmetro. Use gcloud ou a API.

gcloud

  1. Crie uma verificação de integridade.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. Crie o primeiro serviço de back-end.
    • Para um balanceador de carga de aplicativo externo global, use o comando da CLI gcloud com load-balancing-scheme=EXTERNAL_MANAGED. Essa configuração oferece recursos avançados de gerenciamento de tráfego.
    • Para um balanceador de carga de aplicativo clássico, use load-balancing-scheme=EXTERNAL.
        gcloud compute backend-services create service-a \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. Crie o segundo serviço de back-end
        gcloud compute backend-services create service-b \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. Inclua o primeiro grupo de instâncias como back-end do primeiro serviço de back-end.
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. Inclua o segundo grupo de instâncias como back-end do segundo serviço de back-end.
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

Como criar o mapa de URLs

Console

No momento, o console do Google Cloud não é compatível com a configuração de roteamento com base em cabeçalho e parâmetro. Use gcloud ou a API.

gcloud

  1. Crie um arquivo YAML /tmp/web-map-http.yaml. Substitua PROJECT_ID pelo ID do projeto:

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /?ABTest=A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?ABTest=A
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?ABTest=B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
      expectedOutputUrl: http://example.com/?ABTest=B
    
  2. Validar o mapa de URL.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Se os testes forem aprovados e o comando resultar em uma mensagem de êxito, salve as alterações no mapa de URL.

  3. Atualize o mapa de URL.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

Como criar o proxy de destino e a regra de encaminhamento

Console

No momento, o console do Google Cloud não é compatível com a configuração de roteamento com base em cabeçalho e parâmetro. Use gcloud ou a API.

gcloud

  1. Crie um proxy HTTP de destino para encaminhar solicitações ao mapa de URLs.
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. Crie uma regra de encaminhamento global para encaminhar as solicitações recebidas para o proxy.
    • Para um balanceador de carga de aplicativo externo global, use o comando da CLI gcloud com load-balancing-scheme=EXTERNAL_MANAGED. Essa configuração oferece recursos avançados de gerenciamento de tráfego.
    • Para um balanceador de carga de aplicativo clássico, use load-balancing-scheme=EXTERNAL.
        gcloud compute forwarding-rules create http-content-rule \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --network-tier=PREMIUM \
            --address=lb-ipv4-1 \
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

Teste

Anote o endereço IPv4 que foi reservado:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Teste essa configuração executando:

curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B

Em um navegador, abra http://IP_ADDRESS?ABTest=A e http://IP_ADDRESS?ABTest=B.

Configurar o roteamento baseado em cabeçalho HTTP

Este exemplo demonstra como adicionar e remover cabeçalhos HTTP para fazer o roteamento inteligente.

Antes de começar

Use um balanceador de carga de aplicativo externo existente ou crie um novo.

Use esse recurso com qualquer um dos tipos de back-end compatíveis. Neste exemplo, pressupomos que você esteja usando VMs em um grupo de instâncias.

Para configurar um balanceador de carga simples, consulte o exemplo baseado em parâmetros de consulta acima.

Como atualizar o mapa de URL

Console

No momento, o console do Google Cloud não é compatível com a configuração de roteamento com base em cabeçalho e parâmetro. Use gcloud ou a API.

gcloud

  1. Este exemplo demonstra o uso de cabeçalhos de solicitação HTTP para fazer testes A/B por meio da correspondência de valores nos cabeçalhos HTTP da solicitação.

    Crie um arquivo YAML /tmp/web-map-http.yaml. Substitua PROJECT_ID pelo ID do projeto:

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    - description: Test routing for query ABTest with B
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    
  2. Validar o mapa de URL.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Se os testes forem aprovados e o comando resultar em uma mensagem de êxito, salve as alterações no mapa de URL.

  3. Atualize o mapa de URL.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

Teste

Usando o endereço IPv4 do balanceador de carga associado, teste essa configuração executando:

curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"

A seguir