迁移单体式虚拟机 - 概览和设置

在本教程中,您将了解一个尚未完全进行现代化改造的示例应用,并完成将其所有服务迁移到 GKE 所需的步骤。此应用会在 GKE 集群中运行其部分服务,而将其余服务作为虚拟机中的单体式应用运行。

本教程分为以下几个部分:

  1. 概览和设置

    在本部分中,您将了解本教程所基于的上下文,并设置学习本教程其余部分所需的基础架构和工具。

  2. 发现和评估(第 0 天)

    接下来,您将使用发现工具来评估您的虚拟机是否适合迁移,并创建处理集群以为迁移做好准备。

  3. 迁移和部署(第 1 天)

    最后,您将为您的单体式虚拟机创建迁移计划,对映像和数据进行完整迁移,并将新创建的工件部署到 Kubernetes。

上下文

到目前为止,大型企业中的大多数旧式应用都是单体式应用,并在专有技术栈或计算密集型虚拟机 (VM) 上运行。这些服务通常对于大型应用的运营至关重要,但会产生大量运营费用,例如运维和许可费用。但是,由于其性质,虚拟机可能难以迁移到轻量级解决方案,例如 GKE 集群中的容器。

在本教程中,您将学习如何利用 Migrate for Anthos and GKE,无需更改任何代码即可轻松地将单体式服务及其数据库从虚拟机迁移到 GKE 环境,从而减少运营费用并免去开发麻烦。

使用的示例应用是 Bank of Anthos(一种零售银行服务模拟),其拥有自己的事务处理网络和数据库。

Bank of Anthos 的 Web 前端、用户和联系人服务以及帐号数据库都已部署为在 GKE 的容器中运行的容器化微服务。但是,其单体式事务分类记录器和事务数据库仍在单个虚拟机上运行。如需在不中断当前工作流的情况下降低运营费用,您需要能够轻松将此虚拟机迁移到 GKE 的解决方案。

Bank of Anthos 架构图

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

所需工具

您可以使用 Cloud Shell 来执行本教程中所述的操作,该环境中预装了本教程中用到的 gcloudkubectlgitmigctl 命令行工具。借助 Cloud Shell,您将无需在工作站上单独安装这些命令行工具。

如需使用 Cloud Shell,请执行以下操作:

  1. 转到 Google Cloud Console
  2. 点击 Cloud Console 窗口顶部的激活 Cloud Shell 激活 Shell 按钮 按钮。

    一个 Cloud Shell 会话随即会在 Cloud Console 底部的新框内打开,并显示命令行提示符。

    Cloud Shell 会话

必需的 API

启用对 Compute Engine 的支持

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  5. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  6. 启用 Compute Engine API。

    启用 API

启用并配置 GKE

在开始之前,请确保您已执行以下任务:

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

部署 Bank of Anthos

