如何使用 ingress-nginx 让 HTTP/2 在 Kubernetes 集群中工作

Chr*_*att 5 ssl amazon-web-services http2 kubernetes asp.net-core

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

客户端到 nginx 的连接是通过 HTTPS 进行的,但是 nginx 使用 HTTP 与我们的 API 网关通信,网关也使用 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 配置 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。

Ric*_*ico 1

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

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

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

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

  • NLB 不会终止 SSL,因为它只是第 4 层,您必须在入口或 nginx(配置 http2 的位置)上终止 SSL (2认同)