本文介绍如何通过ASM定义的虚拟服务和目标规则配合完成蓝绿和灰度发布。
前提条件
- 创建至少一个ASM实例,详情请参见创建ASM实例。
- 添加至少一个ACK集群到ASM实例中,详情请参见添加集群到ASM实例。
- 部署Bookinfo应用示例到ASM实例下管理的ACK集群中,详情请参见在ASM实例关联的集群中部署应用。
- 在ASM实例的ACK集群中部署入口网关,详情请参见创建入口网关。
创建目标规则
针对上述部署的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。