当前位置:   article > 正文

四、Istio 实现灰度发布_istio 实现灰度发布 项目实战

istio 实现灰度发布 项目实战

灰度发布(金丝雀发布)

只升级部分服务,即让一部分用户继续用老版本,一 部分用户开始用新版本,如果用户对新版本没有什么 意见,那么逐步扩大范围,把所有用户都迁移到新版 本上面来。
特点:
• 保证整体系统稳定性
• 用户无感知,平滑过渡
缺点:
• 自动化要求高
在这里插入图片描述

灰度发布(A/B Test)

灰度发布的一种方式,主要对特定用户采样后,对收 集到的反馈数据做相关对比,然后根据比对结果作出 决策。用来测试应用功能表现的方法,侧重应用的可 用性,受欢迎程度等,最后决定是否升级。
这种发布方式主要是面向业务功能侧的发布,比如部分用户能进行新版本体验等。
在这里插入图片描述

Istio 实现灰度发布

实现灰度发布前,我们先熟悉虚拟服务(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个红色五角星)

在这里插入图片描述

任务1

流量全部发送到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
---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

其中: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
  • 1
  • 2
  • 3
  • 4
  • 5

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
---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

因为我们需要变更的组件为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
  • 1
  • 2
  • 3
  • 4
  • 5

此时我们页面无论怎么刷新都将只会出现不带五角星的界面。

任务2

将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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

其中的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
  • 1
  • 2

此时我们页面多次刷新都将出现黑色五角星的概率是10%。
3、更改VirtualService将流量完全切换到v2版本
此时我们只需要将权重更改下,v1设置weight为0,v2设置weight为100
此时我们页面多次刷新都将出现黑色五角星的概率是100%

任务3

将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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

通过配置文件可以看到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
  • 1
  • 2

此时我们页面多次刷新都将出现黑色五角星和红色五角星的概率分别是对半。

基于请求内容的路由(A/B Test)发布

任务:
将特定用户的请求发送到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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

其中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
  • 1
  • 2

此时我们登录jason用户才会显示reviews v2版本(5个黑色五 角星),其他的全是v3版本。

其他的(A/B Test)发布示例图:
在这里插入图片描述

经过上面的实践,我们可以得知灰度发布的基本流程:
需引入了一个服务版本标签
1、使用deployment部署服务,pod标签加上version.
2、创建istio的资源。
3、创建一个灰度版本,version
4、destination-rule规则,关联所有的版本(在用的版本和灰度版本)
5、virtualservice规则,说明路由策略(按请求内容还是百分比? )

我们搞完了灰度发布,其实还是需要借助了一些平台将灰度发布完全自动化。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/483348
推荐阅读
相关标签
  

闽ICP备14008679号