Visão geral do gerenciamento de tráfego avançado

Este documento é destinado a administradores de malha ou plataforma e desenvolvedores de serviços que têm um nível intermediário ou avançado de familiaridade com o Traffic Director e os conceitos da malha de serviço e que determinam e configuram como o tráfego é gerenciado em uma implantação do Traffic Director. Este documento se aplica apenas às APIs de roteamento de serviço. Se a implantação do Traffic Director usar as APIs legadas de balanceamento de carga, consulte a Visão geral do gerenciamento de tráfego avançado para APIs de balanceamento de carga. Os recursos de balanceamento de carga global do Traffic Director estão disponíveis para você, independentemente da API usada.

O Traffic Director fornece recursos avançados de gerenciamento de tráfego que oferecem controle detalhado sobre como o tráfego é tratado. O Traffic Director é compatível com os seguintes casos de uso:

  • Roteamento de tráfego refinado de solicitações para um ou mais serviços.
  • Divisão de tráfego baseada em peso para distribuir o tráfego em vários serviços.
  • Políticas de espelhamento de tráfego que enviam solicitações para um serviço de depuração e cópias para outro. O espelhamento de tráfego não é compatível com o recurso TCPRoute ou TLSRoute.
  • Distribuição de tráfego ajustada nos back-ends de um serviço para melhorar o balanceamento de carga.

Esses recursos avançados de gerenciamento de tráfego permitem que você alcance seus objetivos de disponibilidade e desempenho. Um dos benefícios de usar o Traffic Director para esses casos de uso é que você pode atualizar a forma como o tráfego é gerenciado sem precisar modificar o código do aplicativo.

O gerenciamento de tráfego em uma malha de serviço do Traffic Director depende dos seguintes recursos:

  • Recurso Mesh, que identifica a malha de serviço e representa o componente responsável por encaminhar o tráfego e aplicar políticas. O recurso Mesh também identifica a porta de interceptação de tráfego.
  • Gateway, que identifica proxies intermediários e representa o componente que detecta em uma lista de pares endereço IP:porta, encaminha o tráfego e aplica políticas.
  • Route, que pode ser um de vários tipos e contém informações de roteamento de tráfego para a malha. Os recursos Route identificam nomes de host e portas que os clientes podem usar para rotear o tráfego para serviços de back-end.
  • Serviço de back-end, ao qual os recursos Route estão associados.

Veja a seguir os diferentes tipos de recursos Route:

  • HTTPRoute, que está disponível apenas em malhas que usam proxies Envoy. Quando você usa o recurso HTTPRoute para configurar os proxies Envoy para enviar solicitações HTTP, todos os recursos neste documento estarão disponíveis.
  • TCPRoute, que está disponível apenas em malhas que usam proxies Envoy.
  • TLSRoute, que está disponível apenas em malhas que usam proxies Envoy.
  • GRPCRoute, que está disponível em malhas que usam proxies sidecar do Envoy e o gRPC sem proxy. Quando você usa serviços ou aplicativos gRPC sem proxy com o Traffic Director, alguns dos recursos descritos neste documento não estão disponíveis.

Configuração

Para configurar o gerenciamento de tráfego avançado, use os mesmos recursos de Route e de serviços de back-end usados ao configurar o Traffic Director. O Traffic Director, por sua vez, configura seus proxies Envoy e aplicativos gRPC sem proxy para aplicar as políticas avançadas de gerenciamento de tráfego que você configurou.

Em geral, você faz o seguinte:

  1. Configurar um recurso Mesh para identificar a malha de serviço.
  2. Configure os recursos de Route para fazer o seguinte, com base nas características da solicitação de saída:

    1. Selecione o serviço de back-end para onde as solicitações são roteadas.

    2. Opcionalmente, realize outras ações.

  3. Configure o serviço (back-end) para controlar como o tráfego é distribuído para back-ends e endpoints depois que um serviço de destino é selecionado.

Roteamento de tráfego e ações

No Traffic Director, o tráfego é roteado com base nos valores dos recursos Mesh, Route e serviço de back-end. Todos os recursos avançados de gerenciamento de tráfego relacionados ao roteamento e às ações são configurados usando os objetos Route.

As seções a seguir descrevem os recursos de gerenciamento de tráfego avançado que você configura nos objetos Route.

