准备工作
步骤一:配置集群的互访联通性
(可选)修改集群的安全组名称
将两个集群对应的安全组名称修改为易于辨识的名称,方便后续配置。本示例安全组名称配置为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来提供服务。 |
说明 如果您为一个服务开启了集群内流量保持功能,当其它服务的工作负载访问此服务时,将只能访问到该服务在同集群内的端点。即使该服务在同集群内的端点不可用,访问该服务的流量目标也不会降级到该服务在其它集群的端点。
如果您希望为服务实现集群内流量保持的效果,同时实现流量降级,请参考基于流量规则配置实现流量泳道和流量降级,使用流量规则为不同集群中的服务创建流量泳道并实现流量降级。
相关操作
按照全局开启集群内流量保持功能
在基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑。
在配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中全部服务生效,然后单击确定。
开启后,集群的流量将保持在本集群内。
按照命名空间开启集群内流量保持功能
在基本信息页面的配置信息区域,单击集群内流量保持右侧的编辑。
在配置集群内流量保持服务对话框,打开开启保持集群内流量的能力开关,选中部分服务生效,然后单击选择服务。
在添加服务对话框,选中命名空间,在选择服务区域,选中目标命名空间,单击
图标,然后单击确定。
在配置集群内流量保持服务对话框,单击确定。
开启后,访问目标命名空间下服务的流量都将保持在本集群内。
