Como configurar o roteamento personalizado com base em parâmetros de consulta e cabeçalho para balanceadores de carga HTTP(S) externos

Essa página inclui dois exemplos:

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. 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 first-example-ig.
  5. Em Local, selecione Única zona.
  6. Em Região, selecione o local de sua preferência. O exemplo usa us-east1.
  7. Em Zona, selecione us-east1-b.
  8. Em Modelo de instância, selecione Criar um novo modelo de instância.
  9. Em Nome, insira lb-backend-template.
  10. 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.
  11. 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" \
    # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  12. Em Rede, adicione as tags: allow-health-check

  13. Clique em Salvar e continuar.

  14. Em Número de instâncias, insira 2.

  15. Em Modo de escalonamento automático, selecione Não fazer escalonamento automático.

  16. Clique em Criar para criar o novo grupo.

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 o modelo.

    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
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
         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 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 IP ranges.
  8. Defina Intervalos IP 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 \
    --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.
        gcloud compute backend-services create service-a \
            --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 \
            --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: /?foo=bar&ABTest=A&bar=foo
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: https://example.com/?foo=bar&ABTest=A&bar=foo
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?foo=bar&ABTest=B&bar=foo
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendService/service-b
      expectedOutputUrl: https://example.com/?foo=bar&ABTest=B&bar=foo
    
  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 fazer o roteamento das solicitações recebidas ao proxy.
        gcloud compute forwarding-rules create http-content-rule \
            --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: foobar
      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: foobar
      path: /
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendService/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
    

A seguir