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": "-" }