Gateway的典型应用


下面认识Gateway的几种典型应用。


1.将网格内的HTTP服务发布为HTTP外部访问

3.4.1节的配置示例介绍了将一个内部的HTTP服务通过Gateway发布出去的典型场景。如图3-53所示,外部服务通过域名http://weather.com访问到应用的入口服务frontend。VirtualService本身定义了frontend服务从内部和外部访问同样的路由规则,即根据内容的不同,将请求路由到v2版本或v1版本。注意,这里Gateway的协议是HTTP。

Istio Gateway的典型应用--《云原生服务网格Istio》书摘07_java

图3-53  将网格内的HTTP服务发布为HTTP外部访问


2.将网格内的HTTPS服务发布为HTTPS外部访问

在实际使用中更多的是配置HTTPS等安全的外部访问。例如,在这个场景中,将网格内的HTTPS服务通过HTTPS协议发布。这样在浏览器端中输入“https://weather.com”就可以访问到这个服务,如图3-54所示。

Istio Gateway的典型应用--《云原生服务网格Istio》书摘07_java_02

图3-54  将网格内的HTTPS服务发布为HTTPS外部访问


如下所示是这种场景的Gateway配置,重点是:端口为443,协议为HTTPS,TLS模式为PASSTHROUGH,表示Gateway只透传应用程序提供的HTTPS内容。在本示例中,frontend入口服务自身是HTTPS类型的服务,TLS需要的服务端证书、密钥等都是由frontend服务自己维护的。这时要对frontend服务做路由管理,在VirtualService中需要配置支持TLSRoute规则,如果没有配置,则流量会被当作TCP处理:

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: istio-gateway

namespace: istio-system 

spec:

  selector:

  app: ingress-gateway

  servers:

  - port:

number: 443

name: https

  protocol: HTTPS

    hosts:

    - weather.com

    tls:

mode: PASSTHROUGH


这时,Istio只是通过Gateway将一个内部的HTTPS服务发布出去。Istio提供了通道和机制,HTTPS的证书及网格外部HTTPS客户端如何访问frontend服务都是frontend服务自己的事情。这里的HTTPS是应用程序的HTTPS,不是Istio的Gateway提供的HTTPS。对于自身的服务已经是HTTPS的应用,Istio支持通过这种方式把服务发布成外部可访问,但更推荐的是下面的做法,即将网格内一个HTTP的服务通过Gateway发布为HTTPS外部访问。


3.将网格内的HTTP服务发布为HTTPS外部访问

与上一个场景类似,要求网格外部通过HTTPS访问入口服务,差别为服务自身是HTTP,在发布的时候通过Gateway的配置可以提供HTTPS的对外访问能力。如图3-55所示,外部通过HTTPS访问,入口服务frontend是HTTP服务。

图3-55  将网格内HTTP服务发布为HTTPS外部访问


这时配置Gateway如下,可以看到端口为443,协议为HTTPS。与前一种场景的入口服务自身为HTTPS不同,这里的TLS模式是SIMPLE,表示Gateway提供标准的单向TLS认证。这时需要通过serverCertificate和privateKey提供服务端证书密钥。从图3-55也可以看到TLS认证的服务端是在入口的Envoy上创建的,入口服务frontend本身保持原有的HTTP方式:

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: istio-gateway

  namespace: istio-system 

spec:

  selector:

    app: ingress-gateway

  servers:

  - port:

      number: 443

      name: https

      protocol: HTTPS

    hosts:

    - weather.com

    tls:

mode: SIMPLE

      serverCertificate: /etc/istio/gateway-weather-certs/server.pem

      privateKey: /etc/istio/gateway-weather-certs/privatekey.pem


这种方式又被称为终结的HTTPS,在Gateway外面是HTTPS,但从Gateway往里的服务间访问还是HTTP。入口处作为Gateway的Envoy,一方面作为服务提供者的入口代理,将frontend服务以HTTPS安全协议发布出去;另一方面作为服务消费者的代理,以HTTP向frontend服务发起请求。正因为有了后面这种能力,对于frontend服务上的路由仍然可以使用HTTP的路由规则。


