配置多个使用相同 TLS 证书的 Gateway 时出现 404 错误
目录
问题描述
现象
通过 Istio Ingress Gateway 使用 HTTP/2 协议访问时,出现 404 错误。
该问题是 Istio 社区已知问题,详情请参考 404 errors occur when multiple gateways configured with same TLS certificate。
分析
配置多个 Gateway 使用相同 TLS 证书时,浏览器(大多数浏览器)利用 HTTP/2 连接复用功能,在访问第二个主机时会出现 404 错误,前提是之前已建立了对另一个主机的连接。
示例: 如果域名 a.example.com 和 b.example.com 使用相同 TLS 证书,通过同一个 Istio Ingress Gateway 访问,但配置在两个不同的 Gateway 资源中,HTTP/2 浏览器客户端在访问 a.example.com 后,再访问 b.example.com 时会遇到 404 错误。这是由于浏览器的 HTTP/2 连接复用机制导致的。
排查方法
您可以使用以下脚本快速检查环境中是否存在符合问题描述的 Gateway 配置。脚本需在部署 Istio Ingress Gateway 的业务集群主节点上执行。
- 脚本依赖
jq工具。如果集群节点未安装jq,请先安装。工具下载链接:jq download。 jq版本需为 1.7 或更高。
脚本执行示例输出:
如果输出中出现类似提示:“cred already exist in other gw resource, please must merge hosts in the gw resource drawdb-gateway~drawdb, and delete this gw!”,说明您遇到了本文档描述的问题。
解决方案概述
针对该问题,我们提供两种解决方案。您可以参考下表对比,选择适合环境的方案实施。
方案对比
方案 1:合并 Gateway 资源
方案描述
将多个使用相同 TLS 证书的 Gateway 资源合并为一个。
实施步骤
- 将多个 Gateway 资源合并为一个 Gateway 配置,使用相同的
spec.servers.hosts列表或泛域名配置。 - 修改相关 VirtualService 资源,确保指向合并后的 Gateway。
例如,原配置中两个 Gateway 使用相同 TLS 证书 testhl:
合并后的正确配置:
也可以使用泛域名格式:
步骤总结
- 合并 Gateway 资源的
spec.servers.hosts,将使用相同证书的所有 Gateway 资源合并为一个server配置。 - 修改 VirtualService 资源,指向合并后的 Gateway。
- 确保 VirtualService 中的
destination使用 Kubernetes FQDN 格式。
重要提示: 完成上述操作后,请重新运行排查脚本,确认问题已解决。
方案 2:返回响应码 421
方案描述
当出现问题时,返回 421 状态码,允许客户端重新建立连接,从而路由到正确的目标 Host。
实施步骤
应用以下 EnvoyFilter 配置: