7.1 整体介绍

上一章

7.3 把请求路由到服务的指定版本

下一章

更多图书

7.2 管理集群的入口流量

主动进入服务网格的流量称为入口流量,这是获取服务的入口,所有外部的请求流量都会最先经过这里,这里是外部流量与内部服务通信的入口。在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端口。