这种方式既可以提供第1种HTTP发布同样的灵活性,又可以满足第2种场景要求的入口安全访问。在Gateway服务发布时提供了安全的能力,对服务自身的代码、部署及网格内部的路由规则的兼容都没有影响,因此是推荐的一种做法。


4.将网格内的HTTP服务发布为双向HTTPS外部访问

对于大多数场景,使用上面的方式将入口的HTTP服务发布成标准的HTTPS就能满足需要。在某些场景下,比如调用入口服务的是另一个服务,在服务端需要对客户端进行身份校验,这就需要用到TLS的双向认证,如图3-56所示。

图3-56  将网格内HTTP服务发布为双向HTTPS外部访问


这种方式的主要流程和第3种场景单向认证类似,都是在入口处Gateway角色的Envoy上开放HTTPS服务,外部HTTPS请求在Gateway处终止,内部VirtualService的路由配置仍然是HTTP。


在如下配置方式中,可以看到,双向认证和单向认证的差别在于,Gateway上的模式被设定为MUTUAL时表示双向认证,同时,为了支持双向认证,除了要配置通过serverCertificate和privateKey提供服务端证书密钥,还需要提供caCertificates来验证客户端的证书,从而实现和调用方的双向认证:

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

name: istio-gateway

  namespace: istio-system 

spec:

  selector:

    app: ingress-gateway

  servers:

  - port:

number: 443

name: https

    protocol: HTTPS

    hosts:

    - weather.com

    tls:

mode: MUTUAL

      serverCertificate: /etc/istio/gateway-weather-certs/server.pem

      privateKey: /etc/istio/gateway-weather-certs/privatekey.pem

      caCertificates: /etc/istio/gateway-weather-certs/ca-chain.cert.pem


5.将网格内的HTTP服务发布为HTTPS外部访问和HTTPS内部访问

除了以上几种方式,有没有一种方式可以将一个HTTP服务通过Gateway发布为HTTPS服务?同时在网格内部也是HTTPS的双向认证?当然有,这是Istio安全能力的主要场景,如图3-57所示,不用修改代码,HTTP服务在网格内和网格外都是HTTPS安全方式互访。

图3-57  将网格内的HTTP服务发布为HTTPS外部访问和HTTPS内部访问


这里的Gateway的Manifest和场景3完全相同,不再重复介绍。

我们只需知道Istio可以透明地给网格内的服务启用双向TLS,并且自动维护证书和密钥。入口Gateway和入口服务frontend在这种场景下的工作机制如下:

  • frontend服务自身还是HTTP,不涉及证书密钥的事情;

  • Gateway作为frontend服务的入口代理,对外提供HTTPS的访问。外部访问到的是在Gateway上发布的HTTPS服务,使用Gateway上的配置提供服务端证书和密钥;

  • Gateway作为外部服务访问frontend服务的客户端代理,对frontend服务发起另一个HTTPS请求,使用的是Citadel分发和维护的客户端证书和密钥,与frontend服务的服务端证书和密钥进行双向TLS认证和通信。

注意:入口服务通过Gateway发布成HTTPS,结合Istio提供的透明双向TLS,在入口的Envoy上是两套证书密钥,一套是Gateway对外发布HTTPS服务使用的,另一套是Istio提供的网格内双向TLS认证,两者没有任何关系。 


下面通过如表3-6所示的Gateway上的服务发布方式比较来理解以上几种场景。

Istio Gateway的典型应用--《云原生服务网格Istio》书摘07_java_03

表3-6  Gateway上的服务发布方式比较


此外,在Gateway上一般都是发布多个服务,如下所示为配置多个Server元素:

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

  name: istio-gateway

namespace: istio-system 

spec:

  selector:

    app: ingress-gateway

  servers:

  - port:

  number: 443

      name: https

  protocol: HTTPS

    hosts:

    - weather.com

    tls:

mode: MUTUAL

      serverCertificate: /etc/istio/gateway-weather-certs/server.pem

      privateKey: /etc/istio/gateway-weather-certs/privatekey.pem

      caCertificates: /etc/istio/gateway-weather-certs/ca-chain.cert.pem

  - port:

number: 80

  name: http

    protocol: HTTP

    hosts:

    - weather2.com