应用服务网格

使用istio资源实现版本流量路由

2025-02-19 03:03:22

前提条件:

1.      已开通云容器引擎,至少有一个云容器引擎集群实例

2.      开通天翼云服务网格实例

3.      开通开通天翼云微服务引擎,并在服务网格控制面集群同VPC内创建云原生网关实例

操作步骤:

这里以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: 云容器引擎
        "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: 云容器引擎
        "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: {}

部署完成后,在云容器引擎控制台可以看到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版本:

j.rxJFZAXWro