Configuração do Traffic Director com VMs e implantação manual do Envoy

Antes de seguir as instruções deste guia, leia a seção Como se preparar para a configuração do Traffic Director e verifique se você concluiu as tarefas de pré-requisito descritas nesse documento.

Este guia mostra como implantar manualmente um plano de dados que consiste em proxies secundários do Envoy, configurá-lo usando o Traffic Director e verificar sua configuração para garantir que ele esteja funcionando corretamente. Esse processo envolve:

  1. Criação de um serviço de teste.
  2. Implantação de um plano de dados simples no Compute Engine usando proxies Envoy.
  3. Configuração do Traffic Director usando as APIs do Compute Engine, que permitem ao Traffic Director configurar os proxies secundários do Envoy.
  4. Faça login em uma VM que esteja executando um proxy Envoy e envie uma solicitação para um back-end com carga balanceada por meio do proxy Envoy.

Os exemplos de configuração neste documento são para fins de demonstração. Para um ambiente de produção, pode ser preciso implantar mais componentes, com base no ambiente e nos requisitos.

Visão geral do processo de configuração

Nesta seção, apresentamos o processo de configuração manual para serviços executados em VMs do Compute Engine. O processo de configuração das VMs do cliente consiste na definição de um proxy secundário e na interceptação do tráfego em um host de VM do Compute Engine. Depois, você configura o balanceamento de carga usando as APIs do Google Cloud.

Esta seção fornece informações sobre como receber e injetar proxies Envoy de fontes de terceiros que não são gerenciadas pelo Google.

Quando um aplicativo envia tráfego ao serviço configurado no Traffic Director, o tráfego é interceptado e redirecionado ao proxy secundário compatível com a API xDS. Depois, a carga do tráfego é balanceada para os back-ends de acordo com a configuração dos componentes de balanceamento de carga no GCP. Para mais informações sobre rede de host e interceptação de tráfego, leia Como funciona a interceptação e o balanceamento de carga no Traffic Director.

Para cada host de VM que requer acesso aos serviços do Traffic Director, execute as etapas a seguir:

  1. Atribua uma conta de serviço à VM.

  2. Defina o escopo de acesso da API da VM para permitir acesso total às APIs do Google Cloud.

    • Ao criar as VMs, em Identidade e acesso à API, clique em Permitir acesso total a todas as APIs do Cloud.

      Acessar a página "Instâncias de VMs".

    • Com a ferramenta de linha de comando gcloud, especifique o seguinte:

      --scopes=https://www.googleapis.com/auth/cloud-platform

  3. Permita conexões de saída com a VM trafficdirector.googleapis.com (TCP, porta 443) da VM para que o proxy secundário possa se conectar ao plano de controle do Traffic Director sobre gRPC. As conexões de saída com a porta 443 são ativadas por padrão.

  4. Implante um proxy sidecar compatível com a API xDS (como o Envoy), com uma configuração de inicialização apontando para trafficdirector.googleapis.com:443 como o servidor xDS. Use esta amostra de arquivo de configuração de inicialização como referência.

  5. Redirecione o tráfego de IP destinado aos serviços para a porta do listener de interceptação de proxy sidecar.

    1. Essa porta é definida como TRAFFICDIRECTOR_INTERCEPTION_PORT na configuração de metadados de inicialização do proxy. Além disso, ela é configurada como 15001 na amostra de arquivo de configuração de inicialização.
    2. O script iptables do Istio (em inglês) pode ser usado para configurar a interceptação de tráfego.

Como criar o serviço de teste Hello World

Nesta seção, mostramos como criar um serviço de teste simples que retorna o nome do host da VM que atendeu à solicitação do cliente. O serviço de teste é descomplicado, porque é um servidor da Web implantado em um grupo de instâncias gerenciadas do Compute Engine.

Como criar o modelo de instância para o serviço de teste Hello World

O modelo de instância que você cria configura um servidor da Web apache2 de amostra usando o parâmetro startup-script.

Console

  1. No Console do Cloud, acesse a página "Modelos de instância".

    Acessar a página "Modelos de instância"

  2. Clique em Criar modelo de instância.
  3. Nos campos, insira as informações a seguir:
    • Name: td-demo-hello-world-template
    • Disco de inicialização: Debian GNU/Linux 10 (buster)
    • Conta de serviço: conta de serviço padrão do Compute Engine
    • Escopos de acesso: permitir acesso total a todas as APIs do Cloud
  4. Clique em Gerenciamento, segurança, discos, rede, locatário único. 1 Na guia Rede, no campo **Tags de rede, adicione a tag td-http-server.
  5. Na guia Gerenciamento, copie o seguinte script para o campo Script de inicialização.

    #! /bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html
    
  6. Clique em Criar

