将集群内 Anthos Service Mesh 迁移到新集群上的代管式 Anthos Service Mesh
本教程介绍了如何将应用从使用集群内 Cloud Service Mesh 的 Google Kubernetes Engine (GKE) 集群迁移到使用代管式 Cloud Service Mesh(Google 符合 Istio 的全代管式服务网格)的新集群。
在本教程中,您将执行以下操作:
- 创建新的 Google Kubernetes Engine 集群,并在该集群上安装集群内 Cloud Service Mesh 和 Cloud Service Mesh 入站流量网关。此集群将用作您要从中迁移出的现有集群。
- 将 Online Boutique 示例应用部署到使用集群内 Cloud Service Mesh 的集群上。
- 在同一个 Google Cloud 项目中创建另一个 Google Kubernetes Engine 集群。
- 在第二个集群上预配托管式 Cloud Service Mesh 并部署 Cloud Service Mesh 入站流量网关。
- 通过托管式 Cloud Service Mesh 将 Online Boutique 部署到集群上, 使用集群内 Cloud Service Mesh 从集群复制部署。
- 将 50% 的用户流量从具有集群内 Cloud Service Mesh 的集群转移到 通过 Istio 的流量拆分功能部署代管式 Cloud Service Mesh 和集群内 Cloud Service Mesh 功能。
- 将使用集群内 Cloud Service Mesh 的集群的域名系统 (DNS) 条目指向使用代管式 Cloud Service Mesh 的集群,完成从集群内 Cloud Service Mesh 到代管式 Cloud Service Mesh 的迁移。
Canary 部署
“Canary 部署”是软件开发中使用的一种技术,用于在向所有用户发布新版本之前测试某些软件的新版本。它涉及逐步增加发送到新版本的流量的百分比。在本教程中,您将使用代管式服务 Cloud Service Mesh,并逐步将用户流量转移到 Cloud Service Mesh。首先将 0% 的用户流量定向到新集群,然后定向 50%,最后定向 100%。在生产环境中,您应该使用更多的较小增量。如果您在任何时候发现新集群无法处理一定比例的流量,则可以通过将百分比降低到 0% 进行回滚。
Canary 控制平面与 Canary 集群
从集群内 Cloud Service Mesh 迁移到代管式 Cloud Service Mesh 有两种常用的策略:
- Canary 控制平面迁移:在此策略中,您需要 托管式 Cloud Service Mesh 已安装集群内 Cloud Service Mesh。
- Canary 集群迁移:在此策略中,您将创建新集群,然后在该集群上预配代管式 Cloud Service Mesh。
在本教程中,您将了解 Canary 集群迁移策略。
费用
本教程使用 Google Cloud 的以下收费组件:
完成本教程后,您可以删除所创建的资源以避免持续产生费用。如需了解详情,请参阅清理。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
启动 Cloud Shell
在本教程中,您将使用 Cloud Shell,这是一个托管在 Google Cloud 上的 Shell 环境,可让您管理 Google Cloud 资源。
Cloud Shell 预安装有 Google Cloud CLI、kubectl 和 istioctl 命令行。gcloud CLI 为 Google Cloud 提供了主要 CLI。
从本页面的右上角打开 Cloud Shell 会话,点击 terminal,然后点击确认。本页面下方的框架内会打开一个 Cloud Shell 会话。在该 Cloud Shell 会话中完成以下命令。
下载示例代码
克隆您将使用的 Kubernetes 和 Istio 资源所在的 git 代码库:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples.git
git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
设置使用集群内 Cloud Service Mesh 的集群
创建集群并安装集群内 Cloud Service Mesh
在本部分中,您将创建使用集群内 Cloud Service Mesh 的集群。实际上,这是您已经在使用的集群。
将
PROJECT_ID
替换为您的项目 ID 并创建一个新集群:gcloud container clusters create cluster-with-in-cluster-asm \ --project=PROJECT_ID \ --zone=us-central1-a \ --machine-type=e2-standard-4 --num-nodes=2 \ --workload-pool=PROJECT_ID.svc.id.goog
重命名集群上下文,以便更轻松地使用集群:
kubectl config rename-context \ gke_PROJECT_ID_us-central1-a_cluster-with-in-cluster-asm \ cluster-with-in-cluster-asm
检查集群上下文是否已重命名:
kubectl config get-contexts --output="name"
下载安装 Cloud Service Mesh 的版本 1.23.2 当前工作目录:
curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.23 > asmcli
系统会要求您输入“y”,然后按 Enter 键。
输出类似于以下内容:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 167k 100 167k 0 0 701k 0 --:--:-- --:--:-- --:--:-- 701k
让
asmcli
脚本可执行:chmod +x asmcli
使用
asmcli
安装集群内 Cloud Service Mesh:./asmcli install \ --project_id PROJECT_ID \ --cluster_name cluster-with-in-cluster-asm \ --cluster_location us-central1-a \ --output_dir . \ --enable_all \ --ca mesh_ca
asmcli
工具完成运行可能需要几分钟时间。该工具会输出信息性消息,便于您跟踪其进度。成功后,输出类似于以下内容:
... asmcli: Successfully installed ASM.
部署 Cloud Service Mesh 的入站流量网关
您需要将 Cloud Service Mesh 的入站流量网关部署到单独的 名为
asm-ingress
的命名空间。创建此命名空间:kubectl \ --context cluster-with-in-cluster-asm \ create namespace asm-ingress
使用
istio.io/rev=asm-1232-2
标签将asm-ingress
命名空间添加到服务网格,并启用自动边车代理注入。kubectl \ --context cluster-with-in-cluster-asm \ label --overwrite namespace asm-ingress istio.io/rev=asm-1232-2
输出类似于以下内容:
namespace/asm-ingress labeled
部署 Cloud Service Mesh 入站流量网关:
kubectl \ --context cluster-with-in-cluster-asm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml kubectl \ --context cluster-with-in-cluster-asm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
输出类似于以下内容:
serviceaccount/asm-ingressgateway created service/asm-ingressgateway created deployment.apps/asm-ingressgateway created gateway.networking.istio.io/asm-ingressgateway created
部署 Online Boutique
将 Online Boutique 部署到名为
onlineboutique
的单独命名空间中。创建此命名空间:kubectl \ --context cluster-with-in-cluster-asm \ create namespace onlineboutique
使用
istio.io/rev=asm-1232-2
标签将onlineboutique
命名空间添加到服务网格,并启用自动边车代理注入。kubectl \ --context cluster-with-in-cluster-asm \ label --overwrite namespace onlineboutique istio.io/rev=asm-1232-2
输出类似于以下内容:
namespace/onlineboutique labeled
部署 Online Boutique 的 12 项服务,包括用于模拟用户流量的负载生成器:
kubectl \ --context cluster-with-in-cluster-asm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml kubectl \ --context cluster-with-in-cluster-asm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
获取 Cloud Service Mesh 入站流量网关的外部 IP 地址:
kubectl \ --context cluster-with-in-cluster-asm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
复制入站流量网关的外部 IP 地址,然后通过网络浏览器访问它。您将看到 Online Boutique 示例应用。
使用代管式 Cloud Service Mesh 设置新集群
创建集群并预配托管式 Cloud Service Mesh
在本部分中,您将创建要迁移到的集群。您将 预配托管式 Cloud Service Mesh 并部署 Online Boutique 从使用集群内 Cloud Service Mesh 的集群中复制部署。
创建新集群:
gcloud container clusters create cluster-with-csm \ --project=PROJECT_ID --zone=us-central1-a \ --machine-type=e2-standard-4 --num-nodes=2 \ --workload-pool PROJECT_ID.svc.id.goog
重命名集群上下文,以便更轻松地使用集群:
kubectl config rename-context \ gke_PROJECT_ID_us-central1-a_cluster-with-csm \ cluster-with-csm
检查集群上下文是否已重命名:
kubectl config get-contexts --output="name"
在项目的舰队上启用 Cloud Service Mesh。答 舰队是 Kubernetes 集群和可管理的其他资源的分组 。
gcloud container fleet mesh enable --project PROJECT_ID
输出类似于以下内容:
Waiting for Feature Service Mesh to be created...done.
将集群注册到项目的舰队:
gcloud container fleet memberships register cluster-with-csm-membership \ --gke-cluster=us-central1-a/cluster-with-csm \ --enable-workload-identity \ --project PROJECT_ID
输出类似于以下内容:
Waiting for membership to be created...done. Finished registering to the Fleet.
在集群上启用托管式 Cloud Service Mesh:
gcloud container fleet mesh update \ --management automatic \ --memberships cluster-with-csm-membership \ --project PROJECT_ID
输出类似于以下内容:
Waiting for Feature Service Mesh to be updated...done.
验证是否已为集群预配托管式 Cloud Service Mesh,并 可以使用:
gcloud container fleet mesh describe --project PROJECT_ID
Cloud Service Mesh 可能需要大约 10 分钟才能完成预配且可在集群上使用。如果您看到
controlPlaneManagement.state: DISABLED
或controlPlaneManagement.state: PROVISIONING
,则需要每隔几分钟重新运行一次上述命令,直到您看到controlPlaneManagement.state: ACTIVE
。输出类似于以下内容:
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/cluster-with-csm-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/cluster-with-csm-membership: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: 'Revision(s) ready for use: asm-managed.' updateTime: '2022-07-06T01:19:24.243993678Z' name: projects/your-project-id/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-07-06T01:19:27.475885687Z'
部署 Cloud Service Mesh 的入站流量网关
您需要将 Cloud Service Mesh 的入站流量网关部署到单独的 名为
asm-ingress
的命名空间。创建此命名空间:kubectl \ --context cluster-with-csm \ create namespace asm-ingress
使用
istio.io/rev=asm-managed
标签将asm-ingress
命名空间添加到服务网格,并启用自动边车代理注入。kubectl \ --context cluster-with-csm \ label namespace asm-ingress 'istio.io/rev=asm-managed'
部署 Cloud Service Mesh 入站流量网关:
kubectl \ --context cluster-with-csm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml kubectl \ --context cluster-with-csm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
输出类似于以下内容:
namespace/asm-ingress configured serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
部署 Online Boutique
将 Online Boutique 部署到名为
onlineboutique
的单独命名空间中。创建此命名空间:kubectl \ --context cluster-with-csm \ create namespace onlineboutique
使用
istio.io/rev=asm-managed
标签将onlineboutique
命名空间添加到服务网格,并启用自动边车代理注入。kubectl \ --context cluster-with-csm \ label namespace onlineboutique 'istio.io/rev=asm-managed'
部署 Online Boutique 的 12 项服务,包括用于模拟用户流量的负载生成器:
kubectl \ --context cluster-with-csm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml kubectl \ --context cluster-with-csm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
获取 Cloud Service Mesh 入站流量网关的外部 IP 地址:
kubectl \ --context cluster-with-csm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
复制
asm-ingressgateway
Service 的外部 IP 地址,然后通过网络浏览器访问它。您将看到 Online Boutique 示例应用。您将在下一部分中使用此外部 IP 地址,因此请将其复制到环境变量中:export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \ kubectl \ --context cluster-with-csm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
使用 Canary 部署测试使用 Cloud Service Mesh 的集群
在本部分中,您将为集群配置集群内 Cloud Service Mesh,以便 Online Boutique 的用户流量被 50% 转给了 Online Boutique 使用代管式 Cloud Service Mesh 的集群上的精品店。为了实现这一目标,您需要部署 通过集群内 Cloud Service Mesh 将两个 Istio 资源提供给集群:
- 一个 ServiceEntry,用于向集群内 Cloud Service Mesh 告知代管式 Cloud Service Mesh 集群的 Online Boutique 端点
- VirtualService,告知集群内 Cloud Service Mesh 入站流量网关按 50-50 的比例分配流量。
设置代管式 Cloud Service Mesh 集群的入站流量网关的 IP 地址
ServiceEntry
资源内:sed -i "s/1.2.3.4/${INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM}/" anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
将
ServiceEntry
部署到使用集群内 Cloud Service Mesh 的集群:kubectl \ --context cluster-with-in-cluster-asm \ --namespace onlineboutique \ apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
使用集群内 Cloud Service Mesh 将
VirtualService
部署到集群:kubectl \ --context cluster-with-in-cluster-asm \ --namespace onlineboutique \ apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service-in-cluster-asm.yaml
在网络浏览器中访问使用集群内 Cloud Service Mesh 的集群的入站流量网关的 IP 地址:
kubectl \ --context cluster-with-in-cluster-asm \ --namespace asm-ingress \ get service
多次刷新 Online Boutique 首页,并且每次都要查看页面的页脚。请注意,50% 的请求由使用代管式 Cloud Service Mesh 的集群上的 Pod 处理。
迁移到使用托管式 Cloud Service Mesh 的集群
本部分假定您拥有域名并且有权访问其 DNS(域名服务器)设置。
向 DNS 设置添加 A 记录,以将域名(例如 example.com)指向使用集群内 Cloud Service Mesh 的集群上运行的入站流量网关的 IP 地址。
通过在网络浏览器中访问域名来访问 Online Boutique。
最大限度地缩短 DNS 记录存留时间 (TTL),以确保您可以快速还原 如果需要回滚,则为 DNS 条目。
将您的域名的 A 记录设置为 具有代管式 Cloud Service Mesh 的集群的入站流量网关。
迁移成功后,删除具有 集群内 Cloud Service Mesh:
gcloud container clusters delete cluster-with-in-cluster-asm \ --zone=us-central1-a \ --project=PROJECT_ID
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除资源
删除使用代管式 Cloud Service Mesh 的集群:
gcloud container clusters delete cluster-with-managed-asm \
--zone=us-central1-a \
--project=PROJECT_ID