[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版本
