Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Personalizar cabeçalhos de requisição e resposta usando o CRD EnvoyFilter

Última atualização: Jun 28, 2026

Personalize cabeçalhos de requisição e resposta por meio do CustomResourceDefinition (CRD) EnvoyFilter. Esse CRD permite modifique diretamente a configuração de um proxy Istio (Envoy). Assim, é possível adicionar, exclua ou alterar cabeçalhos de requisição ou resposta conforme o tráfego passa pelo proxy.

Pré-requisitos

A aplicação HTTPBin deve estar implantada. Para mais informações, consulte Implantar a aplicação HTTPBin.

Etapa 1: defina um modelo de filtro Envoy

O ASM permite crie filtros Envoy com base em modelos. Um único modelo serve para gerar múltiplos filtros, aplicáveis a diferentes workloads e namespaces. Essa abordagem torna as configurações reutilizáveis e aumenta a eficiência do gerenciamento.

O código yaml abaixo exemplifica um modelo de filtro Envoy. Para mais detalhes, consulte Envoy Filter.

Expandir para visualize o código yaml do modelo de filtro Envoy

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-header-filter
  namespace: my-namespace
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: envoy.filters.network.http_connection_manager
              subFilter:
                name: envoy.filters.http.router
        proxy:
          proxyVersion: ^1\.20.*
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inlineCode: |
              function envoy_on_request(request_handle)
                -- Obtain a header key and a value from the request header. 
                local header_key = "x-custom-request-header" -- The key of the request header you want to obtain. 
                local header_value = request_handle:headers():get(header_key)
                if header_value then
                  -- Write data to Otel Baggage.
                  local baggage = header_key .. "=" .. header_value
                  request_handle:headers():add("baggage", baggage)
                  request_handle:streamInfo():dynamicMetadata():set("envoy.filters.http.lua", "otel.baggage", baggage)
                end
              end

              function envoy_on_response(response_handle)
                -- Obtain the Otel Baggage from the dynamic metadata. 
                local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.lua") or {}
                local baggage = metadata["otel.baggage"]
                if baggage then
                  -- Write the Otel Baggage to another header. 
                  local new_header_key = "x-custom-response-header" -- The key of the new response header. 
                  response_handle:headers():add(new_header_key, baggage)
                end
              end
  workloadSelector:
    labels:
      app: httpbin
      version: v1
  • Se usar o Istio 1.9 ou posterior, substitua o valor do campo proxyVersion pela versão correspondente do Istio.

  • Se usar o Istio 1.8 ou anterior, substitua o valor do campo proxyVersion pela versão do Istio instalada. Além disso, no código yaml acima, substitua envoy.filters.network.http_connection_manager por envoy.http_connection_manager, envoy.filters.http.router por envoy.router e type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua por type.googleapis.com/envoy.config.filter.http.lua.v2.Lua.

Etapa 2: crie um filtro Envoy a partir do modelo

Após defina o modelo, vincule-o aos workloads ou namespaces desejados. Dessa forma, os filtros gerados afetam apenas os recursos especificados. O ASM cria automaticamente os filtros Envoy com base no modelo assim que a associação é estabelecida.

O filtro criado adiciona um cabeçalho de requisição personalizado à requisição que entra no workload e um cabeçalho de resposta personalizado à resposta que será enviada pelo workload. No exemplo a seguir, cria-se um filtro chamado custom-header-filter e configura-se um filtro Lua para adicionar cabeçalhos de requisição e resposta. O filtro Envoy entra em vigor para todos os workloads com o rótulo app: my-app.

Expandir para visualize o código yaml do filtro Envoy

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-header-filter
  namespace: my-namespace
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: envoy.filters.network.http_connection_manager
              subFilter:
                name: envoy.filters.http.router
        proxy:
          proxyVersion: ^1\.20.*
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
            inlineCode: |
              function envoy_on_request(request_handle)
                -- Obtain a header key and a value from the request header.
                local header_key = "x-custom-request-header" -- the key of the request header you want to obtain. 
                local header_value = request_handle:headers():get(header_key)
                if header_value then
                  -- Write data to Otel Baggage. 
                  local baggage = header_key .. "=" .. header_value
                  request_handle:headers():add("baggage", baggage)
                  request_handle:streamInfo():dynamicMetadata():set("envoy.filters.http.lua", "otel.baggage", baggage)
                end
              end

              function envoy_on_response(response_handle)
                -- Obtain the Otel Baggage from the dynamic metadata. 
                local metadata = response_handle:streamInfo():dynamicMetadata():get("envoy.filters.http.lua") or {}
                local baggage = metadata["otel.baggage"]
                if baggage then
                  -- Write the Otel Baggage to another header. 
                  local new_header_key = "x-custom-response-header" -- The key of the new response header. 
                  response_handle:headers():add(new_header_key, baggage)
                end
              end
  workloadSelector:
    labels:
      app: httpbin
      version: v1
Importante

O EnvoyFilter é um método de configuração poderoso, mas complexo, pois modifique diretamente as configurações subjacentes do Envoy. Portanto, ao usar o EnvoyFilter, recomendamos familiarizar-se com o modelo de configuração do Envoy e aplicar alterações com cautela para evitar erros potenciais. Além disso, a configuração do EnvoyFilter pode mudar com a atualização das versões do Istio. Atenção às questões de compatibilidade.

Etapa 3: visualize cabeçalhos personalizados nos logs de acesso

O ASM permite personalizar formatos de log. As expressões personalizadas dos logs de acesso podem obter valores de cabeçalhos de requisição, cabeçalhos de resposta e valores internos do Envoy. Para mais informações, consulte Personalizar o formato dos logs de acesso.

A tabela a seguir lista três novos campos usados para exibir conteúdo nos logs de acesso.

Campo

Tipo

Valor

my-x-custom-request-header

Atributo de requisição

%REQ(x-custom-request-header)%

baggage-from-request

Atributo de requisição

%REQ(baggage)%

my-x-custom-response-header

Atributo de resposta

%RESP(x-custom-response-header)%

Verifique os logs de acesso do pod HTTPBin para visualize um conteúdo semelhante ao seguinte:

{
    "bytes_received": "0",
    "bytes_sent": "490",
    "duration": "1",
    "istio_policy_status": "-",
    "method": "GET",
    "path": "/headers",
    "protocol": "HTTP/1.1",
    "response_code": "200",
    "response_flags": "-",
    "my-x-custom-request-header": "xxx",
    "baggage-from-request": "x-custom-request-header=xxx",
    "my-x-custom-response-header": "x-custom-request-header=xxx",
}