當使用ASM管理多個叢集時,一個服務的工作負載可能會同時部署在多個叢集中。訪問服務時,流量預設在多叢集之間進行負載平衡。若您希望訪問服務時,流量只保持在本叢集中,可以使用叢集內流量保持功能。以Bookinfo應用為例,本文介紹如何在多叢集情境下啟用ASM本地叢集內流量保持功能。
準備工作
步驟一:配置叢集的互訪聯通性
(可選)修改叢集的安全性群組名稱
將兩個叢集對應的安全性群組名稱修改為易於辨識的名稱,方便後續配置。本樣本安全性群組名稱配置為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來提供服務。 |
說明 如果您為一個服務開啟了叢集內流量保持功能,當其它服務的工作負載訪問此服務時,將只能訪問到該服務在同叢集內的端點。即使該服務在同叢集內的端點不可用,訪問該服務的流量目標也不會降級到該服務在其它叢集的端點。
如果您希望為服務實現叢集內流量保持的效果,同時實現流量降級,請參考基於流量規則配置實現流量泳道和流量降級,使用流量規則為不同叢集中的服務建立流量泳道並實現流量降級。
相關操作
按照全域開啟叢集內流量保持功能
在基本資料頁面的配置資訊地區,單擊叢集內流量保持右側的編輯。
在配置叢集內流量保持服務對話方塊,開啟開啟保持叢集內流量的能力開關,選中全部服務生效,然後單擊確定。
開啟後,叢集的流量將保持在本叢集內。
按照命名空間開啟叢集內流量保持功能
在基本資料頁面的配置資訊地區,單擊叢集內流量保持右側的編輯。
在配置叢集內流量保持服務對話方塊,開啟開啟保持叢集內流量的能力開關,選中部分服務生效,然後單擊選擇服務。
在添加服務對話方塊,選中命名空間,在選擇服務地區,選中目標命名空間,單擊
表徵圖,然後單擊確定。
在配置叢集內流量保持服務對話方塊,單擊確定。
開啟後,訪問目標命名空間下服務的流量都將保持在本叢集內。