gcloud

Para criar o modelo de instância:

gcloud compute instance-templates create td-demo-hello-world-template \
  --machine-type=n1-standard-1 \
  --boot-disk-size=20GB \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=td-http-server \
  --metadata=startup-script="#! /bin/bash
sudo apt-get update -y
sudo apt-get install apache2 -y
sudo service apache2 restart
sudo mkdir -p /var/www/html/
echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html"

Como criar o grupo de instâncias gerenciadas para o serviço Hello World

Nesta seção, você especifica que o grupo de instâncias gerenciadas sempre tem duas instâncias do serviço de teste. Isso é para fins de demonstração. O Traffic Director é compatível com grupos de instâncias gerenciadas com escalonamento automático.

Console

  1. No Console do Cloud, acesse a página Grupos de instâncias.

    Acessar a página "Grupos de instâncias"

  2. Clique em Criar grupo de instâncias.
  3. Verifique se a opção Novo grupo de instâncias gerenciadas está selecionada.
  4. Insira td-demo-hello-world-mig como o nome do grupo de instâncias gerenciadas e selecione a zona us-central1-a.
  5. Em "Modelo de instância", selecione td-demo-hello-world-template, que é o modelo de instância que você criou.
  6. Em Modo de escalonamento automático, selecione Não fazer escalonamento automático.
  7. Em Número de instâncias, especifique pelo menos duas como o número de instâncias que você quer criar no grupo.
  8. Clique em Criar

gcloud

Use a ferramenta de linha de comando gcloud para criar um grupo de instâncias gerenciadas com o modelo de instância que você criou anteriormente.

gcloud compute instance-groups managed create td-demo-hello-world-mig \
  --zone us-central1-a \
  --size=2 \
  --template=td-demo-hello-world-template

Como criar o modelo de instância e o grupo de instâncias gerenciadas em que o Envoy é implantado

Use as instruções nesta seção para criar manualmente um modelo de instância e um grupo de instâncias gerenciadas para o Traffic Director.

Com os grupos de instâncias gerenciadas, é possível criar novas VMs de back-end por meio do escalonamento automático.

Este exemplo mostra como:

  • Crie um modelo de VM com uma configuração completa do Envoy e um serviço de amostra que exiba o nome de host dele usando o protocolo HTTP.
  • Configure um grupo de instâncias gerenciadas usando esse modelo.

Como criar o modelo de instância

Primeiro, crie o modelo de instância de VM do Compute Engine. Esse modelo configura automaticamente o proxy secundário do Envoy e o serviço da Web apache2 de amostra por meio do parâmetro startup-script.

Console

  1. No Console do Cloud, acesse a página "Modelos de instância".

    Acessar a página "Modelos de instância"

  2. Clique em Criar modelo de instância.
  3. Preencha os campos da seguinte forma:

    • Nome: td-vm-template
    • Disco de inicialização: Debian GNU/Linux 9 (stretch)
    • Conta de serviço: conta de serviço padrão do Compute Engine
    • Escopos de acesso: permitir acesso total a todas as APIs do Cloud
  4. Em Firewall, marque as caixas ao lado de Permitir tráfego HTTP e Permitir tráfego HTTPS.

  5. Clique em Gerenciamento, segurança, discos, rede, locatário único.

  6. Na guia Gerenciamento, copie o script a seguir para o campo Script de inicialização:.

    
    #! /bin/bash
    # Add a system user to run Envoy binaries. Login is disabled for this user
    sudo adduser --system --disabled-login envoy
    # Download and extract the Traffic Director tar.gz file
    sudo wget -P /home/envoy https://storage.googleapis.com/traffic-director/traffic-director.tar.gz
    sudo tar -xzf /home/envoy/traffic-director.tar.gz -C /home/envoy
    sudo cat << END > /home/envoy/traffic-director/sidecar.env
    ENVOY_USER=envoy
    # Exclude the proxy user from redirection so that traffic doesn't loop back
    # to the proxy
    EXCLUDE_ENVOY_USER_FROM_INTERCEPT='true'
    # Intercept all traffic by default
    SERVICE_CIDR='*'
    GCP_PROJECT_NUMBER=''
    VPC_NETWORK_NAME=''
    ENVOY_PORT='15001'
    ENVOY_ADMIN_PORT='15000'
    LOG_DIR='/var/log/envoy/'
    LOG_LEVEL='info'
    XDS_SERVER_CERT='/etc/ssl/certs/ca-certificates.crt'
    END
    sudo apt-get update -y
    sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository 'deb [arch=amd64] https://download.docker.com/linux/debian stretch stable' -y
    sudo apt-get update -y
    sudo apt-get install docker-ce apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html
    sudo /home/envoy/traffic-director/pull_envoy.sh
    sudo /home/envoy/traffic-director/run.sh start
    
    
  7. Clique em Criar para criar o modelo.

