通过定义Istio资源,可以实现服务网格ASM的流量治理、鉴权以及安全保护等功能。本文介绍如何定义虚拟服务、服务网关、目标规则这三种Istio资源,以实现相应的流量路由策略。

前提条件

步骤一:定义虚拟服务

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 控制平面区域,单击虚拟服务页签,然后单击新建
  5. 新建页面,按以下步骤定义虚拟服务,然后单击确定
    1. 选择相应的命名空间。
      本文以选择default命名空间为例。
    2. 在文本框中,定义Istio虚拟服务。可参考以下YAML定义,详情请参见Istio官方示例
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: bookinfo
      spec:
        hosts:
        - "*"
        gateways:
        - bookinfo-gateway
        http:
        - 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
    虚拟服务页签可以看到新建的bookinfo服务。

步骤二:定义服务网关

  1. 控制平面区域,单击服务网关页签,然后单击新建
  2. 新建页面中,按以下步骤定义服务网关,然后单击确定
    1. 选择相应的命名空间。
      本文以选择default命名空间为例。
    2. 在文本框中,定义服务网关。可参考以下YAML定义,详情请参见Istio官方示例
      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: bookinfo-gateway
      spec:
        selector:
          istio: ingressgateway # use istio default controller
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
    服务网关页签可以看到新建的bookinfo-gateway网关。
  3. 查看入口网关服务的IP地址。
    1. 登录容器服务管理控制台
    2. 在左侧导航栏,选择路由与负载均衡 > 服务
    3. 服务(Service)页面,从集群下拉列表中选择部署入口网关的集群,然后在命名空间下拉列表中选择istio-system
    4. 查看名为istio-ingressgateway服务所对应的外部端点信息,即是入口网关服务的IP地址。
    说明 您也可以通过kubectl客户端查询入口网关服务的IP地址。关于如何连接集群,请参见通过kubectl连接Kubernetes集群。在对应部署入口网关的集群的环境下,执行以下命令。
    kubectl get service istio-ingressgateway -n istio-system -o jsonpath="{.status.loadBalancer.ingress[*].ip}"
  4. 在浏览器地址栏输入http://{入口网关服务的IP地址}/productpage,验证路由策略。
    在虚拟服务中未定义Reviews微服务路由策略的情况下,3个版本之间默认的流量路由策略是轮询。因此持续刷新页面可以依次看到以下3个版本:
    • v1版本不会调用Ratings服务。
    • v2版本会调用Ratings服务,并使用1到5个黑色星形图标来显示评分信息。
    • v3版本会调用Ratings服务,并使用1到5个红色星形图标来显示评分信息。

步骤三:增加虚拟服务

增加虚拟服务,定义新的流量路由策略,从而实现在微服务的指定版本之间按照不同的权重分发流量。

  1. 控制平面区域,单击虚拟服务页签,然后单击新建
  2. 新建页面中,按以下步骤定义虚拟服务,然后单击确定
    1. 选择相应的命名空间。
      本文以选择default命名空间为例。
    2. 在文本框中,定义虚拟服务。可参考以下YAML定义,详情请参见Istio官方示例
      示例说明:将Reviews微服务的流量按照50%的权重分别指向v2和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
    虚拟服务页签可以看到新建的reviews虚拟服务。

步骤四:定义目标规则

通过定义目标规则,可以指定微服务在多个节点间的负载均衡策略。

  1. 控制平面区域,单击目标规则页签,然后单击新建
  2. 新建页面中,按以下步骤定义目标规则,然后单击确定
    1. 选择相应的命名空间。
      本文以选择default命名空间为例。
    2. 在文本框中,定义目标规则。可参考以下YAML定义,详情请参见Istio官方示例
      示例说明:定义Reviews的三个版本微服务的负载均衡策略分别为,轮询(ROUND ROBIN,未定义时的默认策略)、最少连接数(LEAST_CONN)和随机(RANDOM)。
      apiVersion: networking.istio.io/v1alpha3
      kind: DestinationRule
      metadata:
        name: reviews
      spec:
        host: reviews
        subsets:
        - name: v1
          labels:
            version: v1
        - name: v2
          labels:
            version: v2
          trafficPolicy:
            loadBalancer:
              simple: LEAST_CONN  
        - name: v3
          labels:
            version: v3
          trafficPolicy:
            loadBalancer:
              simple: RANDOM
    目标规则页签可以看到新建的reviews目标规则。

执行结果

在浏览器地址栏输入http://{入口网关服务的IP地址}/productpage,持续刷新,可以看到Bookinfo应用页面在v2和v3之间等权重地轮流切换,显示为黑色星形图标或者红色星形图标。