Como configurar o roteamento personalizado com base em parâmetros de consulta e cabeçalho para o balanceador de carga HTTP(S) externo (versão clássica) global

Veja nesta página dois exemplos do balanceador de carga HTTP(S) externo global (versão clássica):

Para configurar o gerenciamento de tráfego para o balanceador de carga HTTP(S) externo global ou regional com recursos de gerenciamento de tráfego avançados, consulte as seguintes páginas:

Antes de começar

Como 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.

Como 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. Crie um modelo de instância. No Console do 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. 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.
    4. Na guia Gerenciamento, insira o seguinte script no campo Script de inicialização em Gerenciamento, segurança, discos, rede, locatário único.

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo a2ensite default-ssl
      sudo a2enmod ssl
      sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      sudo echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sudo systemctl restart apache2
      
    5. Na guia Rede, adicione as tags de rede: allow-health-check

    6. Clique em Criar.

  2. Crie um grupo de instâncias gerenciadas. Acesse a página Grupos de instâncias no Console do 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-9 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         sudo apt-get update
         sudo apt-get install apache2 -y
         sudo a2ensite default-ssl
         sudo a2enmod ssl
         sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         sudo echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         sudo 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. Acesse a página "Firewalls" no Console do Google Cloud.
    Acessar a página "Firewalls"
  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 ao lado de tcp e digite os números de porta, 80.
  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 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 HTTP(S) 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 HTTP(S) externo global (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 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/backendService/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 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 HTTP(S) 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 HTTP(S) externo global (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.

Como configurar o roteamento baseado em cabeçalho HTTP personalizado

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

Antes de começar

É possível usar um balanceador de carga HTTP(S) externo existente ou criar 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 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