TLS 匹配必须至少有一个 SNI 主机

TLS match must have at least one SNI host

在此处引用 bookinfo yaml: 我的网关看起来像:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      name: https
      number: 443
      protocol: https
    tls:
      mode: PASSTHROUGH
    hosts:
    - "*" 

将其配置为接受来自所有主机的 https。但是,在VirtualService中,我想实现一个URL match based routing。这就是我当前的 VS 配置。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  tls:
  - match:
    - uri:
        prefix: /productpage
    - port: 443
      sniHosts:
      - "*"
    route:
    - destination:
        host: productpage
        port:
          number: 9080

部署失败并出现错误“TLS 匹配必须至少有一个 SNI 主机”。如果我删除 uri 匹配条件,相同的 VS 配置将起作用。

有没有一种方法可以让 TLS 基于 URI 匹配的路由同时保留通用的 sniHost(因为我的主机很常见,我需要根据 url 前缀路由到特定的应用程序)?

在 Istio 中,VirtualService TLS Match 不包含基于 URI 的路由 (link)。 TLS 是一种不透明的连接,它只能执行基于主机的路由(因为主机名存在于客户端 hello tcp 握手中)。

为了实现基于路径的路由,您将需要终止TLS作为网关级别,并基于http进行路由。 HTTP 消息是透明消息,其中 L7 路由可以由 istio 或任何其他中间层应用。

另一种选择是使用 nginx 或任何其他反向代理(执行 ssl 终止并将调用直接路由到适当的服务)。简而言之,为了执行基于 L7 的路由(基于路径的其中之一),无论是在 istio 端还是在应用程序端完成,您都需要解密请求(TLS 终止)。