前提条件
- 已开通云容器引擎,至少有一个云容器引擎实例。产品入口:云容器引擎。
- 开通天翼云应用服务网格实例。
- 开通天翼云微服务引擎,并在服务网格控制面集群同VPC内创建云原生网关实例。产品入口:微服务引擎MSE。
操作步骤
部署多版本reviews服务
这里以bookinfo应用里面的reviews服务为例,使用istio资源实现对reviews服务的多版本路由,首先到云容器引擎控制台部署reviews服务的v2和v3版本,yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
withServiceMesh: "true"
spec:
replicas: 1
selector:
matchLabels:
name: reviews-v2
template:
metadata:
labels:
app: reviews
version: v2
name: reviews-v2
source: CCSE
"sidecar.istio.io/inject": "true"
csmAutoEnable: "on"
annotations:
"sidecar.istio.io/inject": "true"
spec:
containers:
- name: reviews
image: 'registry-vpc-crs-huadong1.cnsp-internal.ctyun.cn/library/istio-examples-bookinfo-reviews-v2:1.16.2'
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v3
labels:
withServiceMesh: "true"
spec:
replicas: 1
selector:
matchLabels:
name: reviews-v3
template:
metadata:
labels:
app: reviews
version: v3
name: reviews-v3
source: CCSE
"sidecar.istio.io/inject": "true"
csmAutoEnable: "on"
annotations:
"sidecar.istio.io/inject": "true"
spec:
containers:
- name: reviews
image: 'registry-vpc-crs-huadong1.cnsp-internal.ctyun.cn/library/istio-examples-bookinfo-reviews-v3:1.16.2'
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
通过云原生网关持续访问bookinfo应用可以看到前端页面在三种效果内跳变,分别对应reviews服务的三个版本:
(1)Review内没有评分。
(2)Review内有评分信息,评分的星星颜色是黑色。
(3)Review内有评分信息,评分的星星颜色是红色。
定义目标规则
通过定义目标规则(DestinationRule)为reviews服务在服务网格内定义多个版本;在网格控制台进入流量管理中心->目标规则,选择sample命名空间,使用yaml创建,选择版本负载均衡模板,基于reviews pod的version标签为reviews服务定义三个版本,配置如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
部分字段说明如下:
字段 | 说明 |
---|---|
Metadata.name | 目标规则的名称,namespace内唯一。 |
Spec.host | 该目标规则匹配的服务名。 |
Spec.subsets.name | 目标服务子集的名称。 |
Spec.subsets.labels | 目标服务子集匹配的pod标签。 |
定义虚拟服务规则
通过虚拟服务(VirtualService)为reviews服务定义路由规则,比如定义只访问v3版本的reviews服务,可以在流量管理中心->虚拟服务,选择sample命名空间,使用yaml创建,基于DestinationRule定义的三个subset,分配100%流量到v3版本,具体定义如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 0
- destination:
host: reviews
subset: v3
weight: 100
多次访问bookinfo应用可以看到前端样式无变化,reviews部分是带打分,且是红色的。
除了按比例在多个版本随机分配流量之外,还可以按照http匹配规则实现自定义的流量路由策略,比如匹配指定头部的访问路由到v2,其他请求路由到v3,可以按照如下方式修改虚拟服务定义:
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
访问bookinfo页面,当前登录用户为jason时,看到的reviews是v2版本,切换到另外一个登录用户jack时,看到的reviews是v3版本。