Istio Sidecar代理将Service-A的Authorization Header传递至Service-B失败
问题分析
核心问题是Service-A(acme-graphql)收到的Authorization请求头无法通过Sidecar出站调用传递至ext-authz服务。尽管MeshConfig已配置includeRequestHeadersInCheck = ["Authorization"],且手动在acme-graphql中添加该头时ext-authz能正常接收,但你配置的EnvoyFilter未生效。
现有EnvoyFilter存在两个关键问题:
- 过滤器位置错误:将Lua过滤器
INSERT_AFTER在envoy.filters.http.router之后,而Envoy的router过滤器是出站请求的最后处理环节,此时请求已完成转发,Lua代码无法执行。 - 头操作逻辑冗余:尝试添加已存在的头,可能导致重复,且未确保头被正确传递。
解决方案
方案1:修正EnvoyFilter配置(推荐)
调整过滤器插入位置为INSERT_BEFORE router,并优化Lua逻辑:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: authorization-header namespace: acme spec: workloadSelector: labels: app: acme-graphql configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_OUTBOUND listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" 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) local auth_header = request_handle:headers():get("Authorization") if auth_header ~= nil then request_handle:headers():set("Authorization", auth_header) end end
方案2:无需Lua,直接配置头传递(更简洁)
利用EnvoyFilter修改出站http_connection_manager的头保留规则,强制传递Authorization:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: pass-authorization-header namespace: acme spec: workloadSelector: labels: app: acme-graphql configPatches: - applyTo: HTTP_CONNECTION_MANAGER match: context: SIDECAR_OUTBOUND listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" patch: operation: MERGE value: name: "envoy.filters.network.http_connection_manager" typed_config: '@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager request_headers_to_keep: ":authority",":method",":path","Authorization"
验证步骤
- 重新部署修正后的EnvoyFilter:
kubectl apply -f your-envoyfilter.yaml -n acme - 检查Sidecar配置是否生效:
# 方案1验证 istioctl pc envoy acme-graphql-pod-name -n acme | grep -A 10 -B 5 "envoy.lua" # 方案2验证 istioctl pc envoy acme-graphql-pod-name -n acme | grep -A 5 "request_headers_to_keep" - 发起测试请求,确认ext-authz已收到
Authorization头。
关键说明
- 确保MeshConfig中
includeRequestHeadersInCheck = ["Authorization"]配置正确,该规则保证ext-authz检查时能获取到传递的头。 - 方案2中
request_headers_to_keep会覆盖默认头保留规则,需确保包含所有必要的基础头(如:authority、:method等)。
内容的提问来源于stack exchange,提问作者slik
相关产品推荐
相关产品推荐

