迁移 Tomcat 工作负载

Migrate for Anthos and GKE 有助于加快传统工作负载容器化以及部署到 GKE 和 Anthos 集群中的速度。

迁移概览

借助此公开预览版产品,您现在可以将 Linux 虚拟机上运行的 Tomcat 工作负载转换为应用容器,从而实现其现代化改造。然后,您可以将应用容器部署到:

使用 Migrate for Anthos and GKE 迁移您的 Tomcat 工作负载时,您可以利用 Tomcat 的功能和架构来实现以下目的:

  • 自动将应用的子集拆分到单独的容器中。
  • 维护来自源虚拟机的 Tomcat 应用的现有密钥库、信任库和证书。
  • 动态确定 JVM 应用的最佳内存分配。
  • 从来源虚拟机复制特定的数据卷和数据卷声明。

前提条件

要迁移 Tomcat 应用,您必须执行以下操作:

迁移过程

Tomcat 应用的迁移过程与当前的 Linux 迁移过程类似,但需要注意以下事项:

  • Mfit 注意事项:

    • 您必须运行 mfit拟合评估工具),然后才能开始 Tomcat 工作负载迁移以完成数据收集阶段。
    • 您可以使用多个 Tomcat 专用 mfit 规则来评估工作负载。如需详细了解 Tomcat 专用 mfit 规则,请参阅 Tomcat mfit 文档。
    • 请勿指定 --readonly 选项--readonly 选项可防止 mfit 在虚拟机上存储有关 Tomcat 的数据,并阻止 Migrate for Anthos 和 GKE 访问这些数据。
    • 请勿使用 ./mfit discover 选项。您必须在虚拟机上运行数据收集脚本,以使用 Tomcat OSS 社区映像检索容器化所需的信息。
  • 其他注意事项:

    • 运行 migctl 时,您必须使用 tomcat 选项指定 --workload–type 标志以创建迁移计划。
    • 如需自定义迁移,请修改迁移计划 YAML 文件。此文件具有特定于 Tomcat 的格式,具体请参阅自定义迁移计划
    • 生成迁移工件时,Migrate for Anthos and GKE 会创建一个 build.sh 文件,您将使用该文件构建部署容器映像。
    • 如需执行数据迁移以及 Tomcat 应用迁移,您可以修改数据配置 YAML 文件 (my-migration.data.yaml)

      如需详细了解数据配置 yaml 文件的格式,请参阅下面的自定义数据迁移配置

执行 Tomcat 工作负载迁移

