通过服务网格 ASM,可以将一个应用的服务组件部署在同 VPC 的多个集群上。本文以 Bookinfo 应用为例,介绍如何将该应用部署到包含两个集群的 ASM 实例。
前提条件 在同一 VPC 下已创建两个 ACK 集群(本例中 m1c1 和 m1c2),详情参见创建 Kubernetes 集群。 已创建一个 ASM 实例(本例中 mesh1),详情参见创建 ASM 实例。 步骤一:修改集群的安全组名称 将两个集群对应的安全组名称修改为易于辨识的名称,本例中为 m1c1-sg 和 m1c2-sg。
登录ECS管理控制台。 在左侧导航栏,单击网络与安全 > 安全组。 在顶部状态栏左上角处,选择地域。 在安全组列表页面中,找到需要修改的安全组,单击操作列下的修改。 在弹出的对话框中,修改安全组名称和描述。 单击确定。 修改后的名称,如下图所示。修改安全组名称 步骤二:配置集群的互访联通性 为了使两个集群能够互相访问,需要为彼此添加安全组访问规则。
在 m1c1-sg 安全组配置界面,添加以 m1c2-sg 为授权对象的访问规则。详情参见添加安全组规则。在m1c1授权m1c2 在 m1c2-sg 安全组规则配置界面,添加以 m1c1-sg 为授权对象的访问规则。在m2c1授权m1c1 步骤三:添加集群到 ASM 实例并部署集群的入口网关 将两个集群添加到 ASM 实例后,由于两个集群已实现访问互通,因此只需为一个集群部署入口网关。
将两个集群添加到 ASM 实例,详情参见添加集群到 ASM 实例。 为 m1c1 集群部署入口网关,详情参见添加入口网关。 步骤四:部署 Bookinfo 应用 为了演示 ASM 跨集群的应用部署能力,Bookinfo 应用的不同微服务分别部署在两个集群上。
在 m1c2 中部署不包含 review-v3 deployment 的 Bookinfo 应用,详情参见部署应用到 ASM 实例。 说明 Review-v3 deployment 对应的功能是书评中显示红色星。 对应的 Yaml 文件内容如下所示: ##################################################################################################
Details service
################################################################################################## 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
##################################################################################################
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 spec: serviceAccountName: bookinfo-ratings containers: - name: ratings image: docker.io/istio/examples-bookinfo-ratings-v1:1.15.0 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 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: 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
##################################################################################################
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: 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
在 m1c1 中部署 review-v3 以及 rating service(review 依赖的服务)。 对应的 YAML文件内容如下所示: ##################################################################################################
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-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
##################################################################################################
Ratings service
################################################################################################## 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 和其他服务不在同一个集群中,也可以正常显示。
(可选)步骤六:指定 reviews 总是用 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: v3 此时访问 productpage 页面,reviews 将始终使用 v3 版本,即书评中为红色星。书评用红星