《istio-in-action 系列》 5. VirtualService 使用路径重写

有了 VirtualService 的路径重写功能后, 就更符合 Ingress 的标准定义了。

但 VirtualService 不仅仅如此, 路径重写包含了三种方式

  1. prefix: 前缀匹配。 只要 uri 路径的 前段 匹配则转发。 后端 自动补齐。
  2. exact: 精确匹配。 只有 uri 全部 匹配才转发, 并且只能转发某一个固定地址。
    • 精确匹配
  3. regex: 正则匹配。 只有 uri 全部路径 满足正则规则 才转发。

补充: 关于正则匹配模式官网资料也很少。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPRewrite
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-prod
  namespace: myistio
spec:
  gateways:
    - istio-tangx-in
  hosts:
    - svc-prod
    - istio.tangx.in
  http:
  - name: "prefix-match"  # 规则名称
    match:
    - uri:
        prefix: "/p1"  # 新路径, prefix 前缀匹配, 满足 /p1 的都要被重写
    rewrite:
      uri: "/prod"    # 老路径
    route:
    - destination:
        host: svc-prod  # 后端服务

  - name: "exact-match"
    match:
    - uri:
        exact: "/p2-list" # 新路径, exact 精确匹配, 只能满足 /p2-list
    rewrite:
      uri: "/prod/list"   # 精确匹配
    route:
    - destination:
        host: svc-prod

  - name: "regex-match"
    match:
    - uri:
        regex: "/pr[1-3]/.*" # 新路径, regex 正则匹配。 正则匹配的整个 uri,因此允许所有要 使用 `.*`。 正则规则使用: https://github.com/google/re2/wiki/Syntax
    rewrite:
      uri: "/prod/list"  ## 精确匹配路径
    route:
    - destination:
        host: svc-prod

https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPRewrite

测试

执行命令, 部署环境。 (快捷键见第一章)

1
ka -f istio-samples/05

使用 05.http 中的测试用例, 进行测试。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19

### GET,原访问地址
#     现在已经 404
GET http://istio.tangx.in/prod/list


### GET 使用路径重写: prefix 前缀匹配
GET http://istio.tangx.in/p1/list


### GET 使用路径重写: exact 精确匹配
GET http://istio.tangx.in/p2-list


### GET 使用路径重写: regex 正则匹配(有效)
GET http://istio.tangx.in/pr3/list

### GET 使用路径重写: regex 正则匹配(无效)
GET http://istio.tangx.in/pr4/list

不同的 404 not found

客户端请求后得到的 404 not found 有两种

  1. istio 没有匹配到路由规则而返回的 404.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10

### GET,原访问地址
#     现在已经 404, istio 返回
GET http://istio.tangx.in/prod/list

    # HTTP/1.1 404 Not Found
    # date: Mon, 15 Nov 2021 04:19:43 GMT
    # server: istio-envoy
    # connection: close
    # content-length: 0
  1. istio 成功将请求转发到后端server, 后端 server 找不到路由而返回的 404。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
### GET 使用路径重写: prefix 前缀匹配
#     404 not found, server 返回。
GET http://istio.tangx.in/p1/list2

    # HTTP/1.1 404 Not Found
    # content-type: text/plain
    # date: Mon, 15 Nov 2021 04:20:09 GMT
    # content-length: 18
    # x-envoy-upstream-service-time: 0
    # server: istio-envoy
    # connection: close

    # 404 page not found