ASM支持通过Virtual Service的headers字段来自定义请求头(request headers)和响应头(response headers)。Virtual Service允许您在路由级别添加、修改或删除HTTP头信息,从而实现对头信息的定制化处理。
前提条件
步骤一:定义VirtualService资源
VirtualService可以满足大多数常见的头部操作需求,如简单地添加、修改或删除请求头和响应头。例如,它不仅支持将头部值设定为固定的静态字符串,还能够通过内置表达式动态生成请求和响应头部的值。这些表达式通常使用%
符号包裹,可以引用请求属性等不同的动态内容。用于访问日志记录的所有HTTP命令运算符都可以在自定义请求或响应标头中指定,例如%UPSTREAM_CLUSTER%
表示服务提供方的名称。更多信息,请参见config-access-log-command-operators。
您可以基于路由规则定制请求和响应的HTTP头部信息。这对于跟踪、日志记录、添加安全头部或实施特定的业务逻辑等情况非常有用。以下是一个Virtual Service的配置示例,说明如何自定义请求头和响应头。配置说明如下:
类型 | 说明 |
请求头 |
|
响应头 |
|
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" # 添加自定义请求头。
x-dynamic-request-header: "%START_TIME%" # 添加自定义请求头。
set:
x-another-request-header: "another-value" # 修改或设置请求头。
remove:
- x-unwanted-header # 移除请求头。
response:
add:
x-custom-response-header: "custom-response-value" # 添加自定义响应头。
set:
x-another-response-header: "another-response-value" # 修改或设置响应头。
remove:
- x-unwanted-response-header # 移除响应头。
虽然Virtual Service可以设置和修改HTTP头部信息,但这些更改对于Envoy Access Logs的默认配置可能不可见。如果您想在Envoy的Access Logs中记录这些自定义头部信息,需要修改Envoy的日志格式。
步骤二:通过日志查看自定义请求和响应内容
ASM提供自定义日志格式的功能,支持从请求Header、响应Header、Envoy内置值中取值。具体操作,请参见自定义日志格式。
如下所示,新增3个字段用于在日志中显示内容,具体设置如下:
变量名称 | 类型 | 变量值 |
my-x-custom-request-header | 请求属性 | %REQ(x-custom-request-header)% |
my-x-dynamic-request-header | 请求属性 | %REQ(x-dynamic-request-header)% |
my-x-custom-response-header | 响应属性 | %RESP(x-custom-response-header)% |
在Virtual Service中,若响应头的配置修改在日志记录操作之后生效执行,则这些修改后的响应头信息将不会出现在Access Logs中。
查看网关Pod的日志内容,可以看到类似如下内容:
{ "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" }
查看httpbin Pod的日志内容,可以看到类似如下内容:
{ "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": "-" }