本文介绍如何通过ASM定义的虚拟服务目标规则配合完成蓝绿和灰度发布。

前提条件

创建目标规则

针对上述部署的Bookinfo示例,创建所需的目标规则,详情请参见管理目标规则。目标规则的配置信息如下。

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

创建虚拟服务

针对上述部署的Bookinfo示例,创建所需的虚拟服务,详情请参见管理虚拟服务。虚拟服务的配置信息如下。
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

蓝绿发布v2版本

创建目标规则和虚拟服务后,reviews的v2版本已经在运行,但还没有流量切换到v2版本,因此需要用蓝绿部署的方式,让v2版本上线。

针对上述部署的Bookinfo示例,创建蓝绿发布v2版本的虚拟服务,详情请参见管理虚拟服务。虚拟服务的配置信息如下。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2

部署完成后刷新页面,您可以看到book reviews已经有了评分,而且评分的星星为黑色。

按权重灰度发布v3版本

您可以让v2、v3版本同时在线,且两个版本各处理50%的流量。

针对上述部署的Bookinfo示例,创建灰度发布v3版本的虚拟服务,详情请参见管理虚拟服务。虚拟服务的配置信息如下。
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

部署完成后刷新页面,可以看到book reviews一栏v2,v3版本随机出现,v3版本的评分的星星为红色。

按请求内容灰度发布v3版本

只按照流量来简单的灰度还是不能满足很多场景,您还可以按照用户来灰度,不同的用户访问不同的页面。

针对上述部署的Bookinfo示例,创建灰度发布的虚拟服务,详情请参见管理虚拟服务。虚拟服务的配置信息如下。
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: v3
  - route:
    - destination:
        host: reviews
        subset: v2
部署完成后刷新页面,评分区的星星始终为黑色。此时,您可以单击右上角Sign in,以用户名jason登录(不需要输入密码),您可以看到评分区的星星变成红色。
说明 登录并访问后端服务时,会带上end-user=XXX的http header,使用jason登录后,匹配到了YAML的规则,使得流量被引导到了v3版本的reviews。