gcloud

  1. Crie o modelo da instância.

    
    gcloud compute instance-templates create td-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=http-td-tag,http-server,https-server \
      --image-family=debian-9 \
      --image-project=debian-cloud \
      --metadata=startup-script="#! /bin/bash
    
    # Add a system user to run Envoy binaries. Login is disabled for this user
    sudo adduser --system --disabled-login envoy
    # Download and extract the Traffic Director tar.gz file
    sudo wget -P /home/envoy https://storage.googleapis.com/traffic-director/traffic-director.tar.gz
    sudo tar -xzf /home/envoy/traffic-director.tar.gz -C /home/envoy
    sudo cat << END > /home/envoy/traffic-director/sidecar.env
    ENVOY_USER=envoy
    # Exclude the proxy user from redirection so that traffic doesn't loop back
    # to the proxy
    EXCLUDE_ENVOY_USER_FROM_INTERCEPT='true'
    # Intercept all traffic by default
    SERVICE_CIDR='*'
    GCP_PROJECT_NUMBER=''
    VPC_NETWORK_NAME=''
    ENVOY_PORT='15001'
    ENVOY_ADMIN_PORT='15000'
    LOG_DIR='/var/log/envoy/'
    LOG_LEVEL='info'
    XDS_SERVER_CERT='/etc/ssl/certs/ca-certificates.crt'
    END
    sudo apt-get update -y
    sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository 'deb [arch=amd64] https://download.docker.com/linux/debian stretch stable' -y
    sudo apt-get update -y
    sudo apt-get install docker-ce apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html
    sudo /home/envoy/traffic-director/pull_envoy.sh
    sudo /home/envoy/traffic-director/run.sh start"
    
    

Como criar o grupo de instâncias gerenciadas

Se você não tiver um grupo de instâncias gerenciadas com serviços em execução, crie um grupo de instâncias gerenciadas usando um modelo de VM como o mostrado na seção anterior. Este exemplo usa o modelo de instância criado na seção anterior para demonstrar a funcionalidade. Você não precisa usar o modelo de instância.

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 um grupo de instâncias. Por padrão, você vê a página para criar um grupo de instâncias gerenciadas.
  3. Digite td-vm-mig-us-central1 para o nome do grupo de instâncias gerenciadas e selecione a zona us-central1-a.
  4. Em Modelo de instância, selecione o modelo de instância que você criou.
  5. Especifique 2 como o número de instâncias que você quer criar no grupo.
  6. Clique em Criar

gcloud

Use a ferramenta de linha de comando gcloud para criar um grupo de instâncias gerenciadas com o modelo de instância que você criou anteriormente.

gcloud compute instance-groups managed create td-vm-mig-us-central1 \
    --zone us-central1-a --size=2 --template=td-vm-template

Como configurar o Traffic Director com componentes de balanceamento de carga do Google Cloud

As instruções nesta seção mostram como configurar o Traffic Director para que os proxies do Envoy carreguem o tráfego de saída em duas instâncias de back-end. Você configura os seguintes componentes:

Como criar a verificação de integridade

Use as instruções a seguir para criar uma verificação de integridade. Para mais informações, consulte Como criar verificações de integridade.

Console

  1. Acesse a página "Verificações de integridade" no Console do Google Cloud.
    Acessar a página "Verificações de integridade"
  2. Clique em Criar verificação de integridade.
  3. Para o nome, insira td-vm-health-check.
  4. Como protocolo, selecione HTTP.
  5. Clique em Criar.

gcloud

  1. Crie a verificação de integridade.
gcloud compute health-checks create http td-vm-health-check
  1. Crie a regra de firewall.

    gcloud compute firewall-rules create fw-allow-health-checks \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags http-td-tag,http-server,https-server \
      --rules tcp
    

Como criar o serviço de back-end

Se você usar a ferramenta de linha de comando gcloud, precisará designar o serviço de back-end como um serviço de back-end global com um esquema de balanceamento de carga de INTERNAL_SELF_MANAGED. Adicione a verificação de integridade e um grupo de instâncias gerenciadas ou não gerenciadas ao serviço de back-end. Observe que este exemplo usa o grupo de instâncias gerenciadas com o modelo de VM do Compute Engine que executa o serviço HTTP de amostra criado em Como criar o grupo de instâncias gerenciadas.

