7.4 根据服务版本权重拆分流量

上一章

7.6 流量镜像

下一章

更多图书

7.5 根据请求信息路由到服务的不同版本

有时候我们希望根据请求的信息(如请求头、请求地址、请求协议等)来决定请求的路由规则 [1] 。根据请求的URI以及请求头来转发请求的配置规则示例如下:


1 ...
 2 apiVersion: networking.istio.io/v1alpha3
 3 kind: VirtualService
 4 metadata:
 5   name: istio-lab
 6 spec:
 7   hosts:
 8   - "*"
 9   gateways:
10   - istio-lab-gateway
11   http:
12   - match:
13     - uri:
14         prefix: /env
15       headers:
16         app-client:
17           regex: "react"
18     route:
19     - destination:
20         host: service-python
21         subset: v1
22   - match:
23     - uri:
24         prefix: /env
25     route:
26     - destination:
27         host: service-python
28         subset: v2
29   - route:
30     - destination:
31         host: service-js
32         subset: v1

第12~28行定义了两个match路由规则,第一个match规则表示当服务请求的URI是以/env开头,并且包含app-client值为react的请求头时,请求转发到服务service-python的v1版本上。第二个match规则表示当服务请求的URI是以/env开头时,请求转发到服务service-python的v2版本上。由于请求路由匹配规则是从上到下,当匹配到第一个规则时就进入请求转发阶段,所以这两个match规则的顺序不能相互调换。

第15行使用的headers下定义的请求头字段必须使用小写字母,并且只能使用连字符连接,比如:x-request-id、app-client。

第29~32行定义了默认的路由规则,当请求不满足上述的两个match路由规则时,把请求转发到默认路由。

【实验】

1)创建Gateway和service-js的路由规则:


$ kubectl apply -f istio/route/gateway-js-react-v1-v2.yaml

2)浏览器访问。

此时打开浏览器访问http://11.11.11.112:31380/ ,并多次点击“发射”按钮,你会看到service-python服务的请求会一直落到v1版本。这是由于使用React框架实现的service-js服务的v1版本请求service-python服务时都携带了字段名为app-client、值为react的请求头,所以根据上述的路由规则,对于service-python服务的请求都会落到v1版本。

3)清理:


$ kubectl delete -f istio/route/gateway-js-react-v1-v2.yaml

[1] 具体配置项可以参考官方文档,链接地址https://istio.io/docs/reference/config/istio.networking.v1alpha3/#HTTPMatchRequest。