准备工作
步骤一:配置集群的互访联通性
(可选)修改集群的安全组名称
将两个集群对应的安全组名称修改为易于辨识的名称,方便后续配置。本示例安全组名称配置为m1c1-sg和m1c2-sg。
展开查看如何修改集群的安全组名称
- 登录ECS控制台,然后在左侧导航栏,选择。 
- 在顶部菜单栏,选择目标ECS实例所在的地域。 
- 在安全组页面,将鼠标悬浮至目标安全组名称,单击 图标,输入名称,然后单击确定。 图标,输入名称,然后单击确定。
 
添加安全组访问规则
为两个集群添加安全组访问规则,使集群可以相互访问。在m1c1-sg安全组配置界面,添加以m1c2-sg为授权对象的访问规则;在m1c2-sg安全组规则配置界面,添加以m1c1-sg为授权对象的访问规则。具体操作,请参见添加安全组规则。
图 1. m1c1-sg安全组配置示例图
步骤二:添加集群到ASM实例并部署集群的入口网关
将两个集群添加到ASM实例后,两个集群已实现访问互通,因此只需为一个集群部署入口网关即可。
- 将两个集群添加到ASM实例。具体操作,请参见添加集群到ASM实例。 
- 为m1c1集群部署入口网关。具体操作,请参见创建入口网关。 
步骤三:在两个集群中分别部署Bookinfo应用
本文以在两个集群中分别部署Bookinfo应用为例,验证ASM集群内流量保持功能。两个集群中服务的区别为m1c1中Reviews组件为v1版本,m1c2中Reviews组件为v2版本,其他保持一致。
- 使用以下YAML,在m1c1中部署包含v1版本的Reviews Deployment的Bookinfo应用。具体操作,请参见在ASM实例关联的集群中部署应用。 - v1版本的Reviews Deployment在网页的书评区域,将不展示星形评分。 - 展开查看m1c1的Bookinfo应用YAML - apiVersion: v1
kind: Service
metadata:
  name: details
  labels:
    app: details
    service: details
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-details
  labels:
    account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: details-v1
  labels:
    app: details
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: details
      version: v1
  template:
    metadata:
      labels:
        app: details
        version: v1
        cluster: m1c1
    spec:
      serviceAccountName: bookinfo-details
      containers:
      - name: details
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-ratings
  labels:
    account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v1
  labels:
    app: ratings
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v1
  template:
    metadata:
      labels:
        app: ratings
        version: v1
        cluster: m1c1
    spec:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: reviews
  labels:
    app: reviews
    service: reviews
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-reviews
  labels:
    account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v1
  labels:
    app: reviews
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v1
  template:
    metadata:
      labels:
        app: reviews
        version: v1
        cluster: m1c1
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v1:1.20.1
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
      volumes:
      - name: wlp-output
        emptyDir: {}
      - name: tmp
        emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: productpage
  labels:
    app: productpage
    service: productpage
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-productpage
  labels:
    account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9080"
        prometheus.io/path: "/metrics"
      labels:
        app: productpage
        version: v1
        cluster: m1c1
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}
---
 
- 使用以下YAML,在m1c2中部署包含v2版本的Reviews Deployment的Bookinfo应用。 - v2版本的Reviews Deployment在网页的书评区域,将以黑白五角星的形式展示评分。 - 展开查看m1c2的Bookinfo应用YAML - apiVersion: v1
kind: Service
metadata:
  name: details
  labels:
    app: details
    service: details
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-details
  labels:
    account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: details-v1
  labels:
    app: details
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: details
      version: v1
  template:
    metadata:
      labels:
        app: details
        version: v1
        cluster: m1c2
    spec:
      serviceAccountName: bookinfo-details
      containers:
      - name: details
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-ratings
  labels:
    account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v1
  labels:
    app: ratings
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v1
  template:
    metadata:
      labels:
        app: ratings
        version: v1
        cluster: m1c2
    spec:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: reviews
  labels:
    app: reviews
    service: reviews
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-reviews
  labels:
    account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v2
  labels:
    app: reviews
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v2
  template:
    metadata:
      labels:
        app: reviews
        version: v2
        cluster: m1c2
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v2:1.20.1
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
      volumes:
      - name: wlp-output
        emptyDir: {}
      - name: tmp
        emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: productpage
  labels:
    app: productpage
    service: productpage
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-productpage
  labels:
    account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9080"
        prometheus.io/path: "/metrics"
      labels:
        app: productpage
        version: v1
        cluster: m1c2
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}
---
 
步骤四:在ASM中创建网关规则、虚拟服务和目标规则
- 使用以下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:
    - "*"
 
- 使用以下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
 
- 使用以下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
 
- 在浏览器访问http://{入口网关IP}/productpage1或http://{入口网关ip}/productpage2,并刷新网页。 - 若书评区域的星形评分交替出现,表明Bookinfo应用部署成功。 
 
操作步骤
下文以按照服务级别开启集群内流量保持功能为例,将请求Reviews服务的流量保持在本集群。关于按照全局或命名空间开启集群内流量保持功能的具体操作,请参见相关操作。
- 登录ASM控制台,在左侧导航栏,选择。 
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。 
- 在基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑。 
- 在配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中部分服务生效,然后单击选择服务。 
- 在添加服务对话框,选中服务,命名空间选择default,在选择服务区域,选中reviews,单击 图标,然后单击确定。 图标,然后单击确定。
 
- 配置完成后,在配置集群内流量保持服务对话框,单击确定。  
 - 在配置信息区域,集群内流量保持右侧显示已配置,表明集群内流量保持功能已开启。 
- 验证集群内流量保持功能是否生效。 - 在浏览器访问http://{入口网关IP}/productpage1,并刷新网页。 - 您可以看到书评区域始终不显示评分。 
 
- 在浏览器访问http://{入口网关IP}/productpage2,并刷新网页。 - 您可以看到书评区域始终只显示包含黑白星形评分。 
 
 
结果分析
集群内流量保持功能开启前后,网格中流量的调用链路示意图如下。
| 类型 | 说明 | 
| 未开启集群内流量保持功能 | 在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来提供服务。 | 
说明 如果您为一个服务开启了集群内流量保持功能,当其它服务的工作负载访问此服务时,将只能访问到该服务在同集群内的端点。即使该服务在同集群内的端点不可用,访问该服务的流量目标也不会降级到该服务在其它集群的端点。
如果您希望为服务实现集群内流量保持的效果,同时实现流量降级,请参考基于流量规则配置实现流量泳道和流量降级,使用流量规则为不同集群中的服务创建流量泳道并实现流量降级。
 相关操作
按照全局开启集群内流量保持功能
- 在基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑。 
- 在配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中全部服务生效,然后单击确定。 - 开启后,集群的流量将保持在本集群内。 
按照命名空间开启集群内流量保持功能
- 在基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑。 
- 在配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中部分服务生效,然后单击选择服务。 
- 在添加服务对话框,选中命名空间,在选择服务区域,选中目标命名空间,单击 图标,然后单击确定。 图标,然后单击确定。
 
- 在配置集群内流量保持服务对话框,单击确定。 - 开启后,访问目标命名空间下服务的流量都将保持在本集群内。 