Console

  1. Acesse a página do Traffic Director no Console do Cloud.

    Acessar a página do Traffic Director

  2. Na guia Serviços, clique em Criar serviço.

  3. Clique em Continuar.

  4. Como nome do serviço, insira td-vm-service.

  5. Selecione a rede VPC correta.

  6. Verifique se o Tipo de back-end é Grupos de instâncias.

  7. Selecione o grupo de instâncias gerenciadas que você criou.

  8. Insira os Números de porta corretos.

  9. Escolha Utilização ou Taxa como o Modo de balanceamento. O valor padrão é Taxa.

  10. Clique em Concluído.

  11. Selecione a verificação de integridade que você criou.

  12. Clique em Salvar e continuar.

  13. Clique em Criar

gcloud

  1. Crie o serviço de back-end:

    gcloud compute backend-services create td-vm-service
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED \
     --health-checks td-vm-health-check
    
  2. Adicione os back-ends ao serviço de back-end.

    gcloud compute backend-services add-backend td-vm-service \
      --instance-group td-vm-mig-us-central1 \
      --instance-group-zone us-central1-a \
      --global
    

Como criar o mapa de regras de roteamento

O mapa de regras de roteamento define como o Traffic Director encaminha o tráfego na malha.

Use estas instruções para criar a regra de rota, a regra de encaminhamento, o proxy de destino e o endereço IP interno da configuração do Traffic Director.

O tráfego enviado para o endereço IP interno é interceptado pelo proxy Envoy e encaminhado ao serviço apropriado de acordo com as regras de caminho e host.

A regra de encaminhamento é criada como uma regra de encaminhamento global com load-balancing-scheme definido como INTERNAL_SELF_MANAGED.

Você pode definir o endereço da regra de encaminhamento como 0.0.0.0. Se você fizer isso, o tráfego será roteado com base nas informações de caminho e nome do host HTTP configuradas no mapa de URL, independentemente do endereço IP de destino real da solicitação. Nesse caso, os nomes de host dos seus serviços, conforme configurado nas regras de host, precisam ser exclusivos na configuração da malha de serviço. Ou seja, não é possível ter dois serviços diferentes, com diferentes conjuntos de back-ends, que usam o mesmo nome de host.

Como alternativa, é possível ativar o roteamento com base no VIP real do destino do serviço. Se você configurar o VIP do seu serviço como um parâmetro address da regra de encaminhamento, somente as solicitações destinadas a esse endereço serão roteadas com base nos parâmetros HTTP especificados no mapa de URL.

Neste exemplo, usamos 0.0.0.0 como o parâmetro de endereço, o que significa que o roteamento para o serviço é realizado apenas com base no nome do host HTTP e nos parâmetros de caminho.

Console

