Ao rotear tráfego por uma malha de serviços, é comum precisar injetar IDs de rastreamento, aplicar políticas de segurança ou transmitir metadados entre serviços. O Service Mesh (ASM) permite manipular cabeçalhos HTTP no nível de rota pelo campo headers da CustomResourceDefinition (CRD) VirtualService. Assim, você adiciona, sobrescreve ou remove cabeçalhos em requisições e respostas sem alterar o código da aplicação.
Pré-requisitos
Antes de começar, verifique se você tem:
A aplicação HTTPBin implantada na sua instância do ASM. Para obter instruções, consulte Implantar a aplicação HTTPBin
Referência de operações de cabeçalho
O VirtualService oferece três operações para manipular cabeçalhos:
|
Operação |
Campo YAML |
Comportamento |
Tipo de valor |
|
|
|
Adiciona o cabeçalho especificado com o valor fornecido. Crie o cabeçalho caso não exista. |
|
|
|
|
Sobrescreve o valor do cabeçalho. Defina o cabeçalho se ainda não existir. |
|
|
|
|
Exclua o cabeçalho completamente. |
|
Valores de cabeçalho estáticos e dinâmicos
Os valores dos cabeçalhos podem ser strings estáticas ou operadores de comando dinâmicos do Envoy delimitados pelo símbolo %. Por exemplo, %UPSTREAM_CLUSTER% indica o nome de um provedor de serviços. Todos os operadores de comando HTTP usados em logs de acesso também são válidos em cabeçalhos personalizados de requisição ou resposta.
|
Variável |
Descrição |
|
|
Timestamp de início da requisição |
|
|
Nome do cluster de serviço upstream |
Para consultar a lista completa de variáveis disponíveis, veja Operadores de comando na documentação do Envoy.
Configure a manipulação de cabeçalhos
A configuração de VirtualService a seguir demonstra as três operações aplicadas aos cabeçalhos de requisição e de resposta:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin-vs
spec:
gateways:
- httpbin
hosts:
- '*'
http:
- route:
- destination:
host: httpbin
port:
number: 8000
weight: 100
headers:
request:
add:
x-custom-request-header: "custom-value" # Append a static value
x-dynamic-request-header: "%START_TIME%" # Append a dynamic value
set:
x-another-request-header: "another-value" # Overwrite or create
remove:
- x-unwanted-header # Delete entirely
response:
add:
x-custom-response-header: "custom-response-value"
set:
x-another-response-header: "another-response-value"
remove:
- x-unwanted-response-header
Essa configuração aplica as seguintes alterações:
Cabeçalhos de requisição
Adiciona
x-custom-request-headercom o valor estáticocustom-value.Inclui
x-dynamic-request-headercom o timestamp de início da requisição, resolvido em tempo de execução a partir de%START_TIME%.Sobrescreve
x-another-request-headercom o valoranother-value. Caso esse cabeçalho não exista, ele será criado.Exclua
x-unwanted-header.
Cabeçalhos de resposta
Adiciona
x-custom-response-headercom o valorcustom-response-value.Sobrescreve
x-another-response-headercom o valoranother-response-value. Se o cabeçalho não existir, ele será criado.Exclua
x-unwanted-response-header.
A CRD VirtualService permite definir e modifique cabeçalhos HTTP. No entanto, os logs de acesso do Envoy não registram essas alterações se o Envoy mantiver as configurações padrão de log. Para registrar cabeçalhos personalizados nos logs de acesso do Envoy, modifique o formato de log do Envoy.
Verifique cabeçalhos personalizados nos logs de acesso
O ASM permite personalizar formatos de log. As expressões personalizadas dos logs de acesso obtêm valores de cabeçalhos de requisição, cabeçalhos de resposta e valores internos do Envoy. Para obter instruções, consulte Personalizar o formato dos logs de acesso.
Adicione os seguintes campos ao formato do seu log de acesso:
|
Nome do campo |
Tipo |
Expressão do formato de log |
|
|
Atributo de requisição |
|
|
|
Atributo de requisição |
|
|
|
Atributo de resposta |
|
Cabeçalhos de resposta modificados pelo VirtualService podem não aparecer nos logs de acesso se o Envoy aplicar a modificação após a etapa de registro em sua cadeia de filtros. Esse comportamento é esperado e não indica erro de configuração. Consulte o exemplo do pod HTTPBin abaixo.
Após atualize o formato de log, verifique os logs de acesso do pod de gateway e do pod HTTPBin.
Log de acesso do pod de gateway
O pod de gateway captura modificações nos cabeçalhos de requisição e de resposta:
{
"bytes_received": "9",
"bytes_sent": "33",
"response_code": "200",
"my-x-custom-request-header": "custom-value",
"my-x-dynamic-request-header": "2024-01-16T14:49:21.187Z",
"my-x-custom-response-header": "custom-response-value"
}
Log de acesso do pod HTTPBin
O sidecar do HTTPBin não captura cabeçalhos de resposta adicionados pelo VirtualService porque a modificação ocorre após o ponto de registro de log do sidecar. O campo my-x-custom-response-header exibe -:
{
"bytes_received": "9",
"bytes_sent": "33",
"response_code": "200",
"my-x-custom-request-header": "custom-value",
"my-x-dynamic-request-header": "2024-01-16T14:49:21.187Z",
"my-x-custom-response-header": "-"
}