Istio 如何通过 EnvoyFilter 为 Pod Sidecar 的 Envoy 添加 Virtual Host
Sidecar Envoy新增自定义Virtual Host的EnvoyFilter实现
关键配置取值说明
applyTo需要填写VIRTUAL_HOST,该枚举值对应Envoy路由配置中的Virtual Host资源类型,专门用于对路由块下的Virtual Host数组做新增、修改、删除操作。value字段需要填充完整的、符合Envoy原生Virtual Host结构的配置内容,和直接在Envoy RDS配置中书写的Virtual Host字段格式完全一致,无需额外做格式转换适配。
注意:你原配置中仅写了
context: SIDECAR的匹配规则是不够的,需要补充对应Listener、路由配置块的匹配条件,否则补丁会因为定位不到准确的配置位置而失效。
可直接调整使用的完整配置示例
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: my-filter namespace: default spec: # 按原配置保留精准匹配目标工作负载的选择规则 workloadSelector: labels: run: mylabel configPatches: - applyTo: VIRTUAL_HOST match: # 限定补丁仅作用于Pod内置的Sidecar代理 context: SIDECAR listener: # 15001是Sidecar处理所有出站流量的默认入口端口 portNumber: 15001 filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" routeConfiguration: vhost: # 匹配Sidecar默认生成的出站路由配置块 name: "istio.outbound" route: {} patch: operation: ADD # 以下value内容就是Virtual Host的完整配置,可按实际业务需求调整 value: name: "my-custom-vhost" # 配置该Virtual Host能匹配的域名列表 domains: - "my-service.example.com" - "10.0.0.5:80" # 配置域名匹配后的路由转发规则 routes: - match: prefix: "/" route: # 引用Sidecar中已经存在的服务集群名称 cluster: "outbound|80||target-service.default.svc.cluster.local"
实际部署注意事项
- 新增Virtual Host的domains配置不能和现有路由块下的其他Virtual Host域名完全重复,否则会触发路由匹配冲突,导致流量转发逻辑异常。
- 配置中引用的cluster名称必须是Sidecar实际加载的有效集群,填写不存在的集群会直接触发503错误。
- 默认ADD操作会把新增的Virtual Host追加到路由数组的末尾,而Envoy的路由匹配是按数组顺序从上到下匹配的,如果需要更高的匹配优先级,可以配合
INSERT_BEFORE操作定位到指定的现有Virtual Host位置插入,调整匹配顺序。
内容的提问来源于stack exchange,提问作者EvideShow
相关产品推荐
相关产品推荐

