是否可以在 Istio 网关上启用带有 TLS 终止的 HTTP/2?

Posted

技术标签:

【中文标题】是否可以在 Istio 网关上启用带有 TLS 终止的 HTTP/2?【英文标题】:Is it possible to enable HTTP/2 with TLS termination on Istio Gateway? 【发布时间】:2020-12-09 19:09:24 【问题描述】:

是否可以在 Istio 网关上启用带有 TLS(mTLS) 终止的 HTTP/2?然后使用 HTTP/2 将流量转发到应用程序

【问题讨论】:

如果您的网络服务器支持 HTTP2 协议,那么应该没有任何问题。有@suren创建的answer,你可以按照它来全局修改h2UpgradePolicy,将所有传入的http 1.1连接升级到http2。 当http/2请求到来时,tсp连接会一直保持到isitio ingress gateway或者web-application? 据我所知,连接应该一直保持到 wep-app.如果是http2,入口网关将负责传递请求,如果是http,则将其从http升级到http2。 【参考方案1】:

是的,这是可能的。您的服务之间的 Http 2 在 ALPN 中协商(在 mTLS 握手期间)。

然后,您可以通过将 service port name (protocol selection) 设置为 http2,使用 Http 2 将流量从 Sidecar 代理转发到您的应用程序容器。

您的应用的示例服务:

kind: Service
metadata:
  name: myapp
spec:
  ports:
  - number: 8080
    name: http2    # protocol selection by name - important to have http2 here

【讨论】:

【参考方案2】:

如果您的网络服务器支持 HTTP2 协议,那么应该没有任何问题。

当http/2请求到来时,tсp连接会一直保持到isitio ingress gateway或者web-application?

据我所知,连接应该一直保持到 wep-app。如果是http2,入口网关将负责传递请求,如果是http1.1,则将请求从http1.1升级到http2。


正如@suren 在他的回答中提到的here

您可以在 istio configMap 中设置 h2UpgradePolicy,它会将所有传入的 http 1.1 连接升级到 http2,因此只有与 http2 的连接会通过。

非常重要:要使其工作,前面的服务如果下游对等点,必须有命名端口,并且必须调用 http

apiVersion: v1
kind: Service
metadata:
  name: demo
spec:
  ports:
  - name: http      #<- this parameter is mandatory to upgrade to HTTP2
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

此外,还有一种方法可以使用 Destination Rule 为特定的命名空间和 pod 实现此目的,您可以使用 ConnectionPoolSettings.HTTPSettings.H2UpgradePolicy 实现此目的,它将 http1.1 连接升级到 http2。

【讨论】:

以上是关于是否可以在 Istio 网关上启用带有 TLS 终止的 HTTP/2?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 在 API 网关上启用 HEAD 方法

idou老师教你学istio 21:基于角色的访问控制

idou老师教你学Istio 15:Istio实现双向TLS的迁移

idou老师教你学Istio 15:Istio实现双向TLS的迁移

idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输

教程|Istio1.1.0下的TCP流量控制