如何在Istio的EnvoyFilter中配置ignore_port_in_host_matching或strip_any_host_port
在Istio中配置
ignore_port_in_host_matching或strip_any_host_port解决Host头重路由问题 问题背景
我们通过EnvoyFilter修改HTTP请求的Host头以实现请求重路由至其他集群,但遇到以下问题:当目标API端口与出站监听器端口相同时,修改Host头的操作能正常触发重路由;但端口不同时,修改Host头无法生效。Envoy社区建议通过配置ignore_port_in_host_matching或strip_any_host_port来解决该问题,需明确在Istio中的具体配置方式。
解决方案
方法1:配置ignore_port_in_host_matching
该参数让Envoy在路由匹配时忽略Host头中的端口部分,仅用域名进行匹配。通过EnvoyFilter修改路由配置:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: route-ignore-host-port namespace: istio-system # 可替换为目标工作负载所在命名空间 spec: workloadSelector: labels: istio: ingressgateway # 按需替换为目标工作负载的标签,比如特定服务标签 configPatches: - applyTo: ROUTE_CONFIG match: context: GATEWAY # 侧车出站场景替换为SIDECAR_OUTBOUND routeConfiguration: vhost: name: "*" # 匹配所有虚拟主机,可替换为具体域名 patch: operation: MERGE value: virtual_hosts: - name: "*" ignore_port_in_host_matching: true
方法2:配置strip_any_host_port
该参数会直接剥离Host头中的端口部分,仅保留域名用于路由匹配。通过EnvoyFilter配置:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: route-strip-host-port namespace: istio-system spec: workloadSelector: labels: istio: ingressgateway # 按需替换为目标工作负载标签 configPatches: - applyTo: ROUTE_CONFIG match: context: GATEWAY # 侧车出站场景替换为SIDECAR_OUTBOUND routeConfiguration: vhost: name: "*" patch: operation: MERGE value: virtual_hosts: - name: "*" strip_any_host_port: true
注意事项
- 根据流量场景调整
context字段:入口网关用GATEWAY,侧车出站流量用SIDECAR_OUTBOUND。 - 调整
workloadSelector.labels匹配需要生效的具体工作负载,比如特定服务或网关。 - 若需针对特定域名生效,将
name: "*"替换为具体的虚拟主机名称(如example.com:80)。
内容的提问来源于stack exchange,提问作者ppzhuo
相关产品推荐
相关产品推荐