在本部分中,您会将分类记录器单体式虚拟机部署到 Compute Engine 中,并创建用于运行其余 Bank of Anthos 服务的 GKE 集群。

  1. 设置 Bank of Anthos 单体式部署所需的环境变量。

    export PROJECT_ID=PROJECT_ID
    export ZONE=COMPUTE_ZONE
    
  2. 将 Bank of Anthos 代码库克隆到主目录。

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos ${HOME}/bank-of-anthos
    
  3. 将 Bank of Anthos 分类记录器单体式应用部署到 Compute Engine。

    cd ${HOME}/bank-of-anthos
    make monolith-deploy
    

    该命令可确保当前没有任何名称冲突的虚拟机,并使用 Bank of Anthos 的 ledgermonolith 映像在 Compute Engine 中创建虚拟机。

  4. 创建一条防火墙规则,以允许通过端口 8080 向虚拟机实例发送请求,前端服务会使用该端口与分类记录器单体式应用进行通信。

    gcloud compute --project=PROJECT_ID firewall-rules create default-allow-http \
      --direction=INGRESS --priority=1000 --network=default --action=ALLOW \
      --rules=tcp:8080 --source-ranges=0.0.0.0/0 --target-tags=monolith
    
  5. 创建一个 GKE 集群来托管其余的 Bank of Anthos 服务。

    gcloud container clusters create boa-cluster \
      --project=PROJECT_ID --zone=COMPUTE_ZONE \
      --machine-type=e2-standard-4 --num-nodes=4 \
      --enable-stackdriver-kubernetes --subnetwork=default
    
  6. 创建集群后,提取其凭据并将 Kubernetes 上下文设置为指向该集群。

    gcloud container clusters get-credentials boa-cluster --zone COMPUTE_ZONE
    
  7. 使用项目 ID 替换用于描述 GKE 服务如何与分类记录器单体式虚拟机进行通信的 ConfigMap。

    sed -i 's/\[PROJECT_ID\]/'PROJECT_ID'/g' ${HOME}/bank-of-anthos/src/ledgermonolith/config.yaml
    

    查看此文件,以确保所做更改已成功应用。

    cat ${HOME}/bank-of-anthos/src/ledgermonolith/config.yaml | grep ADDR
    

    您应该会看到项目 ID 已插入到分类记录器服务主机中。

    TRANSACTIONS_API_ADDR: "ledgermonolith-service.c.PROJECT_ID.internal:8080"
    BALANCES_API_ADDR: "ledgermonolith-service.c.PROJECT_ID.internal:8080"
    HISTORY_API_ADDR: "ledgermonolith-service.c.PROJECT_ID.internal:8080"
    CONTACTS_API_ADDR: "contacts:8080"
    USERSERVICE_API_ADDR: "userservice:8080
    
  8. 在集群上应用各种 Bank of Anthos 服务。

    cd ${HOME}/bank-of-anthos/
    kubectl apply -f src/ledgermonolith/config.yaml
    kubectl apply -f extras/jwt/jwt-secret.yaml
    kubectl apply -f kubernetes-manifests/accounts-db.yaml
    kubectl apply -f kubernetes-manifests/userservice.yaml
    kubectl apply -f kubernetes-manifests/contacts.yaml
    kubectl apply -f kubernetes-manifests/frontend.yaml
    kubectl apply -f kubernetes-manifests/loadgenerator.yaml
    

    您可以使用以下命令验证 Pod 状态:

    kubectl get pods
    

    可能需要几分钟时间才能启动并运行所有 Pod。

    NAME                           READY   STATUS    RESTARTS   AGE
    accounts-db-0                  1/1     Running   0          51s
    contacts-d5dcdc87c-5l9xf       1/1     Running   0          50s
    frontend-5768bd978-s6vkq       1/1     Running   0          50s
    loadgenerator-8485dfd-wjvst    1/1     Running   0          50s
    userservice-8477dfcb46-htw96   1/1     Running   0          51s
    
  9. 将所有 Pod 设置为 Running 后,您便可以找到 frontend LoadBalancer 服务的外部 IP 地址。

    kubectl get service frontend
    
    NAME       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
    frontend   LoadBalancer   10.79.248.161   ##.##.##.##.    80:31304/TCP   4m
    
  10. 最后,您可以打开浏览器并使用上文中找到的外部 IP 地址访问网页(请务必使用 HTTP,而非 HTTPS)。

    http://EXTERNAL_IP
    

    您应能使用默认凭据登录,并在信息中心上查看事务。列出的事务来自当前托管在虚拟机中的分类记录器单体式应用。

    Bank of Anthos 的屏幕截图

后续步骤

您已经启用了所需的 API 并部署了 Bank of Anthos 设置,现在您可以继续学习本教程的下一部分,即发现和评估;在该部分,您将学习如何使用迁移发现工具来评估您的虚拟机是否适合使用 Migrate for Anthos and GKE 工具来进行迁移。

如果您至此结束本教程的学习,请务必清理您的 Google Cloud 项目和资源。

清除数据

为避免产生不必要的 Google Cloud 费用,您应该在完成本教程后立即删除用于本教程的资源。这些资源包括:

  • boa-cluster GKE 集群
  • ledgermonolith-service Compute Engine 虚拟机

您可以手动删除这些资源,也可以按照下面的步骤删除项目,这也将移除所有资源。

  • 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  • 在项目列表中,选择要删除的项目,然后点击删除
  • 在对话框中输入项目 ID,然后点击关闭以删除项目。