[TOC]
# 一、概述
基于Istio,我们可以实现部署新版本服务时,但现有流量还是请求到现有版本服务
* 金丝雀部署:大部分用户请求到旧服务,部分白名单用户请求到新版本服务,白名单验收通过后,其他非白名单用户慢慢路由到新版本服务,开始灰度,最后全量
* 蓝绿部署:用户被分为蓝、绿版本,分别对应服务的新老版本,基于百分比来划分用户进行灰度放量,比如一开始20%用户去到新版本服务,如果有问题,则调整百分比
本次演示假定现有的服务是v1版本,新服务为v2版本
先发布v2版本
进行白名单验收功能
开始调整流量到v2版本服务
# 二、整体思路
总体思路就是把Deployment分为v1、v2版本,VirtualService里通过调整权重做分流
配置文件见`kubernetes/services/overlays/prod`

运行:`./kubernetes/scripts/deploy-prod.bash`,自动部署v1版本的服务,
打开kiali的dashboard,可以看到服务的调用关系:

# 三、同时部署v1、v2版本服务
下面演示放开注释的代码,同时部署v1和v2版本服务
`kubernetes/scripts/deploy-prod.bash`脚本默认不部署v2版本服务,需要部署则把注释的脚步放开:

放开后运行`./kubernetes/scripts/deploy-prod.bash`,运行成功后,同时部署了v1、v2版本的服务


其中redis、MySQL服务是共用的,只有一个版本
# 四、灰度测试
以user-service为例,默认v1权重100,v2为0,即流量全部去到v1版本,具体见`kubernetes/services/overlays/prod/istio/user-service-routing-virtual-service.yml`
1. 修改配置
现在调整权重为各50,实际情况应该从小比例开始灰度,如1

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}
]'
```

3. 打开kiali dashboard
选择Traffic Distribution,可以看到50%的流量去到了v1版本、另外50%流量去到v2版本

