As extensões de serviço permitem fazer uma frase de destaque de proxies de rede. As extensões de frase de destaque são compatíveis com a maioria dos balanceadores de carga de aplicativo. Elas também são compatíveis com Secure Web Proxy (em pré-lançamento).
Fluxo de dados de frases de destaque
Um proxy de rede se comunica com uma frase de destaque usando um dos seguintes protocolos gRPC do Envoy:
O protocolo de processamento externo ou
ext_proc.Esse protocolo é compatível com extensões de rota, tráfego e autorização e é usado por padrão.
O protocolo
ext_procpermite que o serviço de extensão responda a eventos no ciclo de vida de uma solicitação HTTP examinando e modificando os cabeçalhos ou o corpo da solicitação.O protocolo de autorização externa ou
ext_authz.Esse protocolo é compatível apenas com extensões de autorização. O suporte para
ext_authzestá em pré-lançamento.O protocolo
ext_authzdelega decisões de autorização para solicitações recebidas a um serviço externo e independente. Essa API permite que o serviço de extensão responda a eventos no ciclo de vida de uma solicitação HTTP para uma decisão de autorização complexa, examinando os cabeçalhos ou metadados da solicitação.É possível especificar esse protocolo com a opção
wireFormatao configurar uma extensão de autorização.
É possível implantar esses serviços de extensão em instâncias de máquina virtual (VM) ou no GKE e configurar um grupo de instâncias ou um grupo de endpoints de rede (NEG) para representar os endpoints desses serviços.
Exemplo de cenário de implantação
O diagrama a seguir mostra um exemplo de cenário de implantação. É possível implantar o serviço de back-end de frase de destaque com um servidor gRPC em um recurso de computação gerenciado pelo usuário, como uma instância de VM ou um cluster do Google Kubernetes Engine (GKE), e representá-lo para o balanceador de carga como um serviço de back-end normal.
Como as frases de destaque funcionam com ext_proc
Confira a seguir uma versão abreviada da API gRPC ext_proc.
// The gRPC API to be implemented by the external processing server service ExternalProcessor { rpc Process(stream ProcessingRequest) returns (stream ProcessingResponse) { } } // Envoy sets one of these fields depending on the processing stage. message ProcessingRequest { oneof request { HttpHeaders request_headers = 2; HttpHeaders response_headers = 3; HttpBody request_body = 4; HttpBody response_body = 5; } } message ProcessingResponse { oneof response { HeadersResponse request_headers = 1; HeadersResponse response_headers = 2; BodyResponse request_body = 3; BodyResponse response_body = 4; ImmediateResponse immediate_response = 7; } }
Depois de receber os cabeçalhos de uma solicitação HTTP, os proxies do balanceador de carga de aplicativo e do Secure Web Proxy enviam a mensagem ProcessingRequest para o serviço de extensão com o campo request_headers definido como os cabeçalhos HTTP do cliente.
O serviço de extensão precisa responder à mensagem ProcessingRequest com uma mensagem ProcessingResponse correspondente que contenha todas as mudanças configuradas nos cabeçalhos ou no corpo da mensagem ProcessingRequest. Como alternativa, o serviço pode definir o campo immediate_response para fazer com que o proxy de rede encerre o processamento da solicitação e envie a resposta especificada de volta ao cliente.
Para eventos REQUEST_HEADER e RESPONSE_HEADER, o serviço de extensão pode manipular os cabeçalhos HTTP na solicitação ou resposta. O serviço pode adicionar, modificar ou excluir cabeçalhos definindo o campo request_headers ou response_headers na mensagem ProcessingResponse de maneira adequada. Use o campo raw_value para cabeçalhos.
As extensões de tráfego permitem mudar os cabeçalhos e o corpo das solicitações e respostas. O servidor de extensão pode substituir o modo de processamento de forma dinâmica e permitir que ele ative ou desative a extensão para as fases subsequentes do processamento de solicitações. Os balanceadores de carga não reavaliam as regras de rota depois de chamar uma extensão de tráfego.
As extensões de borda, autorização e rota oferecem suporte apenas a cabeçalhos HTTP. Essas extensões não podem inspecionar ou alterar corpos HTTP.
Para extensões de rota e tráfego, as frases de destaque podem ser executadas de forma assíncrona quando
observabilityMode para a extensão é definido como true e o modo de processamento do corpo
é STREAMED (padrão). As chamadas para o back-end de extensão são realizadas de forma assíncrona, sem pausar o processamento da solicitação em andamento.
As respostas, se houver, são ignoradas.
Como as frases de destaque funcionam com ext_authz
A API ext_authz oferece suporte apenas a extensões de frase de destaque de autorização.
Confira a seguir uma versão abreviada da API.
// A generic interface for performing authorization checks on incoming // requests to a networked service. service Authorization { // Performs an authorization check based on the attributes associated with // the incoming request and return status. rpc Check(CheckRequest) returns (CheckResponse) { } } message CheckRequest { // The request attributes. AttributeContext attributes = 1; } message CheckResponse { google.rpc.Status status = 1; oneof http_response { DeniedHttpResponse denied_response = 2; OkHttpResponse ok_response = 3; } google.protobuf.Struct dynamic_metadata = 4; }
Depois de receber os cabeçalhos de uma solicitação HTTP, o balanceador de carga envia a mensagem CheckRequest para o serviço de extensão.
O serviço de extensão precisa responder à mensagem CheckRequest com uma mensagem CheckResponse correspondente que contenha as seguintes informações:
status: indica o status.OKindica que a solicitação é permitida. Qualquer outro status indica que a solicitação foi negada.denied_responseouok_response: indica se a resposta é permitida ou negada. Esse campo é acompanhado pelos atributos de resposta HTTP relacionados para uma verificação de autorização.O campo
ok_responseé usado quando o serviço de autorização permite a solicitação. O serviço pode modificar, adicionar ou remover qualquer cabeçalho de solicitação original e atualizar os cabeçalhos de resposta HTTP enviados ao cliente. Use o camporaw_valuepara cabeçalhos.O campo
denied_responseé usado quando o serviço de autorização nega a solicitação. O serviço pode atualizar os cabeçalhos de resposta HTTP enviados ao cliente.
Se o serviço de extensão retornar um nome ou valor de cabeçalho não permitido pela mensagem
CheckResponse, a solicitação será rejeitada com o código de status500 Internal Error. Para informações sobre cabeçalhos não permitidos, consulte Limitações com a manipulação de cabeçalhos.dynamic_metadata: inclui metadados opcionais para uso por extensões chamadas após a extensão de autorização, como extensões de tráfego.
Modos de processamento do corpo
Para extensões que oferecem suporte ao processamento do corpo, é possível configurar um dos dois modos de envio a seguir para o processamento do corpo da solicitação e da resposta, definindo o valor dos campos request_body_send_mode ou response_body_send_mode, respectivamente.
O modo padrão é STREAMED, recomendado para a maioria dos casos de uso.
| Modo | Descrição | Eventos aceitos necessários | Extensões aceitas |
|---|---|---|---|
STREAMED
|
As chamadas são executadas no modo de streaming. Essa configuração padrão também é usada se o modo não estiver definido. O proxy envia blocos de corpo para o serviço de extensão e espera uma única resposta por bloco. A extensão pode enviar blocos modificados de volta, reconhecer blocos sem alterações ou excluir blocos. O proxy envia apenas uma quantidade limitada de dados por vez. Portanto, o serviço de extensão precisa reconhecer os blocos o mais rápido possível. Embora o modo de corpo não possa ser alterado dinamicamente, um servidor de extensão avançado
pode selecionar dinamicamente os eventos HTTP futuros a serem recebidos.
Ao retornar a opção |
Precisa incluir REQUEST_BODY para solicitações ou
RESPONSE_BODY para respostas. |
Extensões de tráfego (para solicitações e respostas). |
FULL_DUPLEX_STREAMED |
As chamadas são executadas no modo full duplex. O proxy envia blocos à medida que chegam e não os armazena em buffer. Como não há buffer, o proxy é menos sensível à latência de extensão. O proxy pode receber quantos blocos de resposta forem necessários. Os blocos de resposta são desconectados dos blocos enviados pelo proxy. Os blocos subsequentes são enviados para processamento à medida que chegam ao proxy, sem esperar que os blocos e eventos anteriores sejam totalmente processados. A extensão pode armazenar em buffer, modificar e reagrupar livremente o conteúdo do corpo. Se a extensão não enviar o conteúdo do corpo de volta, a próxima extensão na cadeia vai receber um corpo vazio. A opção |
Precisa incluir REQUEST_BODY e REQUEST_TRAILERS
para solicitações ou RESPONSE_BODY e RESPONSE_TRAILERS
para respostas. |
Extensões de tráfego (para solicitações e respostas).
Extensões de rota (para solicitações). |
Back-ends aceitos para serviços de back-end de frase de destaque gerenciados pelo usuário
É possível hospedar extensões de frase de destaque gerenciadas pelo usuário em um serviço de back-end que usa um dos seguintes tipos de back-ends que executam serviços gRPC do Envoy:
- Todos os back-ends de grupos de instâncias gerenciados e não gerenciados
- Todos os NEGs por zona
- Todos os NEGs de conectividade híbrida
- NEGs do Private Service Connect que apontam para serviços de VPC
- NEGs sem servidor que apontam para serviços do Cloud Run
Otimizações recomendadas para frases de destaque
A integração de uma extensão ao caminho de processamento gera latência adicional para solicitações e respostas. Cada tipo de dado processado pelo serviço de extensão, incluindo cabeçalhos de solicitação, corpo da solicitação, cabeçalhos de resposta e corpo da resposta, conforme aplicável, adiciona latência.
Considere as seguintes otimizações para minimizar a latência:
Implante frases de destaque nas mesmas zonas que o serviço de back-end de destino normal para o proxy.
Ao usar um balanceador de carga de aplicativo interno entre regiões, coloque os back-ends do serviço de extensão na mesma região que as sub-redes somente proxy do balanceador de carga.
Ao usar um balanceador de carga de aplicativo externo global, coloque os back-ends do serviço de frase de destaque nas regiões geográficas em que as VMs de destino, as cargas de trabalho do GKE e as funções do Cloud Run do balanceador de carga normal estão localizadas.
Quando possível, configure a extensão para processar apenas os dados necessários. Por exemplo, para modificar apenas os cabeçalhos de solicitação para extensões de rota e tráfego, defina o campo
supported_eventsna extensão comoREQUEST_HEADERS.
Limitações das frases de destaque
Esta seção lista algumas limitações das frases de destaque.
Limitações com a manipulação de cabeçalhos
Não é possível mudar alguns cabeçalhos. Confira a seguir as limitações da manipulação de cabeçalhos:
A manipulação de cabeçalhos não é aceita para os seguintes cabeçalhos:
X-user-IPCDN-Loop- Cabeçalhos que começam com
X-Forwarded,X-Google,X-GFEouX-Amz- connectionkeep-alivetransfer-encoding,teupgradeproxy-connection,proxy-authenticate,proxy-authorizationtrailers
Para extensões de tráfego e autorização, a manipulação de cabeçalhos também não é aceita para estes:
:method,:authority,:schemeou cabeçalhos de host.Quando um servidor gRPC especifica valores de cabeçalho em
HeaderMutation, o campovalueé ignorado.
Limitações com o processamento do corpo
Confira a seguir as limitações com clientes e back-ends HTTP/1.1 em relação ao corpo da mensagem, que é aplicável a ext_proc, mas não a ext_authz.
Ao configurar
REQUEST_BODYouRESPONSE_BODYpara uma extensão, se o proxy receber uma solicitação correspondente, ele vai remover o cabeçalhoContent-Lengthda resposta e mudar para a codificação de corpo em blocos.Ao transmitir um corpo da mensagem para o servidor
ext_proc, no final, o proxy poderá enviar uma mensagemProcessingRequestde cauda com um corpo vazio comend_streamdefinido comotruepara indicar que o fluxo terminou.
Outras limitações
Confira a seguir as limitações com mensagens de resposta gRPC:
O tamanho máximo de uma mensagem de resposta é de 128 KB. Se uma mensagem recebida estiver acima desse limite, o fluxo será fechado com um erro
RESOURCE_EXHAUSTED.O serviço de back-end de frase de destaque não pode usar políticas do Cloud Armor, do IAP ou do Cloud CDN.
O serviço de back-end de frase de destaque precisa usar HTTP/2 como protocolo.
Para extensões de autorização, o balanceador de carga não encaminha nenhum corpo de solicitação para o serviço de back-end de frase de destaque.
Para extensões de rota, o serviço de back-end de frase de destaque não pode substituir o modo de processamento do fluxo
ext_proc.
A seguir
Configurar um serviço de back-end de frase de destaque gerenciado pelo usuário
Um serviço de back-end de frase de destaque é um pré-requisito para configurar extensões de rota, autorização e tráfego gerenciadas pelo usuário usando frases de destaque.