Istio灰度发布的流量策略

灰度发布就是先上线一个新版本,然后根据规则将一小部分用户导向到新应用,观察新版本在生产环境的表现,如果达到预期,则逐步将流量切换到新版本中。

将所有流量导向一个版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- route:
- destination:
host: nginx-server
subset: v2
port:
number: 80

将流量进行拆分

按照权重进行拆分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- route:
- destination:
host: nginx-server
subset: v1
port:
number: 80
weight: 90
- destination:
host: nginx-server
subset: v2
port:
number: 80
weight: 10

按照header进行拆分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- match:
- headers:
test:
exact: header
route:
- destination:
host: nginx-server
subset: v1
port:
number: 80

按照浏览器进行拆分

其实也是按照header来进行区分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- match:
- headers:
User-Agent:
regex: ".*Firefox/.*"
route:
- destination:
host: nginx-server
subset: v2
port:
number: 80

按照请求地址进行拆分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- match:
- uri:
prefix: "/v2"
rewrite:
uri: /
route:
- destination:
host: nginx-server
subset: v2
port:
number: 80

按照用户源IP进行流量拆分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
......
.....
.....
- match:
- headers:
X-Real-IP:
regex: ".*192.168.3.148.*"
route:
- destination:
host: nginx-server
subset: v2
port:
number: 80
- match:
- headers:
X-Real-IP:
regex: ".*192.168.2.117.*"
route:
- destination:
host: nginx-server
subset: v1
port:
number: 80

多个条件同时满足时,进行流量拆分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- match:
- headers:
test:
exact: header
User-Agent:
regex: ".*Chrome/.*"
route:
- destination:
host: nginx-server
subset: v1
port:
number: 80

满足其中一个条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-server
spec:
hosts:
- "nginx.yscloud.com"
gateways:
- nginx-server-gateway
http:
- match:
- headers:
test:
exact: header
- headers:
User-Agent:
regex: ".*Chrome/.*"
route:
- destination:
host: nginx-server
subset: v1
port:
number: 80

当对同一目标有多个规则时,会按照在 VirtualService 中的顺序进行应用,换句话说,列表中的第一条规则具有最高优先级。

PS:如果系统分布式部署,有A,B,C,D,E服务,如果仅需要对D服务进行灰度发布时,仅对D服务配置VirtualService和DestinationRule就行,其他服务不需要配置。

Thank you for your accept. mua!
-------------本文结束感谢您的阅读-------------