除了支持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请求的传入。