5.3 基于SNI的TLS路由

除了支持HTTP和TCP协议的路由规则之外,Istio还提供基于TLS的路由规则。通常使用ClientHello消息提供的SNI值来执行路由(在每次新的握手流中,ClientHello消息总是第一条消息)。TLS路由通常应用在https-、tls-前缀的服务端口,或经网关透传的HTTPS、TLS协议端口,也包括使用HTTPS或者TLS协议的ServiceEntry端口上。值得注意的是,没有关联虚拟服务的https-或者tls-端口流量会被视为透传TCP流量。

Istio中定义的自定义资源TLSRoute定义了透传TLS流量的特征匹配和相关动作,包括的属性定义,参见表5-1。

表5-1 TLSRoute定义的透传TLS流量的动作属性

其中,TLSMatchAttributes定义了TLS连接属性,参见表5-2。

表5-2 TLSMatchAttributes定义的TLS连接属性

下载本书所使用的示例代码之后,切换到目录mtls-go-example以及其子目录sni,可以查看所有相关的代码文件。

下面的虚拟服务代码示例(具体代码可参见目录mtls-go-example/sni下的文件nginx-vs.yaml),描述了将到达mygateway网关443端口的TLS流量进行透传,并根据SNI值nginx.example.com或nginx.api.com转发给网格内部的相应服务,即分别指向内部服务nginx或nginx2:


apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx
spec:
  hosts:
  - nginx.example.com
  - nginx.api.com
  gateways:
  - mygateway
  tls:
  - match:
    - port: 443
      sni_hosts:
      - nginx.example.com
    route:
    - destination:
        host: nginx
        port:
          number: 443
  - match:
    - port: 443
      sni_hosts:
      - nginx.api.com
    route:
    - destination:
        host: nginx2
        port:
          number: 443

前面的示例描述了如何配置HTTPS入口访问HTTP服务,接下来介绍如何配置对HTTPS服务的入口访问,即配置入口网关以执行SNI直通,而不是终止TLS请求的传入。