主动进入服务网格的流量称为入口流量,这是获取服务的入口,所有外部的请求流量都会最先经过这里,这里是外部流量与内部服务通信的入口。在Istio中这个入口称为Ingress gateway,它是一个边界负载均衡器,负责接收外部的请求流量,并按相应的规则转发到网格内部服务上。Istio使用一个叫Gateway的资源对象来管理服务网格的入口。
为service-js和service-python服务创建Gateway的使用示例如下:
1 apiVersion: networking.istio.io/v1alpha3 2 kind: Gateway 3 metadata: 4 name: istio-lab-gateway 5 spec: 6 selector: 7 istio: ingressgateway # use Istio default gateway implementation 8 servers: 9 - port: 10 number: 80 11 name: http 12 protocol: HTTP 13 hosts: 14 - "*" 15 --- 16 apiVersion: networking.istio.io/v1alpha3 17 kind: DestinationRule 18 metadata: 19 name: service-js 20 spec: 21 host: service-js 22 subsets: 23 - name: v1 24 labels: 25 version: v1 26 - name: v2 27 labels: 28 version: v2 29 --- 30 apiVersion: networking.istio.io/v1alpha3 31 kind: VirtualService 32 metadata: 33 name: istio-lab 34 spec: 35 hosts: 36 - "*" 37 gateways: 38 - istio-lab-gateway 39 http: 40 - match: 41 - uri: 42 prefix: /env 43 route: 44 - destination: 45 host: service-python 46 - route: 47 - destination: 48 host: service-js 49 subset: v1
第1~14行定义了名为istio-lab-gateway的Gateway,监听80端口并接收HTTP协议的请求,由于hosts使用*,所以任何域名的请求都会被接受。第6~7行选择了包含标签名为Istio、值为ingressgateway的Ingress gateway,这是Istio默认实现的Ingress gateway,本书介绍的两种部署方式都包含了该组件。
第16~28行定义了名为service-js的DestinationRule,指定了service-js有两个版本的服务,根据version标签的值来区分服务的实例版本。
第30~49行定义了名为istio-lab的VirtualService,指定了与名为istio-lab-gateway的Gateway绑定,它接受任何域名的请求流量。当请求的URI以/env为前缀时,请求转发到service-python服务上,其他请求都转发到service-js服务的v1版本上。字段host的值完整地址为service-js.default.svc.cluster.local,当规则配置与要请求的服务在同一个命名空间时,可以只简写成Service的名称。由于我们没有在metadata的定义中设置namespace字段来指定命名空间,默认情况下,在default命名空间中创建规则。
上述Gateway中,我们配置监听80端口,其实是监听容器的80端口,如果你使用的是云平台的LoadBalancer,那么会直接监听在LoadBalancer的80端口。由于我们的实验是在本地虚拟机环境进行,只能使用NodePort方式,NodePort监听的31380端口对应于容器中80端口,也就是我们在Gateway中指定的80端口。