前提条件
操作步骤
这里以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.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.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: {}
部署完成后,在云容器引擎控制台可以看到reviews服务有三个部署版本:
通过云原生网关持续访问bookinfo应用可以看到前端页面在三种效果内跳变,分别对应reviews服务的三个版本,如下图:
Review内没有评分:
Review内有评分信息,颜色是黑色:
Review内有评分信息,颜色是红色:
部署完多个版本的服务之后,我们通过定义目标规则(DestinationRule)为reviews服务在服务网格内定义多个版本;在网格控制台进入流量管理中心->目标规则,选择sample命名空间,使用yaml创建,选择版本负载均衡模板,基于reviews pod的version标签为reviews服务定义三个版本,配置如下:
部分字段说明如下:
字段 | 说明 |
---|---|
Metadata.name | 目标规则的名称,namespace内唯一 |
Spec.host | 该目标规则匹配的服务名 |
Spec.subsets.name | 目标服务子集的名称 |
Spec.subsets.labels | 目标服务子集匹配的pod标签 |
配置完成后可以看到当前配置的目标规则列表:
下一步,我们为通过虚拟服务(VirtualService)为reviews服务定义路由规则,比如定义只访问v3版本的reviews服务,可以在流量管理中心->虚拟服务,选择sample命名空间,使用yaml创建,基于DestinationRule定义的三个subset,分配100%流量到v3版本,具体定义如下:
多次访问bookinfo应用可以看到前端样式无变化,reviews部分是带打分,且是红色的:
除了按比例在多个版本随机分配流量之外,还可以按照http匹配规则实现自定义的流量路由策略,比如匹配指定头部的访问路由到v3,其他请求路由到v2,可以按照如下方式修改虚拟服务定义:
访问bookinfo页面,当前登录用户为jason时,看到的reviews是v3版本:
切换到另外一个登录用户jack时,看到的reviews是v2版本: