多集群场景下启用ASM本地集群内流量保持功能

当使用ASM管理多个集群时,一个服务的工作负载可能会同时部署在多个集群中。访问服务时,流量默认在多集群之间进行负载均衡。若您希望访问服务时,流量只保持在本集群中,可以使用集群内流量保持功能。以Bookinfo应用为例,本文介绍如何在多集群场景下启用ASM本地集群内流量保持功能。

前提条件

  • 已在同一VPC下创建两个ACK集群(本文以m1c1和m1c2为例)。具体操作,请参见创建Kubernetes专有版集群

  • 已创建一个ASM实例,且版本为1.15.3.101及以上(本文以mesh1为例)。具体操作,请参见创建ASM实例

准备工作

步骤一:配置集群的互访联通性

(可选)修改集群的安全组名称

将两个集群对应的安全组名称修改为易于辨识的名称,方便后续配置。本示例安全组名称配置为m1c1-sgm1c2-sg

展开查看如何修改集群的安全组名称

  1. 登录ECS控制台,然后在左侧导航栏,选择网络与安全 > 安全组

  2. 在顶部菜单栏,选择目标ECS实例所在的地域。

  3. 安全组页面,将鼠标悬浮至目标安全组名称,单击image图标,输入名称,然后单击确定

添加安全组访问规则

为两个集群添加安全组访问规则,使集群可以相互访问。在m1c1-sg安全组配置界面,添加以m1c2-sg为授权对象的访问规则;在m1c2-sg安全组规则配置界面,添加以m1c1-sg为授权对象的访问规则。具体操作,请参见添加安全组规则

图 1. m1c1-sg安全组配置示例图11

步骤二:添加集群到ASM实例并部署集群的入口网关

将两个集群添加到ASM实例后,两个集群已实现访问互通,因此只需为一个集群部署入口网关即可。

  1. 将两个集群添加到ASM实例。具体操作,请参见添加集群到ASM实例

  2. 为m1c1集群部署入口网关。具体操作,请参见创建入口网关

步骤三:在两个集群中分别部署Bookinfo应用

本文以在两个集群中分别部署Bookinfo应用为例,验证ASM集群内流量保持功能。两个集群中服务的区别为m1c1中Reviews组件为v1版本,m1c2中Reviews组件为v2版本,其他保持一致。

  1. 使用bookinfo-with-reviews-v1.yaml,在m1c1中部署包含v1版本的Reviews Deployment的Bookinfo应用。具体操作,请参见在ASM实例关联的集群中部署应用

    v1版本的Reviews Deployment在网页的书评区域,将不展示星形评分。

  2. 使用bookinfo-with-reviews-v2.yaml,在m1c2中部署包含v2版本的Reviews Deployment的Bookinfo应用。

    v2版本的Reviews Deployment在网页的书评区域,将以黑白五角星的形式展示评分。

步骤四:在ASM中创建网关规则、虚拟服务和目标规则

  1. 使用以下YAML,在ASM实例的default命名空间下创建网关规则。具体操作,请参见管理网关规则

    展开查看网关规则YAML

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
  2. 使用以下YAML,在ASM实例的default命名空间下创建虚拟服务。具体操作,请参见管理虚拟服务

    展开查看虚拟服务YAML

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo-cluster-local
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage1
        rewrite:
          uri: /productpage
        route:
        - destination:
            host: productpage
            port:
              number: 9080
            subset: m1c1
      - match:
        - uri:
            exact: /productpage2
        rewrite:
          uri: /productpage
        route:
        - destination:
            host: productpage
            port:
              number: 9080
            subset: m1c2
      - match:
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
  3. 使用以下YAML,在ASM实例的default命名空间下创建目标规则。具体操作,请参见管理目标规则

    展开查看目标规则YAML

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: productpage-cluster-local
    spec:
      host: productpage
      subsets:
      - name: m1c1
        labels:
          cluster: m1c1
      - name: m1c2
        labels:
          cluster: m1c2
  4. 在浏览器访问http://{入口网关IP}/productpage1http://{入口网关ip}/productpage2,并刷新网页。

    关于如何查看入口网关IP,请参见创建入口网关

    若书评区域的星形评分交替出现,表明Bookinfo应用部署成功。访问productpage页面

操作步骤

下文以按照服务级别开启集群内流量保持功能为例,将请求Reviews服务的流量保持在本集群。关于按照全局或命名空间开启集群内流量保持功能的具体操作,请参见相关操作

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

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 基本信息

  3. 基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑

    配置集群内流量保持

  4. 配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中部分服务生效,然后单击选择服务

  5. 添加服务对话框,选中服务命名空间选择default,在选择服务区域,选中reviews,单击添加图标,然后单击确定

    添加服务

  6. 配置完成后,在配置集群内流量保持服务对话框,单击确定

    配置集群内流量保持服务

    配置信息区域,集群内流量保持右侧显示已配置,表明集群内流量保持功能已开启。

  7. 验证集群内流量保持功能是否生效。

    1. 在浏览器访问http://{入口网关IP}/productpage1,并刷新网页。

      您可以看到书评区域始终不显示评分。验证流量保持-1

    2. 在浏览器访问http://{入口网关IP}/productpage2,并刷新网页。

      您可以看到书评区域始终只显示包含黑白星形评分。验证集群内流量保持-2

    以上结果表明集群内流量保持功能生效。

结果分析

集群内流量保持功能开启前后,网格中流量的调用链路示意图如下。网格中流量的调用链路分析

类型

说明

未开启集群内流量保持功能

在Bookinfo应用中,Productpage组件会调用Reviews服务以获取书评信息。在浏览器访问http://{入口网关IP}/productpage1时,会访问m1c1集群中的Productpage;在浏览器访问http://{入口网关IP}/productpage2时,会访问m1c2集群中的Productpage。

在m1c1和m1c2两个集群中都存在Reviews服务的工作负载。默认情况下,即使访问某个特定集群(例如m1c1集群中的Productpage),对Reviews服务的请求也会在两个集群之间进行负载均衡。您可以在Productpage页面的书评区域交替看到星形评分信息。

已开启集群内流量保持功能

访问某个特定集群时(例如m1c1集群中的Productpage),对Reviews服务的请求不会在两个集群之间进行负载均衡。您可以看到在Productpage页面的书评区域始终不显示评分,不会出现交替星形评分信息的情况。

重要

流量保持功能开启后,如果m1c1集群中的Reviews-v1因故障等原因下线,Productpage无法通过访问m1c2集群中的Reviews-v2来提供服务。

说明

如果您为一个服务开启了集群内流量保持功能,当其它服务的工作负载访问此服务时,将只能访问到该服务在同集群内的端点。即使该服务在同集群内的端点不可用,访问该服务的流量目标也不会降级到该服务在其它集群的端点。

如果您希望为服务实现集群内流量保持的效果,同时实现流量降级,请参考基于流量规则配置实现流量泳道和流量降级,使用流量规则为不同集群中的服务创建流量泳道并实现流量降级。

相关操作

按照全局开启集群内流量保持功能

  1. 基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑

  2. 配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中全部服务生效,然后单击确定

    开启后,集群的流量都将保持在本集群内。

按照命名空间开启集群内流量保持功能

  1. 基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑

  2. 配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中部分服务生效,然后单击选择服务

  3. 添加服务对话框,选中命名空间,在选择服务区域,选中目标命名空间,单击添加图标,然后单击确定

  4. 配置集群内流量保持服务对话框,单击确定

    开启后,访问目标命名空间下服务的流量都将保持在本集群内。

    按命名空间开启