如何配置Istio Sidecar在请求中添加X-Forwarded-Port请求头?
解决Istio Sidecar缺失X-Forwarded-Port请求头的全局方案
启用Istio Sidecar后服务生成的链接丢失端口,核心原因是Envoy代理未自动注入X-Forwarded-Port请求头,导致服务无法获取原始请求端口来构建正确链接。逐个通过VirtualService手动添加属于临时 workaround,这里提供全局生效的根本解决方案:
使用EnvoyFilter直接修改集群内所有Sidecar的Envoy配置,让其自动为入站请求添加X-Forwarded-Port请求头。
全局配置示例
创建如下EnvoyFilter资源(命名空间指定为istio-system,确保全局生效):
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: add-x-forwarded-port namespace: istio-system spec: workloadSelector: labels: istio: sidecar configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_INBOUND listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: envoy.filters.http.lua typed_config: "@type": "type.googleapis.com/udpa.type.v1.TypedStruct" type_url: "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua" value: inline_code: | function envoy_on_request(request_handle) local port = request_handle:streamInfo():downstreamConnection():localPort() request_handle:headers():add("X-Forwarded-Port", tostring(port)) end
配置说明
workloadSelector:匹配所有带有istio: sidecar标签的Pod,确保所有Sidecar都应用该配置- Lua过滤器:通过脚本获取当前连接的目标端口,自动添加到
X-Forwarded-Port请求头中 - 配置针对所有入站请求生效,无需逐个服务单独设置
生效步骤
- 将上述配置保存为
add-x-forwarded-port.yaml,执行命令应用:kubectl apply -f add-x-forwarded-port.yaml -n istio-system - 重启受影响的服务Pod(或等待Istio自动热重载Sidecar配置)
- 验证:发送请求到服务,检查请求头中是否包含
X-Forwarded-Port,同时确认服务生成的链接已包含正确端口
对比临时方案
这个全局配置一次性解决所有服务的问题,避免了逐个维护VirtualService的重复工作,是更高效的根本解决方式。
内容的提问来源于stack exchange,提问作者Scottm
相关产品推荐
相关产品推荐