Processamento de solicitações

Quando um cliente envia uma solicitação, ela é tratada conforme descrito nas etapas a seguir:

  1. A solicitação corresponde a um recurso Route específico da seguinte maneira:

    • Se você estiver usando o Envoy:
      • O cabeçalho do host na solicitação HTTP corresponde ao campo hostnames em cada recurso HTTPRoute ou GRPCRoute para selecionar o recurso Route correto para a solicitação. Apenas os recursos HTTPRoute e GRPCRoute têm o campo hostnames.
      • É feita a correspondência do endereço IP para rotear o tráfego TCP usando TCPPRoute.
      • SNI e ALPN são usados para a passagem de TLS com TLSRoute.
      • Os recursos HTTPRoute e GRPCRoute associados a Mesh ou Gateway precisam ter nomes de host exclusivos. Se você tentar anexar várias rotas com nomes de host conflitantes, a configuração será recusada.
      • Da mesma forma, o campo IP:Port do TCPRoute precisa ser exclusivo, ou a configuração será rejeitada.
      • Da mesma forma, SNI e ALPN precisam ser exclusivos para TLSRoute.
      • Se houver nomes de host sobrepostos, como a.example.com e *.example.com, a solicitação corresponderá à rota mais específica.
    • Se você estiver usando gRPC sem proxy:
      • Os clientes gRPC sem proxy usam o esquema de resolução de nomes xds. Eles resolvem o hostname[:port] no URI de destino enviando uma solicitação ao Traffic Director.
      • Somente a porta de um recurso GRPCRoute é comparada à porta no URI de destino (por exemplo, xds:///example.hostname:8080). O URI de destino precisa corresponder exatamente à string no campo hostnames do GRPCRoute.
  2. O recurso Route pode conter mais informações e regras de roteamento.

  3. Depois que o serviço de back-end de destino é selecionado, o tráfego é distribuído entre os back-ends ou endpoints desse serviço de back-end, de acordo com a configuração do recurso do serviço de back-end.

A segunda etapa é descrita na seção a seguir, Roteamento simples com base no host e no caminho. A terceira etapa é discutida em Roteamento e ações avançados.

Roteamento simples com base no host e no caminho

O Traffic Director é compatível com os esquemas de roteamento simplificados e com um mais avançado. No esquema simples, você especifica um host e, opcionalmente, um caminho. O host e o caminho da solicitação são avaliados para determinar o serviço de back-end para o qual a solicitação é roteada.

  • O host da solicitação é a parte do nome de domínio de um URL. Por exemplo, a parte do host do URL http://example.com/video/ é example.com.
  • O caminho da solicitação é a parte do URL que segue o nome do host. Por exemplo, a parte do caminho do URL http://example.com/video/ é /video.

Você configura o roteamento simples com base no host e no caminho no mapa de regras de roteamento, que consiste no seguinte:

  • Uma Mesh global
  • Uma HTTPRoute ou uma GRPCRoute

A maior parte da configuração é feita no HTTPRoute. Depois de criar o mapa de regras de roteamento inicial, você só precisa modificar o recurso HTTPRoute.

A regra mais simples é uma regra padrão, em que você especifica apenas uma regra de host curinga (*) e uma correspondência de caminho com um serviço padrão. Depois de criar a regra padrão, é possível adicionar outras regras para especificar diferentes hosts e caminhos. As solicitações de saída são avaliadas de acordo com essas regras, da seguinte maneira:

  • Se o host de uma solicitação (como example.com) corresponder ao nome do host de HTTPRoute:

    1. O RouteRule é avaliado em seguida. O RouteRule especifica como corresponder o tráfego e como rotear o tráfego quando ele tiver correspondência.
    2. Cada RouteRule contém uma ou mais correspondências de rota que são avaliadas em relação ao caminho da solicitação.
    3. Se uma correspondência for encontrada, a solicitação será encaminhada para o serviço especificado no RouteAction.

Para mais informações sobre os campos de recurso do HTTPRoute e como eles funcionam, consulte a documentação da API de serviço de rede.

Roteamento avançado e ações

Se você quiser fazer mais do que encaminhar uma solicitação com base no host e no caminho dela, poderá configurar regras avançadas para rotear solicitações e realizar ações.

De modo geral, o roteamento avançado e as ações funcionam da seguinte maneira:

  1. Assim como no roteamento simples, o host da solicitação é comparado às regras de host que você configura em HTTPRoute ou GRPCRoute. Se o host de uma solicitação corresponder ao nome do host, o HTTPRoute ou o GRPCRoute será avaliado.
  2. Depois de selecionar uma rota, você poderá aplicar ações.

Roteamento avançado

O roteamento avançado é semelhante ao roteamento simples descrito anteriormente, mas é possível especificar outras condições de correspondência. Por exemplo, é possível especificar que uma regra corresponderá ao cabeçalho de uma solicitação se o nome do cabeçalho corresponder exatamente ou apenas parcialmente, por exemplo, com base no prefixo ou no sufixo. A correspondência pode ser feita com base na avaliação do nome do cabeçalho com uma expressão regular ou em outros critérios, como a verificação da presença de um cabeçalho.

Para mais condições de correspondência e detalhes para headerMatches e queryParameterMatches, consulte a página API REST network services.

Ao combinar parâmetros de host, caminho, cabeçalho e consulta com condições de correspondência, é possível criar regras altamente expressivas que atendam aos seus requisitos exatos de gerenciamento de tráfego. Veja mais detalhes na tabela a seguir.

Aplicativo baseado em HTTP Aplicativo baseado em gRPC
Hosts HTTP versus hosts gRPC

O host é a parte do nome de domínio do URL que o aplicativo chama.

Por exemplo, a parte do host do URL http://example.com/video/ é example.com.

O host é o nome que um cliente usa no URI do canal para se conectar a um serviço específico.

Por exemplo, a parte do host do URI do canal xds:///example.com é example.com.

Caminhos HTTP versus caminhos gRPC

O caminho é a parte do URL que segue o nome do host.

Por exemplo, a parte do caminho do URL http://example.com/video é /video.

O caminho está no cabeçalho :path da solicitação HTTP/2 e é semelhante a /SERVICE_NAME/METHOD_NAME.

Por exemplo, se você chamar o método Download no serviço gRPC Example, o conteúdo do cabeçalho :path será semelhante a /Example/Download.

Outros cabeçalhos gRPC (metadados) O gRPC é compatível com o envio de metadados entre o cliente gRPC e o servidor gRPC para fornecer outras informações sobre uma chamada RPC. Esses metadados estão na forma de pares de chave-valor, transferidos como cabeçalhos na solicitação HTTP/2.

Ações

Com o Traffic Director, você especifica as ações que seus proxies Envoy ou aplicativos gRPC sem proxy realizam ao processar uma solicitação. As ações a seguir podem ser configuradas com o Traffic Director.

Ação Nome do campo da API Descrição
Redirecionamentos redirect [pathredirect?] Retorna um código de resposta 3xx configurável. Ele também define o cabeçalho de resposta Location com o URI apropriado, substituindo o host e o caminho, conforme especificado na ação de redirecionamento.
Regravações de URL urlRewrite Reescreve a parte do nome do host do URL, a parte do caminho do URL ou ambas, antes de enviar uma solicitação ao serviço de back-end selecionado.
Transformações de cabeçalho requestHeaderModifier/responseHeaderModifier? Adiciona e remove cabeçalhos antes de enviar uma solicitação ao serviço de back-end. Também é possível adicionar ou remover cabeçalhos de resposta depois de receber uma resposta do serviço de back-end.
Espelhamento do tráfego requestMirrorPolicy

Além de encaminhar a solicitação ao serviço de back-end selecionado, envia outra idêntica ao serviço de back-end de espelhamento configurado, de forma autônoma. O balanceador de carga não espera uma resposta do back-end a que envia a solicitação espelhada.

O espelhamento é útil para testar uma nova versão de um serviço de back-end. Ele pode ser usado também para depurar erros de produção em uma versão de depuração do serviço de back-end, mas não em uma versão de produção.

Divisão de tráfego baseada no peso weiDestination.serviceNameght

Permite que o tráfego de uma regra correspondente seja distribuído a vários serviços de back-end, de maneira proporcional a um peso definido pelo usuário e atribuído ao serviço de back-end individual.

Esse recurso é útil para configurar implantações em estágios ou testes A/B. Por exemplo, a ação de rota pode ser configurada para que 99% do tráfego seja enviado a um serviço que executa uma versão estável de umaplicativo. Já 1% do tráfego é enviado a um serviço separado que executa uma versão mais recente desse aplicativo.

Novas tentativas retryPolicy Configura as condições em que o balanceador de carga repete solicitações com falha, quanto tempo o balanceador de carga aguarda antes de tentar novamente e o número máximo de novas tentativas permitidas.
Tempo limite timeout Especifica o tempo limite da rota selecionada. Ele é calculado com base no momento entre o processamento total da solicitação e da resposta. O tempo limite inclui todas as novas tentativas.
Injeção de falha faultInjectionPolicy Insere erros ao atender às solicitações para simular falhas, incluindo alta latência, sobrecarga, de serviço, falhas de serviço e particionamento de rede. Esse recurso é útil para testar a resiliência de um serviço a falhas simuladas.
Políticas de segurança corsPolicy As políticas de compartilhamento de recursos entre origens (CORS) gerenciam as configurações para aplicar solicitações CORS.

Para mais informações sobre ações e como elas funcionam, consulte a página da API de serviços de rede.

Em cada regra de rota, você pode especificar uma das seguintes ações de rota:

  • Encaminhar o tráfego para um único serviço (destination.serviceName)
  • Dividir o tráfego entre vários serviços (destination.weight)
  • URLs de redirecionamento (redirect)

Além disso, é possível combinar qualquer uma das ações de rota mencionadas anteriormente a uma ou mais destas, chamadas de ações de complemento no Console do Cloud:

  • Manipular cabeçalhos de solicitação ou resposta (requestHeaderModifier/responseHeaderModifier)
  • Espelhar tráfego (requestMirrorPolicy)
  • Reescrever o host do URL, o caminho ou ambos (urlRewrite)
  • Tentar novamente solicitações com falha (retryPolicy)
  • Definir tempo limite (timeout).
  • Inserir falhas em um percentual do tráfego (faultInjectionPolicy).
  • Adicionar política de CORS (corsPolicy).

Como as ações estão associadas a regras específicas, o proxy Envoy ou o aplicativo gRPC sem proxy pode aplicar ações diferentes com base na solicitação que está processando.

Como distribuir tráfego entre os back-ends de um serviço

Conforme mencionado em Processamento de solicitações, quando um cliente gerencia uma solicitação de saída, primeiro ele seleciona um serviço de destino. Depois disso, ele precisa descobrir qual back-end ou endpoint deve receber a solicitação.

Distribuição de tráfego entre back-ends
Distribuição de tráfego entre back-ends (clique para ampliar)

No diagrama anterior, Regra foi simplificada. Em geral, Regra é uma regra de host, uma correspondência de caminho e uma ou mais regras de caminho ou rota. O serviço de destino é o Serviço de back-end. Backend 1, , e Backend n recebem e processam a solicitação. Esses back-ends podem ser, por exemplo, instâncias de máquina virtual (VM) do Compute Engine que hospedam o código do aplicativo do lado do servidor.

Por padrão, o cliente que gerencia a solicitação envia solicitações para o back-end íntegro mais próximo que tenha capacidade. Para evitar a sobrecarga de um back-end específico, ele usa o algoritmo de balanceamento de carga round-robin para balancear solicitações subsequentes em outros back-ends do serviço de destino. Em alguns casos, convém ter um controle mais refinado sobre esse comportamento.

Balanceamento de carga, afinidade da sessão e proteção de back-ends

É possível definir as seguintes políticas de distribuição de tráfego em cada serviço.

Política Nome do campo da API Descrição
Modo de balanceamento de carga balancingMode Controla como um grupo de endpoints de rede (NEG, na sigla em inglês) ou um grupo de instâncias gerenciadas (MIG, na sigla em inglês) é selecionado após a seleção de um serviço de destino. É possível configurar o modo de balanceamento para distribuir a carga com base em conexões simultâneas e taxa de solicitação.
Política de balanceamento de carga localityLbPolicy Define o algoritmo de balanceamento de carga usado para distribuir o tráfego entre back-ends em um NEG ou MIG. Para otimizar o desempenho, é possível escolher entre vários algoritmos, como "round robin" ou "menor solicitação".
Afinidade da sessão sessionAffinity

Fornece uma tentativa de melhor esforço para enviar solicitações de um cliente específico ao mesmo back-end enquanto ele estiver íntegro e tiver capacidade.

O Traffic Director é compatível com quatro opções de afinidade de sessão: endereço IP do cliente, baseado em cookie HTTP, base de cabeçalho HTTP e afinidade de cookie gerada (que é gerada pelo próprio Traffic Director).

Hash consistente consistentHash Fornece afinidade de sessão suave com base em cabeçalhos HTTP, cookies ou outras propriedades.
Disjuntores circuitBreakers Define limites superiores para o volume de conexões e solicitações por conexão com um serviço de back-end.
Detecção de outlier outlierDetection Especifica os critérios para (1) remover back-ends não íntegros ou endpoints de MIGs ou NEGs e (2) adicionar um back-end ou endpoint de volta quando ele é considerado íntegro o suficiente para receber tráfego novamente. A verificação de integridade associada ao serviço determina se um back-end ou endpoint é considerado íntegro.

Para mais informações sobre as diferentes opções de distribuição de tráfego e como elas funcionam, consulte a página API REST backendServices e a Visão geral dos serviços de back-end.

Exemplos de casos de uso

O gerenciamento de tráfego avançado atende a muitos casos de uso. Nesta seção, você verá alguns exemplos detalhados.

Veja mais exemplos, incluindo o código de amostra, em Configurar o gerenciamento de tráfego avançado com o Envoy e Configurar o gerenciamento de tráfego avançado com serviços do gRPC sem proxy.

Roteamento de tráfego detalhado para personalização

Você pode rotear o tráfego para um serviço com base nos parâmetros da solicitação. Por exemplo, é possível usar esse serviço para fornecer uma experiência mais personalizada para usuários do Android. No diagrama a seguir, o Traffic Director configura a malha de serviço para enviar solicitações com o cabeçalho user-agent:Android para o serviço Android, em vez do serviço genérico.

Roteamento baseado no cabeçalho do user agent definido como Android.
Roteamento com base no cabeçalho user-agent definido como Android (clique para ampliar)

Divisão de tráfego baseada em peso para implantações mais seguras

A implantação de uma nova versão de um serviço de produção atual pode ser arriscada. Mesmo depois que os testes forem aprovados em um ambiente de teste, talvez você não queira encaminhar imediatamente todos os usuários para a nova versão.

O Traffic Director permite que você defina divisões de tráfego com base no peso para distribuir o tráfego entre vários serviços. Por exemplo, é possível enviar 1% do tráfego para a nova versão do seu serviço, monitorar se tudo funciona e aumentar gradualmente a proporção de tráfego para o novo serviço.

Divisão de tráfego com base no peso do Traffic Director.
Divisão de tráfego baseada em peso do Traffic Director (clique para ampliar)

Espelhamento de tráfego para depuração

Ao depurar um problema, pode ser útil enviar cópias do tráfego de produção para um serviço de depuração. O Traffic Director permite configurar políticas de espelhamento de solicitações para que as solicitações sejam enviadas a um serviço e as cópias dessas solicitações sejam enviadas para outro serviço.

Espelhamento de tráfego do Traffic Director.
Espelhamento de tráfego do Traffic Director (clique para ampliar)

Balanceamento de carga ajustado para desempenho

Dependendo das características do seu aplicativo, você pode melhorar o desempenho e a disponibilidade ajustando o modo como o tráfego é distribuído entre os back-ends de um serviço. Com o Traffic Director, é possível aplicar algoritmos avançados de balanceamento de carga para que o tráfego seja distribuído de acordo com suas necessidades.

O diagrama a seguir, em contraste com os diagramas anteriores, mostra um serviço de backend de destino (Serviço de produção) e os back-ends dele (Máquina virtual 1, Máquina virtual 2, Máquina Virtual 3). Com o gerenciamento de tráfego avançado, é possível configurar como um serviço de back-end de destino é selecionado e como o tráfego é distribuído entre os back-ends desse serviço de destino.

Balanceamento de carga do Traffic Director
Balanceamento de carga do Traffic Director (clique para ampliar)

A seguir