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

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 fazendo a 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 e configurar o balanceamento de carga.

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

Para simplificar, os back-ends residem na mesma região. Se você quiser uma configuração multirregional, será necessário 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. Este 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 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. Adicione o primeiro grupo de instâncias como back-end ao 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. Adicione o segundo grupo de instâncias como o back-end ao 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, certificando-se de substituir 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
    
  2. Atualize o mapa de URLs.

    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 URL.
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. Crie uma regra de encaminhamento global para direcionar ao proxy as solicitações recebidas.
        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.

É possível usar 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. Crie um arquivo YAML /tmp/web-map-http.yaml.

    Este exemplo demonstra o uso de cabeçalhos de solicitação HTTP para fazer testes A/B correspondendo a valores nos cabeçalhos HTTP da solicitação.

    defaultService: $[DEFAULT_SERVICE_URL]
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: matcher1
    pathMatchers:
    - defaultService: $[DEFAULT_SERVICE_URL]
      name: matcher1
      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
    
  2. Atualize o mapa de URLs.

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