Istio 1.13.3替代handler/instance/rule实现WebSocket配置方案咨询
解决方案:Istio 1.13.3 替代旧handler/instance/rule实现WebSocket头重写
先明确你旧配置的核心作用:
- 对所有请求执行请求头重写:将URL查询参数中的
access_token值提取后赋值给x-json-web-token请求头;若没有该参数,则设置为空字符串。 - 配置里的
dummy-blacklist相关handler/instance是无效逻辑(检查值Y是否在黑名单["X"]中,永远不会触发拦截),无需迁移。
在Istio 1.13.3中,需通过EnvoyFilter实现该头重写逻辑(VirtualService原生能力无法完成从query参数到请求头的提取映射),具体配置如下:
1. EnvoyFilter配置(核心实现)
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: websocket-header-rewrite namespace: istio-system spec: # 若要全局生效(所有服务的sidecar),可移除workloadSelector字段 workloadSelector: labels: istio: ingressgateway # 仅对入口网关生效,如需针对特定服务,改为对应服务标签(如app: your-erlang-service) configPatches: - applyTo: HTTP_FILTER match: context: GATEWAY # 若对服务侧sidecar生效,改为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/envoy.extensions.filters.http.lua.v3.Lua" inline_code: | function envoy_on_request(request_handle) -- 提取query参数中的access_token,无参数则设为空字符串 local access_token = request_handle:query_param("access_token") or "" -- 替换x-json-web-token请求头 request_handle:headers():replace("x-json-web-token", access_token) end
2. 配置说明
- 生效范围控制:通过
workloadSelector指定规则应用的目标,移除该字段则全局生效;针对入口网关或特定服务时,修改对应标签即可。 - WebSocket兼容性:该逻辑在WebSocket握手的HTTP请求阶段执行,完全不影响后续的WebSocket数据流传输。
- 逻辑匹配度:Lua脚本完全复现旧配置的头重写行为,包括无
access_token参数时设为空字符串的处理。
3. 验证方法
应用配置后,可通过以下步骤验证:
- 发起WebSocket连接请求:
wscat -c "ws://your-service-domain/your-path?access_token=test-token" - 查看服务端接收的请求头,确认
x-json-web-token值为test-token;不带access_token参数时,该头值为空。
内容的提问来源于stack exchange,提问作者Chetan Rathore
相关产品推荐
相关产品推荐

