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 a Cloud Service Mesh e os conceitos da malha de serviço e que determinam e configuram como o tráfego é gerenciado em uma implantação da Cloud Service Mesh.

O Cloud Service Mesh fornece recursos avançados de gerenciamento de tráfego que oferecem controle granular sobre como o tráfego é processado. O Cloud Service Mesh é compatível com os seguintes casos de uso:

  • Roteamento detalhado de solicitações para um ou mais serviços.
  • Divisão de tráfego com base no peso para distribuir tráfego em vários serviços.
  • Políticas de espelhamento de tráfego que enviam solicitações a um serviço de depuração e copiam para outro. O espelhamento de tráfego não é compatível com o recurso TCPRoute ou TLSRoute.
  • Distribuição de tráfego ajustada entre os back-ends de um serviço para melhor 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 Cloud Service Mesh 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 Cloud Service Mesh 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.
  • Recurso Gateway, que identifica proxies intermediários e representa o componente que detecta uma lista de pares de endereço IP:porta, encaminha tráfego e aplica políticas.
  • O recurso Route, que pode ser 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. Confira a seguir os 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 do Envoy para enviar solicitações HTTP, todos os recursos neste documento estã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 gRPC sem proxy. Quando você usa serviços ou aplicativos gRPC sem proxy com a Malha de serviços do Cloud, alguns dos recursos descritos neste documento não estão disponíveis.
  • Serviço de back-end, com o qual os recursos Route estão associados.

Configuração

Para configurar o gerenciamento de tráfego avançado, use os mesmos recursos de Route e serviços de back-end usados na configuração do Cloud Service Mesh. A Cloud Service Mesh, 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. Configure um recurso Mesh para identificar a malha de serviço.
  2. Configure os recursos 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 Cloud Service Mesh, o tráfego é roteado com base nos valores dos recursos Mesh, Route e do serviço de back-end. Todos os recursos de gerenciamento de tráfego avançado relacionados ao roteamento e às ações são configurados usando os objetos Route.

As seções a seguir descrevem os recursos avançados de gerenciamento de tráfego que podem ser configurados 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 de host na solicitação HTTP é comparado ao campo hostnames em cada recurso HTTPRoute ou GRPCRoute para selecionar o recurso Route correto para a solicitação. Somente os recursos HTTPRoute e GRPCRoute têm o campo hostnames.
      • O endereço IP é correspondido para rotear o tráfego TCP usando TCPPRoute.
      • A SNI e o ALPN são usados para a passagem de TLS usando TLSRoute.
      • Os recursos HTTPRoute e GRPCRoute associados a um Mesh ou a um Gateway precisam ter nomes de host exclusivos. Se você tentar anexar várias rotas com nomes de host conflitantes, a configuração será rejeitada.
      • Da mesma forma, o campo IP:Port do TCPRoute precisa ser exclusivo ou a configuração será rejeitada.
      • Da mesma forma, o SNI e o ALPN precisam ser exclusivos para o TLSRoute.
      • Se houver nomes de host sobrepostos, como a.example.com e *.example.com, a solicitação vai corresponder à rota mais específica.
    • Se você estiver usando o gRPC sem proxy:
      • Os clientes gRPC sem proxy usam o esquema de resolução de nome xds. Eles resolvem o hostname[:port] no URI de destino enviando uma solicitação para o Cloud Service Mesh.
      • 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 outras 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 Cloud Service Mesh oferece suporte a esquemas de roteamento simplificados e mais avançados. 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 que 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:

  • Um Mesh global
  • HTTPRoute ou GRPCRoute

A maior parte da configuração é feita no HTTPRoute. Depois de criar o mapa de regras de roteamento inicial, só é necessário 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 e rotear o tráfego quando ele for correspondido.
    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á roteada para o serviço especificado no RouteAction.

Para mais informações sobre os campos de recursos 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 no HTTPRoute ou GRPCRoute. Se o host de uma solicitação corresponder ao nome do host, o HTTPRoute ou GRPCRoute será avaliado.
  2. Depois que uma rota é selecionada, é possível aplicar ações.

Roteamento avançado

O roteamento avançado é semelhante ao roteamento simples descrito anteriormente, exceto que é 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 os parâmetros de host, caminho, cabeçalho e consulta com condições de correspondência, é possível criar regras altamente expressivas que atendam exatamente aos seus requisitos 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 Cloud Service Mesh, 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 Cloud Service Mesh.

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 Regrava a parte do nome do host e do caminho do URL ou ambas, antes de enviar uma solicitação ao serviço de back-end seleccionado.
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 faz novas tentativas das solicitações com falha, quanto tempo o balanceador 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, na sigla em inglês) processam as configurações para aplicar solicitações CORS.

Para mais informações sobre ações e como elas funcionam, consulte a página API Network Services.

Em cada regra de rota, é possível 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 host, caminho ou ambos do URL (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 podem aplicar ações diferentes com base na solicitação em processamento.

Distribuir o 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
Como distribuir 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 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 Cloud Service Mesh é compatível com quatro opções de afinidade da sessão: endereço IP do cliente, baseado em cookie HTTP, baseado em cabeçalho HTTP e afinidade de cookie gerado (que é gerado pelo próprio Cloud Service Mesh).

Hash consistente consistentHash Fornece afinidade de sessão suave com base em cabeçalhos HTTP, cookies ou outras propriedades.
Disjuntores circuitBreakers Define limites máximos no volume de conexões e solicitações por conexão para 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 diferentes opções de distribuição de tráfego e como elas funcionam, consulte os seguintes documentos:

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.

Confira mais exemplos, incluindo 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 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 Cloud Service Mesh 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 baseado 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 Cloud Service Mesh permite definir 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 Cloud Service Mesh.
Divisão de tráfego com base no peso da malha de serviço do Cloud (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 Cloud Service Mesh 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 Cloud Service Mesh.
Espelhamento de tráfego da Cloud Service Mesh (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 Cloud Service Mesh, é 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 Cloud Service Mesh.
Balanceamento de carga da Cloud Service Mesh (clique para ampliar)

Para mais informações sobre o balanceamento de carga com o Cloud Service Mesh, consulte Visão geral do balanceamento de carga avançado.

A seguir