No Console do Cloud, o proxy de destino é combinado com a regra de encaminhamento. Quando você cria a regra de encaminhamento, o Google Cloud cria automaticamente um proxy HTTP de destino e o anexa ao mapa de URLs.

  1. Acesse a página do Traffic Director no Console do Cloud.

    Acessar a página do Traffic Director

  2. Na guia Mapas de regras de roteamento, clique em Criar mapa de regras de roteamento.

  3. Insira um nome.

  4. Clique em Adicionar regra de encaminhamento.

  5. Como nome da regra de encaminhamento, insira td-vm-forwarding-rule.

  6. Selecione sua rede.

  7. Selecione seu IP interno. O tráfego enviado para esse endereço IP é interceptado pelo proxy Envoy e enviado para o serviço apropriado de acordo com as regras de host e caminho.

    A regra de encaminhamento é criada como uma regra de encaminhamento global com load-balancing-scheme definido como INTERNAL_SELF_MANAGED.

  8. No campo IP personalizado, digite 10.0.0.1. Quando a VM envia esse endereço IP, o proxy do Envoy intercepta-o e o envia para o endpoint do serviço de back-end apropriado de acordo com as regras de gerenciamento de tráfego definidas no mapa de URL.

    Cada regra de encaminhamento em uma rede VPC precisa ter um endereço IP e uma porta exclusivos por rede VPC. Se você criar mais de uma regra de encaminhamento com o mesmo endereço IP e a mesma porta em uma determinada rede VPC, somente a primeira regra de encaminhamento será válida. Outros são ignorados. Se 10.0.0.1 não estiver disponível na sua rede, escolha um endereço IP diferente.

  9. Verifique se a Porta está definida como `80.

  10. Clique em Save.

  11. Na seção Regras de roteamento, selecione Regra simples de host e caminho.

  12. Na seção "Regras de host e caminho", selecione td-vm-service como o serviço.

  13. Clique em Adicionar host e regra de caminho.

  14. Em Hosts, insira hello-world.

  15. Em Serviço, selecione td-vm-service.

  16. Clique em Save.

gcloud

  1. Crie um mapa de URLs que use o serviço de back-end.

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. Crie uma correspondência de caminho do mapa de URL e uma regra de host para rotear o tráfego para o serviço com base no nome do host e em um caminho. Este exemplo usa service-test como o nome do serviço e uma correspondência de caminho padrão que corresponde a todas as solicitações de caminho para esse host (/*).

    gcloud compute url-maps add-path-matcher td-vm-url-map \
       --default-service td-vm-service --path-matcher-name td-vm-path-matcher
    
    gcloud compute url-maps add-host-rule td-vm-url-map --hosts service-test \
       --path-matcher-name td-vm-path-matcher
       --new-hosts hello-world
    
  3. Crie o proxy HTTP de destino.

    gcloud compute target-http-proxies create td-vm-proxy \
       --url-map td-vm-url-map
    
  4. Crie a regra de encaminhamento.

    A regra de encaminhamento precisa ser global e precisa ser criada com o valor de load-balancing-scheme definido como INTERNAL_SELF_MANAGED.

    gcloud compute forwarding-rules create td-vm-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=10.0.0.1 \
       --target-http-proxy=td-vm-proxy \
       --ports 80 \
       --network default
    

Neste ponto, o Traffic Director está configurado para balancear a carga do tráfego dos serviços especificados no mapa de URLs nos back-ends no grupo de instâncias gerenciadas.

Como verificar a configuração

Nesta parte final do guia de configuração do Traffic Director para VMs do Compute Engine, você testa se o tráfego enviado da VM cliente destinado à regra de encaminhamento VIP é interceptado e redirecionado ao proxy Envoy, que, em seguida, roteia sua solicitação para as VMs que hospedam o serviço Hello World.

Para fazer isso, faça login na VM cliente, que foi configurada para interceptar o tráfego e redirecioná-lo para o Envoy. Você envia uma solicitação curl ao VIP associado ao mapa de regras de roteamento. O Envoy inspeciona a solicitação curl, determina a qual serviço ele precisa resolver e a solicitação é enviada para um back-end associado a esse serviço.

  1. No Console do Cloud, acesse a página Grupos de instâncias.

    Acessar a página Grupos de instâncias

  2. Selecione o grupo de instâncias td-vm-mig-us-central1.
  3. Em Conectar, clique em SSH.
  4. Depois de fazer login na VM do cliente, use a ferramenta curl para enviar uma solicitação ao serviço Hello World por meio do Envoy:
curl -H "Host: hello-world" http://10.0.0.1/

Quando você emitir esse comando repetidamente, verá respostas HTML diferentes contendo os nomes do host dos back-ends no grupo de instâncias gerenciadas Hello World. Isso ocorre porque o Envoy usa o balanceamento de carga round robin, o algoritmo de balanceamento de carga padrão, ao enviar tráfego para os back-ends do serviço Hello World.

A seguir

Dependendo de como os microsserviços são distribuídos na sua rede, talvez seja necessário adicionar mais regras de encaminhamento ou mais regras de host e caminho ao mapa de URLs. Para mais informações sobre regras de encaminhamento e mapas de URL, leia os documentos a seguir:

Como verificar a configuração

Quando a configuração é concluída, cada VM do Compute Engine que tem um proxy sidecar pode acessar os serviços configurados no Traffic Director usando o protocolo HTTP.

Se você tiver seguido os exemplos específicos deste guia, usando o modelo de VM do Compute Engine com o servidor HTTP de demonstração e o nome do host do serviço service-test, use estas etapas para verificar a configuração.

  1. Faça login em um dos hosts de VM com um proxy sidecar instalado.
  2. Execute o comando curl -H 'Host: service-test' 10.0.0.1. Essa solicitação retorna o nome do host do back-end do grupo de instâncias gerenciadas que atendeu à solicitação.

Na etapa 2, observe que é possível usar qualquer endereço IP. Por exemplo, o comando curl -I -H 'Host: service-test' 1.2.3.4 funcionaria na etapa 2.

Isso ocorre porque a regra de encaminhamento tem o parâmetro de endereço definido como 0.0.0.0, que instrui o Traffic Director a corresponder com base no host definido no mapa de URL. Na configuração de exemplo, o nome do host é service-test.