如需执行 Tomcat 工作负载迁移,请按以下步骤操作:

  1. 运行 mfitmfit拟合评估工具,可以评估现有 Tomcat 工作负载的迁移能力。

  2. 配置处理集群:在已创建的 GKE 集群上安装 Migrate for Anthos and GKE 组件,以处理基于虚拟机的工作负载的迁移和容器化。

    如需详细了解如何根据目标环境正确配置处理集群,请参阅安装 Migrate for Anthos and GKE

  3. 添加迁移来源:添加一个迁移来源,该来源代表您要从中进行迁移的来源平台。例如,如果您要从 Compute Engine 迁移虚拟机:

     migctl source create ce my-src --project my-project --json-key json-key-file

    如需详细了解添加迁移来源和适当的迁移来源语法,请参阅添加迁移来源文档。

  4. 创建迁移:创建一项您可以在执行迁移之前查看和自定义的迁移计划。

    如需为 Tomcat 工作负载创建迁移计划,您可以使用以下 migctl 命令,并将 --workload-type 标志设置为 tomcat

     migctl migration create my-migration --source my-src --vm-id my-vm --workload-type tomcat

    其中:

    • my-migration - 指定迁移的名称。
    • my-src - 指定您在上一步中创建的迁移来源的名称。
  5. 验证迁移计划:要验证包含迁移计划的 YAML 文件(包括配置所需的内存和内存限制、Tomcat 应用拆分设置和证书设置),请按以下步骤操作:

    1. 下载迁移计划 (my-migration.yaml) 和数据迁移配置 (my-migration.data.yaml) 文件:

      migctl migration get my-migration

      此命令将下载名为 my-migration.yamlmy-migration.data.yaml 的文件。

    2. 在文本编辑器中打开 my-migration.yaml,然后查看迁移详细信息。根据需要更改详细信息,以自定义迁移计划。如需了解如何自定义迁移计划,请参阅下文中的自定义迁移计划

    3. 修改完成后,上传修改后的文件:

      migctl migration update my-migration --main-config my-migration.yaml
  6. (可选)配置数据迁移配置:借助 Migrate for Anthos 和 GKE,您可以使用数据迁移配置 (my-migration.data.yaml) 文件从 Tomcat 工作负载迁移永久性文件夹。my-migration.data.yaml 文件默认为空。

    要配置 my-migration.data.yaml,请按以下步骤操作:

    1. 使用以下命令下载您的数据迁移配置 (my-migration.data.yaml) 和迁移计划 (my-migration.yaml) 文件:

      migctl migration get my-migration

      此命令返回名为 my-migration.yamlmy-migration.data.yaml 的文件。

    2. 在文本编辑器中修改 my-migration.data.yaml

    3. 修改完成后,上传修改后的文件:

      migctl migration update my-migration --data-config my-migration.data.yaml
  7. 生成迁移工件:执行迁移以生成容器工件:

    migctl migration generate-artifacts my-migration

    如需详细了解如何生成迁移工件,请参阅执行迁移文档。

  8. 查看工件:通过运行以下命令来查看工件,为构建可部署的容器映像做好准备:

    migctl migration get-artifacts my-migration

    此命令会为迁移计划中列出的每个 Tomcat 服务器创建一个单独的目录。Migrate for Anthos 和 GKE 会根据迁移计划为每个服务器映像创建相应的嵌套目录。这些嵌套目录包含用于构建和部署映像的映像工件。

    每个目录中包含多个工件:

    • build.sh 文件,可用于构建 Tomcat 服务器的容器映像
    • 用于部署容器映像的 deployment_spec.yaml 文件
    • cloudbuild.yaml 文件,稍后可用于在 CI/CD 流水线中重建映像
    • volumes.yaml 文件,其中包含已迁移数据卷的明细

    如需详细了解如何验证迁移工件,请参阅下面的“第 9 步:验证 volumes.yaml”。

  9. (可选)验证 volumes.yaml

    迁移完成后,Migrate for Anthos and GKE 生成的其中一个工件名为 volumes.yaml

    volumes.yaml 包含有关在数据迁移过程中将数据复制到的 PVC、PV 和 PD 的信息。如果要在部署迁移前修改迁移的工作负载以使工作负载能够访问所复制的数据,可以选择此信息。

    volumes.yaml 文件的格式如下:

    volumes:
           deployment pvc name:
             pvc:
               full pvc yaml
             pv:
               full pvc yaml
    

    如需详细了解如何定义 PVC 或 PV yaml 文件,请参阅 Kubernetes 文档

  10. 构建容器映像:使用在迁移工件中创建的 build.sh 文件为 Tomcat 服务器构建容器映像。

    1. 切换到包含生成的 Tomcat 映像工件的目录。

      例如,如需切换到名为 latest 的 Tomcat 服务器和名为 app 的映像的目录,请运行以下命令:

      cd latest/app
    2. 设置您的 Google Cloud 项目 ID 和映像版本:

      export PROJECT_ID=my_project VERSION=latest
    3. 运行 build.sh 脚本以构建容器映像并将其上传到 Container Registry:

      bash ./build.sh
  11. 部署应用容器:将迁移后的应用部署到目标集群:

    sed -e "s/\${PROJECT_ID}/${PROJECT_ID}/g" -e "s/\${VERSION}/${VERSION}/g"
     deployment_spec.yaml | kubectl apply -f -

    如需详细了解如何将应用容器部署到目标集群,请参阅将应用容器部署到目标集群文档。

自定义迁移计划

创建迁移计划时,Migrate for Anthos 和 GKE 会生成一个 YAML 文件,其中包含检测到的每个正在运行的 Tomcat 服务器的信息。您需要先修改迁移计划以自定义每个 Tomcat 服务器的属性,然后再生成迁移工件。

如需自定义迁移,您应该修改迁移计划 (my-migration.yaml):

tomcatServers:
    - name: latest
      catalinaBase: /opt/tomcat/latest
      catalinaHome: /opt/tomcat/home
      secrets: # files to extract from the server container images into secrets
        - name: my-vm-latest-ssl
          path: /usr/local/ssl
          files:
            - server.crt
            - server.pem
        - name: my-vm-latest-keystore
          path: /usr/home/tomcat
          files:
            - .keystore
            - .truststore
      images:
        - name: my-vm-latest-docs # name of the image for build and deployment
          fromImage: tomcat:8.5.66-jdk16-openjdk # for the resulting container image
          applications: # list of applications to include in the image
            - /opt/tomcat/latest/latest/webapps/docs
          additionalFiles: # external required paths
            - /opt/libraries/postgres.jar
          logConfigPaths: # of the contained web apps. Must be under catalina base
            - /opt/tomcat/latest/virtualHost/webapps/docs/WEB-INF/classes/log4j2.xml
          ports: # to create Kubernetes services associated with the resulting deployment
            - 8080
          resources:
            memory:
              limits: 2048M
              requests: 1280M
          secrets: # to mount in the container image
            - my-vm-latest-ssl
            - my-vm-latest-keystore
        - name: another-image
          . . .
    - name: another-server
      . . .

