赞
踩
只升级部分服务,即让一部分用户继续用老版本,一 部分用户开始用新版本,如果用户对新版本没有什么 意见,那么逐步扩大范围,把所有用户都迁移到新版 本上面来。
特点:
• 保证整体系统稳定性
• 用户无感知,平滑过渡
缺点:
• 自动化要求高
灰度发布的一种方式,主要对特定用户采样后,对收 集到的反馈数据做相关对比,然后根据比对结果作出 决策。用来测试应用功能表现的方法,侧重应用的可 用性,受欢迎程度等,最后决定是否升级。
这种发布方式主要是面向业务功能侧的发布,比如部分用户能进行新版本体验等。
实现灰度发布前,我们先熟悉虚拟服务(VirtualService),目标规则(destination rule),deployment/service,之间的标签指向联系,如下所示:
1、其中VirtualService配置中的“host:reviews”对应destination rule配置中的“host:reviews”,
2、其中VirtualService配置中的“subset:v1"对应destination rule配置中的"subsets: -name:v1",他对应destination rule中的服务子集,有了subset就会用到DestinationRule。
3、其中destination rule配置中的“host:reviews”对应k8s中k8s中的service “reviews”,对应的是规则作用的istio注册表中的服务(svc)
4、destination rule配置中的"labels: version:v1"对应k8s中的deployment中的”- version:v1"。对应的subset1,将流量转发到具有标签version:v1的deployment对应的服务上。
任务1:流量全部发送到reviews v1版本(不带五角星)
任务2:将90%的流量发送到reviews v1版本,另外10%的流 量发送到reviews v2版本(5个黑色五角星),最后完 全切换到v2版本
任务3:将50%的流量发送到v2版本,另外50%的流量发送到 v3版本(5个红色五角星)
流量全部发送到reviews v1版本(不带五角星)
1、查看虚拟服务VirtualService配置文件
[root@master networking]# cat virtual-service-all-v1.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: productpage spec: hosts: - productpage http: - route: - destination: host: productpage subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: details spec: hosts: - details http: - route: - destination: host: details subset: v1 ---
其中:subset: v1表示v1版本的一个集合,用于对应destination-rule中的subsets名称,
2、更新4个bookinfo的组件VirtualService
[root@master networking]# kubectl apply -f virtual-service-all-v1.yaml -n bookinfo
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created
3、查看目标规则destination rule配置:
[root@master networking]# cat destination-rule-all.yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: productpage spec: host: productpage subsets: - name: v1 labels: version: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ratings spec: host: ratings subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v2-mysql labels: version: v2-mysql - name: v2-mysql-vm labels: version: v2-mysql-vm --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: details spec: host: details subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 ---
因为我们需要变更的组件为reviews ,所以我们查看reviews的DestinationRule中定义了三组标签,其中subsets中的“name:v1”匹配上VirtualService中“subset: v1”,“version: v1”对应匹配的是deployment中的"version:v1"。
4、更新destination rule文件
kubectl apply -f destination-rule-all.yaml -n bookinfo
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
此时我们页面无论怎么刷新都将只会出现不带五角星的界面。
将90%的流量发送到reviews v1版本,另外10%的流 量发送到reviews v2版本(5个黑色五角星),最后完 全切换到v2版本
1、查看虚拟服务VirtualService配置文件
[root@master networking]# cat virtual-service-reviews-90-10.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 90 - destination: host: reviews subset: v2 weight: 10
其中的weight代表权重,表示v1的权重为90,v2的权重为10,根据istio的智能路由策略智能分流。
2、更新VirtualService文件。
[root@master networking]# kubectl apply -f virtual-service-reviews-90-10.yaml -n bookinfo
virtualservice.networking.istio.io/reviews configured
此时我们页面多次刷新都将出现黑色五角星的概率是10%。
3、更改VirtualService将流量完全切换到v2版本
此时我们只需要将权重更改下,v1设置weight为0,v2设置weight为100
此时我们页面多次刷新都将出现黑色五角星的概率是100%
将50%的流量发送到v2版本,另外50%的流量发送到 v3版本(5个红色五角星)
1、查看虚拟服务VirtualService配置文件
[root@master networking]# cat virtual-service-reviews-v2-v3.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v2 weight: 50 - destination: host: reviews subset: v3 weight: 50
通过配置文件可以看到v2和v3都权重分别都是50
2、更新VirtualService文件。
[root@master networking]# kubectl apply -f virtual-service-reviews-v2-v3.yaml -n bookinfo
virtualservice.networking.istio.io/reviews created
此时我们页面多次刷新都将出现黑色五角星和红色五角星的概率分别是对半。
任务:
将特定用户的请求发送到reviews v2版本(5个黑色五 角星),其他用户则不受影响(v3)
1、查看虚拟服务VirtualService配置文件
[root@master networking]# cat virtual-service-reviews-jason-v2-v3.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v3
其中match模块表示的是正则模块,"headers:"表示的是请求头,下面的含义表示用户是jason的将流量导入v2,其他的流量则全部导入v3
2、更新VirtualService文件
[root@master networking]# kubectl apply -f virtual-service-reviews-jason-v2-v3.yaml -n bookinfo
virtualservice.networking.istio.io/reviews configured
此时我们登录jason用户才会显示reviews v2版本(5个黑色五 角星),其他的全是v3版本。
其他的(A/B Test)发布示例图:
经过上面的实践,我们可以得知灰度发布的基本流程:
需引入了一个服务版本标签
1、使用deployment部署服务,pod标签加上version.
2、创建istio的资源。
3、创建一个灰度版本,version
4、destination-rule规则,关联所有的版本(在用的版本和灰度版本)
5、virtualservice规则,说明路由策略(按请求内容还是百分比? )
我们搞完了灰度发布,其实还是需要借助了一些平台将灰度发布完全自动化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。