有时候我们希望根据请求的信息(如请求头、请求地址、请求协议等)来决定请求的路由规则 [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。