my-migration.yaml 中:

  • name - 指定 Tomcat 服务器的名称,该名称由 catalinaBase 名称确定。Migrate for Anthos 和 GKE 会在名称冲突时附加后缀。

  • catalinaBase/Home - 在 Tomcat 服务器级别定义

  • secrets - Secret 可以在两个范围中定义:

    • 服务器范围:您可以在服务器范围内定义 secrets 字段 namepathfiles
    • 映像范围:您可以将 secrets 字段定义为映像范围内字符串路径的列表。
  • images - 包含每个应用的条目以及所有应用的条目。如果工作负载中未发现 Tomcat 服务器,则 images 特性将包含一个示例条目,供您在审核时定义。

    • name - 指定生成的容器映像的名称,格式为:

      tomcat-name

      例如,对于名为 latest 的 Tomcat 服务器,imageName 为:

      Tomcat-latest
    • fromImage - 为同一 Tomcat 服务器中的所有应用确定一次。

  • additionalFiles - 在服务器级别发现并分配给所有应用。

    • ports - 在 Tomcat 服务器中定义,连接器可以与相关应用关联。
    • Resources - 仅针对统一映像自动建议。
    • 系统还会提供包含所有应用的映像。

定义您的 Secret 和证书

当您创建新的 Tomcat 迁移时,发现过程会扫描服务器配置,以检测证书的使用情况。证书路径将针对发现的不同应用进行映射。

这些证书显示在服务器级层和映像级层的迁移计划中:

  • 服务器范围 - 您在服务器范围中包含的 Secret 将从生成的映像工件中排除。名为 secrets.sh 的专用工件脚本会自动通过其本地路径创建 Kubernetes Secret 对象

  • 映像范围 - 在映像范围内包含的 Secret 名称将导致相应的 Secret 自动装载到已部署的容器中。如果您在迁移计划中将密钥路径设置为相对路径,则装载路径将相对于 Tomcat 社区映像安装目录进行固定。

您可以通过运行以下命令,使用 secrets.sh 工件和 Migrate for Anthos and GKE 来创建 Kubernetes Secret 对象

bash ./secrets.sh namespace of deployments secret file secret file

Webapps 日志记录

Migrate for Anthos 和 GKE 支持使用 CATALINA_HOME 中的 log4j v2logbacklog4j v1.x 进行日志记录。不支持 CATALINA_HOME 外部的路径。

Migrate for Anthos 和 GKE 将使用修改后的日志配置创建额外的归档文件,并将所有文件类型附加器转换为控制台附加器。您可以使用此归档的内容作为启用日志收集和流式传输到日志收集解决方案(例如 Google Cloud Logging)的参考。

内存分配

在迁移过程中,Migrate for Anthos and GKE 会尝试找到源虚拟机上的最大 Tomcat Java 堆的内存限制。如果在来源虚拟机上检测到内存限制,则 Migrate for Anthos and GKE 会为迁移的容器设置初始 (requests) 和最大 (limits) 内存限制。

如果您要指定迁移到各个容器的应用的内存限制,或者未在源虚拟机中发现内存限制,您可以使用以下格式直接在迁移计划中修改内存限制:

tomcatServers:
    - name: latest
      . . .
      images:
        - name: tomcat-latest
          . . .
          resources:
            memory:
              limits: 2048M
              requests: 1280M

如果在迁移计划中定义了内存限制,则 Dockerfile(在成功迁移后与其他工件一起生成)将反映您的声明:

FROM tomcat:8.5.66-jdk16-openjdk

# Add JVM environment variables for tomcat
ENV CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxRAMPercentage=50 -XX:InitialRAMPercentage=50 -XX:+UseContainerSupport <additional variables>"

设置 Tomcat 环境变量

如果您希望在 Dockerfile(在成功迁移后与其他工件一起生成)中设置 CATLINA_OPTS,则可以首先添加到迁移计划中的 catalinaOpts 字段:

tomcatServers:
    - name: latest
      . . .
      images:
        - name: tomcat-latest
          . . .
          resources:
            . . .
          catalinaOpts: "-Xms512M -Xmx1024M"

Migrate for Anthos and GKE 会将 catalinaOpts 数据解析为您的 Dockerfile:

FROM 8.5.66-jdk16-openjdk-slim

## setenv.sh script detected.
## Modify env variables on the script and add definitions to the migrated tomcat server,
## if needed (less recommended than adding env variables directly to CATALINA_OPTS) by uncomment the line below
#ADD --chown=root:root setenv.sh /usr/local/tomcat/bin/setenv.sh

    # Add JVM environment variables for the tomcat server
