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

版本流量路由是指将流量按照比例路由到服务的不同版本,适用于灰度发布和A/B测试等场景。本文介绍如何使用Istio资源实现版本流量路由。

前提条件

步骤一:创建网关规则

网关规则(Gateway)定义了在网格出入口操作的负载均衡器,用于接收传入或传出的HTTP/TCP连接。下文介绍如何创建网关规则,并将其绑定到入口网关。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 网关规则,然后单击创建

  3. 创建页面,进行以下配置,然后单击创建

    关于配置项的详情,请参见网关规则(Gateway)CRD说明

    配置项

    说明

    基本信息

    配置命名空间default,网关规则的名称bookinfo-gateway

    作用网关实例

    配置标签名istio标签值ingressgateway

    对外提供服务

    配置名称http端口80协议HTTP服务*

    网关规则

    以上配置对应的网关规则YAML如下。

    展开查看网关规则YAML

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: bookinfo-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
            - '*'
    

步骤二:创建虚拟服务

虚拟服务(VirtualService)定义流量路由规则和请求转发策略。创建虚拟服务后,您可以通过/productpage/static/login/logout/api/v1/products路径访问Bookinfo应用。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 虚拟服务,然后单击创建

  3. 创建页面,进行以下配置,然后单击创建

    关于配置项的详情,请参见虚拟服务(Virtual Service)CRD说明

    配置项

    说明

    基本信息

    命名空间

    本示例选择default

    名称

    自定义虚拟服务的名称。

    作用范围

    1. 打开作用于指定网关规则开关,单击请选择网关规则

    2. 请选择网关规则对话框,选中bookinfo-gateway,单击添加图标,然后单击确定

    3. 关闭作用于所有Sidecar开关。

    所属服务

    单击选择所属网关服务域名,在选择所属网关服务域名对话框,选中*,单击添加图标,然后单击确定

    HTTP路由

    路由名称

    单击HTTP路由,单击添加路由,自定义路由名称

    请求匹配规则

    重复单击添加请求匹配规则,配置如下五条规则:

    • 打开匹配请求的URI开关,配置匹配方式精确匹配内容/productpage

    • 打开匹配请求的URI开关,配置匹配方式前缀匹配内容/static

    • 打开匹配请求的URI开关,配置匹配方式精确匹配内容/login

    • 打开匹配请求的URI开关,配置匹配方式精确匹配内容/logout

    • 打开匹配请求的URI开关,配置匹配方式前缀匹配内容/api/v1/products

    路由目的地

    单击添加路由目的地,配置服务名称productpage端口9080

    创建虚拟服务.png

    以上配置对应的虚拟服务YAML如下。

    展开查看虚拟服务YAML

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-demo
      namespace: default
    spec:
      hosts:
        - '*'
      http:
        - name: gw-to-productage
          match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
          route:
            - destination:
                host: productpage
                port:
                  number: 9080
      gateways:
        - bookinfo-gateway
    

步骤三:访问Bookinfo应用

  1. 获取入口网关地址。

    方式一:通过ASM控制台

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

    3. 入口网关页面,获取服务地址。

    方式二:通过容器服务管理控制台

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 服务

    3. 服务页面顶部,选择命名空间istio-system,在External IP列,查看istio-ingressgateway对应的80端口的IP地址。

  2. 在浏览器地址栏,输入http://{入口网关服务的IP地址}/productpage,持续刷新页面10次,访问Bookinfo应用。

    Bookinfo应用会访问reviews服务的v1、v2、v3版本。您可以看到reviews服务三个版本出现的比例接近1:1:1。

步骤四:创建版本路由规则

  1. 创建目标规则,按版本给reviews服务进行分组,分为v1、v2、v3子集。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 目标规则,然后单击创建

    3. 创建页面,进行以下配置,然后单击创建

      关于配置项的详情,请参见目标规则(Destination Rule)CRD说明

      配置项

      说明

      基本信息

      配置命名空间default,自定义目标规则的名称,配置服务名称reviews

      服务版本(子集)

      单击服务版本(子集),重复单击添加服务版本(子集),配置如下三个版本。

      • 版本1:配置版本名称v1,单击添加标签,配置标签名version标签值v1

      • 版本2:配置版本名称v2,单击添加标签,配置标签名version标签值v2

      • 版本3:配置版本名称v3,单击添加标签,配置标签名version标签值v3

      目标规则

      以上配置对应的目标规则YAML如下。

      展开查看目标规则YAML

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: reviews
        namespace: default
        labels: {}
      spec:
        host: reviews
        subsets:
          - name: v1
            labels:
              version: v1
          - name: v2
            labels:
              version: v2
          - name: v3
            labels:
              version: v3
      
  2. 创建虚拟服务,将10%流量路由到reviews服务的v1版本,40%流量路由到reviews服务的v2版本,50%流量路由到reviews服务的v3版本。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 虚拟服务,然后单击创建

    3. 创建页面,进行以下配置,然后单击创建

      配置项

      说明

      基本信息

      命名空间

      本示例选择default

      名称

      自定义虚拟服务的名称。

      作用范围

      打开作用于所有Sidecar开关。

      所属服务

      单击添加所属服务,在添加所属服务对话框,配置命名空间default,在添加所属服务区域,选中reviews服务,单击添加图标,然后单击确定

      HTTP路由

      路由名称

      单击HTTP路由,单击添加路由,自定义路由名称

      路由目的地

      重复单击添加路由目的地,配置如下三个路由目的地。

      • 配置服务名称reviews,版本为v1,权重为10

      • 配置服务名称reviews版本v2权重40

      • 配置服务名称reviews版本v3权重50

      虚拟服务2

      以上配置对应的虚拟服务YAML如下。

      展开查看虚拟服务YAML

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: reviews
        namespace: default
      spec:
        hosts:
          - reviews.default.svc.cluster.local
        http:
          - name: route
            route:
              - destination:
                  host: reviews
                  subset: v1
                weight: 10
              - destination:
                  host: reviews
                  subset: v2
                weight: 40
              - destination:
                  host: reviews
                  subset: v3
                weight: 50

步骤五:验证版本流量路由是否成功

在浏览器地址栏,输入http://{入口网关服务的IP地址}/productpage,持续刷新页面10次。

若reviews服务的v1、v2、v3三个版本出现的比例接近1:4:5,表明版本流量路由成功。