Kubernetes+Istio:流量控制之灰度發布


准備環境

k8s和istio不想自己裝的話可以在雲上買個按量付費集群,用完即刪,推薦華為雲。

項目中用到的代碼

用的springboot+springcloud feign做rest強類型調用,放到github了

https://github.com/assionyang/istio-test.git

代碼結構說明

istio-service-union   #聚合服務項目,用來測試調用user服務,也做為入口
|-Dockerfile  #dockerfile
istio-service-user  #用戶服務,用來演示版本切換
|-Dockerfile  #dockerfile
istio-service-user-api #類庫,使用feign暴露client與dto,union服務依賴user-api
k8s #k8s&istio發布文件目錄
|-config
   |- istio-service-union.yaml   # union服務ConfigMap
   |- istio-service-user-v1.yaml # user服務v1版本ConfigMap
   |- istio-service-user-v2.yaml # user服務v2版本ConfigMap
|- istio-service-union-deployment.yaml #union無狀態發布
|- istio-service-union-service.yaml # union服務
|- istio-service-gateway.yaml # ingress網關,對外暴露union
|- istio-service-user-deployment-v1.yaml # user版本v1無狀態發布
|- istio-service-user-deployment-v2.yaml # user版本v2無狀態發布
|- istio-service-user-service.yaml # user服務
|- istio-service-user-virtualservice-v1.yaml #  user路由到v1版
|- istio-service-user-virtualservice-v2.yaml # user路由到v2版
|- istio-service-user-virtualservice-weight.yaml # user路由流量權重
|- istio-service-user-virtualservice-jsq.yaml # user路由金絲雀

測試步驟

1)打好user、union兩個項目的docker iamge並上傳鏡像倉庫

docker build -t istio-service-union:v1 .
docker tag istio-service-union:v1 swr.ap-southeast-1.myhuaweicloud.com/mk-develop/istio-service-union:v1
docker push swr.ap-southeast-1.myhuaweicloud.com/mk-develop/istio-service-union:v1
docker build -t istio-service-user:v1 .
docker tag istio-service-user:v1 swr.ap-southeast-1.myhuaweicloud.com/mk-develop/istio-service-user:v1
docker push swr.ap-southeast-1.myhuaweicloud.com/mk-develop/istio-service-user:v1

2) 創建ConfigMap配置項

kubectl apply -f config/istio-service-user-v1.yaml
kubectl apply -f config/istio-service-user-v2.yaml
kubectl apply -f config/istio-service-union.yaml

3)發布負載、服務、目標規則、網關

kubectl apply -f istio-service-user-deployment-v1.yaml #user服務v1版負載與目標規則
kubectl apply -f istio-service-user-deployment-v2.yaml #user服務v2版負載與目標規則
kubectl apply -f istio-service-user-service.yaml #user服務
kubectl apply -f istio-service-union-deployment.yaml #union負載
kubectl apply -f istio-service-union-service.yaml #union服務
kubectl apply -f istio-service-union-gateway.yaml #union網關,ingressgateway

第一步我們發布了應用與服務,創建了默認規則,並且通過ingressgateway對外暴露了endpoint,這時候默認的目標規則是輪訓user服務的v1和v2版本,我們可以測試幾次發現變化

{"userVersion":"v1","userException":""}
{"userVersion":"v2","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v2","userException":""}
……

 4)創建默認路由

kubectl apply -f istio-service-union-virtualservice-v1.yaml #使用v1版本

測試訪問結果,發現全部是v1版本

{"userVersion":"v1","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v1","userException":""}
kubectl apply -f istio-service-union-virtualservice-v2.yaml #使用v2版本

測試訪問結果,發現全部是v2版本

{"userVersion":"v2","userException":""}
{"userVersion":"v2","userException":""}
{"userVersion":"v2","userException":""}
{"userVersion":"v2","userException":""}

5)流量權重

kubectl apply -f istio-service-union-virtualservice-weight.yaml #使用流量權重路由,v1分70%流量,v2分30%流量

測試訪問結果,大致相同

{"userVersion":"v1","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v2","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v2","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v1","userException":""}
{"userVersion":"v2","userException":""}
{"userVersion":"v1","userException":""}

7)金絲雀發布

演示是跟據請求頭設置lab=assion來訪問v2版本,無此請求頭訪問v1版本。

注:因為我們使用的是feign,union通過feign調用user服務都不會帶上原始header的,需要做一下feign的透傳把header信息傳遞下去

kubectl apply -f istio-service-union-virtualservice-jsq.yaml #使用金絲雀發布,http header頭lab=assion訪問user v2版,不帶訪問user v1版

我們可以用postman測試一下看下效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM