【问题标题】:How to get HTTP/2 working in a Kubernetes cluster using ingress-nginx如何使用 ingress-nginx 让 HTTP/2 在 Kubernetes 集群中工作
【发布时间】:2019-09-27 07:54:47
【问题描述】:

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

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

【问题讨论】:

  • 不,您不需要始终使用 HTTPS。它是一个公开可用的端点吗?您可以通过ssllabs.com/ssltest 运行它并确认我设置为“Yes h2 http/1.1”的 ALPN 以及 Chrome 70 使用的 TLS 版本和密码吗?
  • 表示不支持 TLS 1.3 和 ALPN。我认为 ELB 是原因。
  • 你能做到吗?我在 nginx 入口断开与 Http 1.1 的连接时遇到了同样的问题

标签: amazon-web-services ssl asp.net-core kubernetes http2


【解决方案1】:

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

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

  • 铬 51
  • 火狐53
  • 边缘 12
  • Internet Explorer 11
  • 歌剧 38

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

【讨论】:

  • NGINX 落后于 Elastic Load Balancer。
  • 对于客户端,我尝试过 Chrome 73、Firefox 66、IE 11 和 Edge 12,并且都在使用 HTTP/1.1。我会看看配置 ELB,我没有考虑过。
  • 您需要检查 ELB 的配置。我相信传统的 ELB 不支持 HTTP/2
  • 我正在努力将其配置为网络/应用程序负载均衡器,但 Kubernetes 会自动配置经典。
  • NLB 不会终止 SSL,因为它只是第 4 层,您必须在 ingress 或 nginx(配置 http2 的位置)上终止 SSL
猜你喜欢
  • 2018-12-23
  • 2019-12-29
  • 2023-03-20
  • 2019-04-03
  • 2022-01-18
  • 2020-07-22
  • 2021-01-08
  • 2021-07-31
  • 2021-06-05
相关资源
最近更新 更多