[TOC]
# 一、概述
基于Istio,我们可以实现部署新版本服务时,但现有流量还是请求到现有版本服务
* 金丝雀部署:大部分用户请求到旧服务,部分白名单用户请求到新版本服务,白名单验收通过后,其他非白名单用户慢慢路由到新版本服务,开始灰度,最后全量
* 蓝绿部署:用户被分为蓝、绿版本,分别对应服务的新老版本,基于百分比来划分用户进行灰度放量,比如一开始20%用户去到新版本服务,如果有问题,则调整百分比
本次演示假定现有的服务是v1版本,新服务为v2版本
先发布v2版本
进行白名单验收功能
开始调整流量到v2版本服务
# 二、整体思路
总体思路就是把Deployment分为v1、v2版本,VirtualService里通过调整权重做分流
配置文件见`kubernetes/services/overlays/prod`
![](https://img.kancloud.cn/d3/ae/d3aecc24fbeb6e99eb7407d9ea8a72be_1144x364.png)
运行:`./kubernetes/scripts/deploy-prod.bash`,自动部署v1版本的服务,
打开kiali的dashboard,可以看到服务的调用关系:
![](https://img.kancloud.cn/42/4a/424a4188f6ded6bc3d60a4df843fe334_2616x1456.png)
# 三、同时部署v1、v2版本服务
下面演示放开注释的代码,同时部署v1和v2版本服务
`kubernetes/scripts/deploy-prod.bash`脚本默认不部署v2版本服务,需要部署则把注释的脚步放开:
![](https://img.kancloud.cn/ce/ae/ceae2b7b2a0a1b65cc60502c489f14be_2130x904.png)
放开后运行`./kubernetes/scripts/deploy-prod.bash`,运行成功后,同时部署了v1、v2版本的服务
![](https://img.kancloud.cn/5c/f8/5cf89367a38b14261724975f7205a52e_2574x1426.png)
![](https://img.kancloud.cn/04/b3/04b3cf176b207a8cfdd222fe47a79c1d_2244x1358.png)
其中redis、MySQL服务是共用的,只有一个版本
# 四、灰度测试
以user-service为例,默认v1权重100,v2为0,即流量全部去到v1版本,具体见`kubernetes/services/overlays/prod/istio/user-service-routing-virtual-service.yml`
1. 修改配置
现在调整权重为各50,实际情况应该从小比例开始灰度,如1
![](https://img.kancloud.cn/eb/a7/eba7ee61547bd393818bf628d6fdb61a_1886x1052.png)
2. 应用配置生效
可以使用`kubectl apply`或者`kubectl patch`命令让配置生效
本次演示patch命令,具体命令如下:
```
kubectl patch virtualservice user-service-vs --type=json -p='[
{"op": "add", "path": "/spec/http/0/route/0/weight", "value": 50},
{"op": "add", "path": "/spec/http/0/route/1/weight", "value": 50}
]'
```
![](https://img.kancloud.cn/95/d4/95d44c2b88975431cccc9de6d260e8f0_2106x236.png)
3. 打开kiali dashboard
选择Traffic Distribution,可以看到50%的流量去到了v1版本、另外50%流量去到v2版本
![](https://img.kancloud.cn/fa/0c/fa0c31b7eb7f7d6d847bf237ea8a40f7_1770x1258.png)