通過服務網格 ASM,可以將一個應用的服務組件部署在同 VPC 的多個集群上。本文以 Bookinfo 應用為例,介紹如何將該應用部署到包含兩個集群的 ASM 實例。
前提條件
- 在同一 VPC 下已創建兩個 ACK 集群(本例中 asm-zjk-prod3-c1 和 asm-zjk-prod3-c2),詳情參見創建 Kubernetes 集群。
- 已創建一個 ASM 實例(本例中為 asm-zjk-prod3),詳情參見創建 ASM 實例。
步驟一:修改集群的安全組名稱
將兩個集群對應的安全組名稱修改為易於辨識的名稱,本例中為 asm-zjk-prod3-c1-sg和asm-zjk-prod3-c2-sg。
- 登錄ECS管理控制檯。
- 在左側導航欄,單擊網絡與安全 > 安全組。
- 在頂部狀態欄左上角處,選擇地域。
- 在安全組列表頁面中,找到需要修改的安全組,單擊操作列下的修改。
- 在彈出的對話框中,修改安全組名稱和描述。
單擊確定。 - 修改後的名稱,如下圖所示。
步驟二:配置集群的互訪聯通性
為了使兩個集群能夠互相訪問,需要為彼此添加安全組訪問規則。
- 在 asm-zjk-prod3-c1-sg 安全組配置界面,添加以 asm-zjk-prod3-c2-sg 為授權對象的訪問規則。詳情參見添加安全組規則。
- 添加規則之後的結果,如圖所示:
- 同樣地,在 asm-zjk-prod3-c2-sg 安全組規則配置界面,添加以 asm-zjk-prod3-c1-sg 為授權對象的訪問規則。
步驟三:添加集群到 ASM 實例並部署集群的入口網關
將兩個集群添加到 ASM 實例後,由於兩個集群已實現訪問互通,因此只需為一個集群部署入口網關。
- 將兩個集群添加到 ASM 實例,詳情參見添加集群到 ASM 實例。
- 在其中一個集群中部署入口網關,詳情參見添加入口網關。
步驟四:部署 Bookinfo 應用
為了體驗ASM 跨集群的應用部署能力,Bookinfo 應用的不同微服務分別被部署在兩個集群上。
- 在 第二個集群asm-zjk-prod3-c1 中部署不包含 review-v3 deployment 的 Bookinfo 應用,詳情參見部署應用到 ASM 實例。
說明: Review-v3 deployment 對應的功能是書評中顯示紅色星。
- 對應的 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
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: docker.io/istio/examples-bookinfo-details-v1:1.15.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
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
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: docker.io/istio/examples-bookinfo-ratings-v1:1.15.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
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
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v1:1.15.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
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
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v2:1.15.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
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:
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.15.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
- 在集群asm-zjk-prod3-c2 中部署 review-v3 以及 rating service(review 依賴的服務)。
- 對應的 YAML文件內容如下所示:
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-v3
labels:
app: reviews
version: v3
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v3
template:
metadata:
labels:
app: reviews
version: v3
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v3:1.15.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
步驟五:添加虛擬服務和 Istio 服務網關
- 在 ASM 實例的 default 命名空間下新建一個虛擬服務,名為 bookinfo,詳情參見管理 Istio 資源定義。
對應的 Yaml 文件內容如下所示:
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
- 在 ASM 實例的 default 命名空間下新建一個 Istio 網關,名為 bookinfo-gateway,詳情參見管理 Istio 資源定義。
對應的 Yaml 文件內容如下所示:
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:
- "*"
- 訪問 productpage 頁面,刷新頁面時會輪流顯示 reviews 的 3 個版本。雖然 review-v3 和其他服務不在同一個集群中,也可以正常顯示。
步驟六:修改流量路由規則
通過定義目標規則和虛擬服務,可以定義 Bookinfo 應用的微服務部署策略。本例中將指定 Bookinfo 總是使用 review v3 版本。
- 在 ASM 實例的 default 命名空間下新建一個目標規則,名為 reviews。
Yaml 文件的內容如下所示:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
- 在 ASM 實例的 default 命名空間下新建一個虛擬服務,名為 reviews。
對應的 Yaml 文件內容如下所示:
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
此時訪問 productpage 頁面,reviews 將按照50:50的比例使用 v2和v3 版本,即書評中為黑色和紅色星。