首页 > 解决方案 > 如何使用 ingress-nginx 让 HTTP/2 在 Kubernetes 集群中工作

问题描述

我们在一个 API 网关后面有许多服务,它本身就在 ingress-nginx 后面。我们正在尝试使用 HTTP/2 来加速到前端的数据传输,但我们所有的连接仍然使用 HTTP/1.1 完成。

客户端到 nginx 的连接是通过 HTTPS 进行的,但是 nginx 与我们的 API 网关使用 HTTP 进行通信,而网关也使用 HTTP 与后端服务进行通信。

我们是否需要从端到端使用 HTTPS 才能使 HTTP/2 正常工作?如果是这样,最好的设置方法是什么:使用证书?如果不是,是什么导致连接断开到 HTTP/1.1?

我们使用的是 ingress-nginx 版本 0.21.0,它有 nginx 1.15.6 和 OpenSSL 1.1.1,应该足以支持 TLS 1.3/ALPN/HTTP2。我们的 nginx-configuration configmap 已use-http2设置为true,我可以看到 pod/etc/nginx.conf有一条listen ... http2;线。


编辑 2019 年 10 月 5 日:

根据@Barry Pollard 和@Rico 的评论,我发现位于我们的 ingress-nginx 控制器前面的 AWS Elastic Load Balancer 不支持 HTTP/2。我已经从堆栈中删除了 nginx,并且我们的 API 网关正在配置它自己的网络负载均衡器。但是,我们仍然使用 HTTP/1.1。看起来 ASP.Net Core 2.2 的 HTTP 服务器 Kestrel 默认使用 HTTP/2,所以我不确定为什么连接仍然下降到 1.1。

标签: amazon-web-servicessslasp.net-corekuberneteshttp2

解决方案


就像@BarryPollard 所说,您不需要端到端的 HTTP/2 在浏览器上建立 HTTP/2 连接。

听起来您用于客户端的任何内容都下降到 HTTP/1.1,请确保您尝试使用以下方法之一:

  • 铬 51
  • 火狐 53
  • 边缘 12
  • 互联网浏览器 11
  • 歌剧 38

您没有指定 nginx 前面的架构是什么。它直接连接到互联网吗?或者它正在通过云负载均衡器?CDN?您还可以按照此处所述使用 Wireshark 进行测试。


推荐阅读