ENV CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxRAMPercentage=50 -XX:InitialRAMPercentage=50 -Xss10M"

您还可以使用 setenv.sh 脚本(位于 Tomcat 服务器的 /bin 文件夹中)设置 Tomcat 环境变量。如需详细了解 Tomcat 环境变量,请参阅 Tomcat 文档

如果您选择使用 setenv.sh 来设置 Tomcat 环境变量,则需要修改 Dockerfile。

自定义数据迁移配置

利用 Migrate for Anthos and GKE,您可以在迁移过程中指定要从 Tomcat 工作负载迁移的数据卷或数据卷声明。

如需在迁移过程中启用数据迁移,您需要使用以下格式在数据配置文件 (my-migration.data.yaml) 中提供目标数据卷或声明的相关信息:

dataConfig:
      volumes:
        - deploymentPvcName:
          existingPvc:
            Name: my-pvc
          folders:
            - /bin
            - /opt
        - newPvc:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 10G
          folders:
            - /bin
            - /opt

其中:

  • deploymentPvcName:已部署的工作负载中 Migrate for Anthos and GKE 用于访问此卷的 PVC 名称。(未用于 Tomcat 迁移。)

  • existingPvc:

    • name:现有 PVC 的名称。定义是否要将数据卷迁移到现有 PVC。否则为 nil
  • newPvc:定义是否将数据卷迁移到新的 PVC。您可以使用标准 PVC 规范语法定义 PVC。

    如需详细了解 Kubernetes PVC 规范,请参阅 Kubernetes 文档。

  • folders

您可以针对多个数据迁移使用场景修改数据配置文件,包括:

无需迁移数据

如果您不想在迁移过程中迁移任何数据,则应将生成的数据配置文件 (my-migration.data.yaml) 留空。您的数据配置文件默认创建为空。

使用现有的 PersistentVolumeClaim (PVC)

如果您已为迁移的数据分配所需的存储空间,并且具有存储数据的 PVC,则可以使用现有 PersistentVolumeClaim (PVC) 迁移数据。

您可以通过在 existingPvc 字段中传递现有卷,在数据配置文件 (my-migration.data.yaml) 中定义现有 PVC。

您的 PVC 需要在迁移之前存在。在此示例中,您的数据配置文件如下所示:

dataConfig:
      volumes:
        - deploymentPvcName:
          existingPvc:
            name: my-pvc
          newPvc: # must be nil
          folders:
            - /bin
            - /opt

在迁移后的虚拟机上创建新的数据卷

如果您未提前分配存储空间,并且想要在迁移过程中创建存储空间,则可以传递空的 existingPvc 字段,并在 newPvc 字段中指定想要创建的存储空间:

dataConfig:
      volumes:
        - deploymentPvcName:
          existingPvc: #must be nil
          newPvc:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 10G
          folders:
            - /bin
            - /opt

如果您不想关注支持性存储的具体细节,则应使用空字符串作为存储类别。

如果要声明特定的存储类别,您应该根据要求在用于创建存储空间的同一集群中准备存储类别对象

迁移具有多个文件路径的多个 PVC

您可以为数据配置文件 (my-migration.data.yaml) 中列出的每个 PVC 指定 volume 列表中每个条目的 folders 列表字段下的目录集:

dataConfig:
      volumes:
        - deploymentPvcName:
          existingPvc:
            name: my-pvc
          folders:
            - /bin
            - /opt
        - newPvc:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 10G
          folders:
            - /bin
            - /opt

您在配置文件中的 folders 下列出的路径会复制到目标 PVC 中的相同路径。

数据迁移:后续步骤

验证数据配置文件后,您应继续执行迁移过程的“第 7 步:生成工件”

您可以使用在 Tomcat 迁移过程中生成的 volumes.yaml 工件验证迁移的卷

不支持的特性

此版本不支持以下 Tomcat 功能:

  • 版本控制迁移:Migrate for Anthos and GKE 不支持迁移到具有不同版本的 Tomcat 和 Java 的映像。

  • 聚簇/会话复制

  • Windows 支持使用 Windows 工作负载进行 Tomcat 迁移。

  • Java 版本/供应商发现:Migrate for Anthos and GKE 建议预定义的 Java 版本和供应商,然后用它来选择 Tomcat 映像,而不是自动发现。

问题排查

在为 Tomcat 迁移工作负载的过程中,您可能会遇到错误。

  • 如果您收到显示以下内容的 build.sh 错误:

    manifest for ... not found: manifest unknown: manifest unknown

此错误消息表示工作负载的父级映像缺失。有两种解决方案可以缓解此错误:

  • 使用现有映像修改提取配置文件,然后重新执行“第 7 步:生成工件”
  • 修改 dockerfile FROM 声明以引用现有映像并重新运行 build.sh