将 WebSphere 应用程序迁移到 Azure Kubernetes 服务

本指南介绍在Azure Kubernetes 服务(AKS)上将现有 WebSphere 应用程序服务器(WAS)工作负载迁移到 IBM WebSphere Liberty 或 Open Liberty 时应注意的内容。

预迁移

若要确保迁移成功,请在开始之前完成以下各节中所述的评估和清点步骤。

确保目标是迁移工作的适当目标

成功将 WAS 应用程序迁移到 Azure 的第一步是选择最合适的迁移目标。

WAS 传统在 Azure 虚拟机上运行良好。 虚拟机(VM)目标是最简单的选择,因为它最类似于本地部署。 虚拟机的管理和部署体验类似于本地的。

另一个选项是通过将 WAS 传统工作负荷转换为应用程序容器来迁移到容器。 可以在 Azure Kubernetes 服务(AKS)和 Azure Red Hat OpenShift 上运行容器目标。 这种宽松的权衡是经济成本。

一般来说,与容器相比,基于 VM 的解决方案的每分钟成本更高。 虽然基于容器的解决方案的运行成本较低,但必须限制应用程序以适应容器业务流程平台的要求。

如果最大程度地减少更改是迁移工作最重要的因素,请考虑基于 VM 的迁移。 在这种情况下,请参阅将 WebSphere 应用程序迁移到 Azure 虚拟机

如果可以容忍将应用程序转换为在容器中运行以降低运行时成本,请考虑基于 AKS 或基于 Azure Red Hat OpenShift 的迁移。

对于基于 AKS 的迁移,可以开始使用免费层。 获取免费群集管理和仅支付消耗的虚拟机、关联的存储和网络资源的费用。 在这种情况下,请参阅将 WebSphere 应用程序迁移到Azure Kubernetes 服务

对于基于 Azure Red Hat OpenShift 的迁移,除了计算和基础结构成本外,应用程序节点还具有 OpenShift 许可证组件的其他成本。 此费用根据应用程序节点数和实例类型计费。 使用按需定价或预留实例,无论哪种情况最符合工作负荷和业务需求。 在这种情况下,请参阅 将 WebSphere 应用程序迁移到 Azure Red Hat OpenShift

Azure Red Hat OpenShift 文档中的操作指南涵盖了与迁移相关的一些方面。 有关操作指南的完整列表,请参阅 Azure Red Hat OpenShift 文档

确定预生成Azure 市场产品/服务是否是一个很好的起点

确定 AKS 是适当的部署目标后,必须接受 IBM WebSphere Liberty 操作员或 Open Liberty 运算符(操作员)是在 Kubernetes 上运行 Liberty 的唯一方法。 接受此事实后,必须确定预生成的Azure 市场产品/服务是否是一个很好的起点。 下面是有关预生成Azure 市场套餐的一些注意事项:

  • IBM 和 Microsoft 创建了此产品/服务,可让你快速在 AKS 上预配 Liberty。 以下内容更详细地介绍了此概念。
  • 概括而言,产品/服务会自动执行以下步骤。
    • 如果需要,请获取现有的应用程序映像。
    • 根据需要预配 AKS 群集和 Azure 容器注册表 (ACR) 实例。
    • 在 AKS 上安装和配置 IBM WebSphere Liberty 操作员或 Open Liberty 运算符。
    • 使用运算符运行整个操作。 操作员在 AKS 中部署和管理容器化 Liberty 应用程序。 可以在 IBM WebSphere Liberty 操作员和 Open Liberty 运算符中找到参考文档

如果不使用预生成Azure 市场产品/服务,则必须了解如何直接使用操作员。 掌握运算符超出了本文的范围。 IBM WebSphere Liberty 运算符和 Open Liberty 运算符提供了操作员的完整文档。

现在,你已了解了在 AKS 上处理 Liberty 的各种方法,因此你可以更好地选择是使用预生成的Azure 市场产品/服务,还是直接使用操作员自行执行此操作。

确定 Liberty 版本是否兼容

需要使用 Open Liberty 运算符WebSphere Liberty 操作员 在基于 Kubernetes 的群集上部署和管理应用程序。 请确保现有 Liberty 版本是操作员支持的版本之一。 Open Liberty 的版本在 GitHub OpenLiberty/open-liberty 中维护。 IBM 维护 IBM WebSphere 应用程序服务器 Liberty 的版本。 有关详细信息,请参阅 WebSphere Application Server Liberty

预生成Azure 市场产品/服务允许从公共注册表中选择应用程序映像,从而隐式支持所有版本。

确定是否需要许可证

对于 IBM WebSphere Liberty,必须接受与应用程序容器中 IBM Program 版本对应的许可协议条款。 有关适用于此 IBM 计划的许可协议,请参阅 查看 WebSphere Liberty 操作员的许可证信息。 有关详细信息,请参阅 在 Microsoft Azure 上运行 WebSphere Liberty。

如果产品版本不是默认 IBM WebSphere 应用程序服务器(基础),则必须 .spec.license.edition value 指定产品版本。 其他可用值包括 IBM WebSphere Application Server Liberty Core 和 IBM WebSphere 应用程序服务器网络部署。 预生成Azure 市场产品/服务允许你选择受支持的产品版本。

使用 IBM 迁移工具的清单差异

若要将应用程序移动到 WebSphere Application Server Liberty 或 Open Liberty,需要规划迁移、分析应用程序并更新源代码。 IBM 提供了迁移工具来帮助识别当前环境与新 Liberty 环境中技术之间的任何差异,例如 Java 企业版 7 或 Java 企业版 8,以及 Java 标准版 8 或 Java 标准版 11。 有关详细信息,请参阅 将应用程序迁移到 Liberty

清点服务器容量

记录当前生产服务器的硬件(内存、CPU、磁盘)、平均值和峰值请求计数,以及资源利用率。 无论选择了哪种迁移路径,都将需要此信息。 例如,这有助于指导选择节点池中 VM 的大小、容器要使用的内存量以及容器需要多少 CPU。

可以在 AKS 中调整节点池的大小。 若要了解如何操作,请参阅在 Azure Kubernetes 服务(AKS)中调整节点池大小。

清点所有机密

在出现“配置即服务”技术(如 Azure Key Vault)之前,没有有关“机密”的明确定义的概念。 你只能使用一组不同的配置设置,这些设置可以有效地充当我们现在所称的“机密”。 对于 WAS 等应用服务器,这些机密位于许多不同的配置文件和配置文件存储中。 检查生产服务器上的所有属性和配置文件中是否有机密和密码。 还可以在应用程序中查找包含密码或凭据的配置文件。 WAS 将配置数据存储在目录的级联层次结构中的多个文档中。 大多数配置文档都有 XML 内容。 有关详细信息,请参阅配置文档Azure 密钥库基本概念

获取机密的坚实清单后,请参阅有关机密的操作员文档。 有关详细信息,请参阅以下文章:

清点所有证书

记录用于公共 SSL 终结点的所有证书。 可以通过运行以下命令来查看生产服务器上的所有证书:

keytool -list -v -keystore <path to keystore>

获得可靠的证书清单后,请使用以下文章对其进行配置:

验证支持的 Java 版本是否正常运行

使用 Liberty 需要特定版本的 Java,因此需要确认应用程序使用该受支持的版本正确运行。

WebSphere Application Server Liberty 的运行时对 Java 运行时环境(JRE)的最低级别有特定要求。 有关详细信息,请参阅 功能的 Java 版本依赖项。

Open Liberty 需要 Java 标准版 运行时。 它可以使用 Java 运行时环境(JRE)或 Java 标准版开发工具包(JDK)分发来运行。 有关详细信息,请参阅支持的 Java 标准版 版本

清点 JNDI 资源

清点所有 JNDI 资源。 例如,数据库等数据源可能具有关联的 JNDI 名称,该名称允许 JPA 正确地将 EntityManager 的实例绑定到特定数据库。 有关 JNDI 资源和数据库的详细信息,请参阅 IBM 文档中的 WebSphere 数据源 。 其他 JNDI 相关资源(如 JMS 消息代理)可能需要迁移或重新配置。 有关 JMS 配置的详细信息,请参阅 使用 JMS 资源

如果使用预生成Azure 市场产品/服务,则可以在部署时自定义的 JNDI 资源集仅限于产品/服务支持的内容。 对于 AKS 上的 WebSphere Liberty,可以在默认的 Java 命名和目录接口 (JNDI) 命名空间中提供对象。 有关详细信息,请参阅 在 Liberty 功能中使用 JNDI 默认命名空间进行开发。 有关 Open Liberty,请参阅 Java 命名和目录接口

检查配置文件配置

WAS 中的主要配置单元是配置文件。 因此, resources.xml 文件包含大量配置,必须仔细考虑进行迁移。 该文件包括对存储在子目录中的其他 XML 文件的引用。 有关详细信息,请参阅 管理分布式操作系统和 IBM i 操作系统上的配置文件。

在应用程序中

检查deployment.xml文件和/或 WEB-INF/web.xml 文件。

需要在 AKS 运行的容器映像中捕获这些自定义。 使用预生成的Azure 市场产品/服务时,最好通过创建自定义容器映像并在公共注册表中使用它来处理此类自定义,然后在部署时指向该注册表。

如果使用 WebSphere 应用程序服务器网络部署单元,则每个群集成员在传统的 WAS 安装中运行。 Liberty 是 WebSphere 应用程序服务器的轻型配置文件。 它是 WAS 的灵活动态配置文件,它使 WAS 服务器只需部署所需的自定义功能,而不是部署大量可用的 Java 企业版 组件。

确定是否使用了会话复制

如果应用程序依赖于会话副本 (replica),则可以使用以下选项:

  • 对于 HTTP 会话,根据会话管理级别,可以使用缓存或数据库来收集会话数据。
  • 对于 分布式会话,可以使用数据库会话持久性在数据库中保存会话。
  • 对于 动态缓存,可以在缓存或数据库中管理会话数据。
  • 可以将应用程序重构为使用数据库进行会话管理。
  • 可将应用程序重构为将会话外部化到 Azure Redis 服务。 有关详细信息,请参阅 Azure Cache for Redis

对于所有这些选项,最好掌握 Liberty 如何执行 HTTP 会话状态复制。 以下文档可帮助你了解如何在 Liberty 中管理 HTTP 会话:

预生成的Azure 市场产品/服务通过应用程序网关入口控制器支持会话关联。 部署产品/服务时,选择“ 启用基于 Cookie 的相关性”。

记录数据源

如果应用程序使用任何数据库,则需捕获以下信息:

  • 数据源名称是什么?
  • 连接池配置是什么?
  • 在哪里可以找到 JDBC 驱动程序 JAR 文件?

有关 WAS 中的 JDBC 驱动程序的详细信息,请参阅 将 JDBC 驱动程序与 WebSphere 应用程序服务器配合使用。

JDBC 配置是 Liberty 中的核心服务器配置。 有关详细信息,请参阅 JDBC 驱动程序

预生成的Azure 市场产品/服务对数据库的支持有限。 可以在应用程序映像中处理配置,并在部署产品/服务时使用该映像。

确定是否已自定义 WAS

确定进行了以下哪些自定义,并捕获已完成的操作。

  • 是否更改了启动脚本? 此类脚本包括 wsadmin管理员Control、管理员Config管理员App管理员Task
  • 是否有任何特定参数传递到 JVM?
  • 是否存在添加到服务器 classpath 中的 JAR?
  • OS 级设施(例如 systemd 用于导致 WAS 组件在服务器重启后自动启动)吗?

需要考虑迁移注意事项,具体取决于这些问题的解答。

需要在 AKS 运行的容器映像中捕获这些自定义。 使用预生成的Azure 市场产品/服务时,最好通过创建自定义容器映像并在公共注册表中使用它来处理此类自定义,然后在部署时指向该注册表。

确定是否需要连接到本地

如果应用程序需要访问任何本地服务,则需预配 Azure 的某个连接服务。 有关详细信息,请参阅选择用于将本地网络连接到 Azure 的解决方案。 或者,你需要重构应用程序,以便使用本地资源公开的公开可用的 API。

确定 Java 消息服务 (JMS) 队列或主题是否正在使用中

如果应用程序使用的是 JMS 队列或主题,则需要将它们迁移到外部托管的 JMS 服务器。 使用 JMS 的一种策略是使用Azure 服务总线和高级消息队列协议。 有关详细信息,请参阅将 JMS 与 Azure 服务总线和 AMQP 1.0 配合使用

如果已配置 JMS 永久性存储,则必须捕获其配置,并在迁移后应用它。

如果使用 IBM MQ,可以将此软件迁移到 Azure 虚拟机,并按原样使用它。

Microsoft 有一个解决方案,用于将 IBM MQ 与逻辑应用集成。 有关详细信息,请参阅从 Azure 逻辑应用中的工作流连接到 IBM MQ 服务器

确定是否使用自己的自定义创建的共享 Java EE 库

如果使用共享 Java EE 库功能,则可使用两个选项:

  • 重构应用程序代码以删除库上的所有依赖项,并改将功能直接合并到应用程序中。
  • 将库添加到服务器 classpath。

可以使用从 Java 企业版 应用程序访问第三方 API 中所述的相同技术处理这些库。

确定是否使用了 OSGi 捆绑

如果使用了添加到 WAS 的 OSGi 捆绑包,则需要将等效的 JAR 文件直接添加到 Web 应用程序。

可以将捆绑包包含在提供给预生成的Azure 市场产品/服务的映像中。 有关详细信息,请参阅 配置 OSGi 应用程序的库。

确定应用程序是否包含特定于 OS 的代码

如果应用程序包含的代码有主机 OS 的依赖项,则需重构该代码,删除那些依赖项。 例如,可能需要将文件系统路径中使用的 /\ 替换为 File.SeparatorPaths.get

AKS 上的 Liberty 在 Linux x86_64上运行。 任何特定于 OS 的代码都必须与 Linux 兼容。 若要了解如何发现特定的 OS 信息,请按照“确定 Liberty 版本是否兼容”部分中的步骤进行操作

确定 IBM 集成总线是否正在使用

如果应用程序使用的是 IBM 集成总线,则需要捕获 IBM 集成总线的配置方式。 有关详细信息,请参阅 IBM 集成总线文档

预生成Azure 市场产品/服务中不支持 IBM 集成总线。 若要启用该功能,请按照在 Liberty 上启用 JMS 应用程序以连接到 IBM 文档中的服务集成总线中的说明进行操作。

确定应用程序是否由多个 WAR 组成

如果应用程序由多个 WAR 组成,则应将这些 WAR 中的每一个都视为单独的应用程序,并通过本指南了解这其中的每个应用程序。

确定应用程序是否打包为 EAR

如果应用程序打包为 EAR 文件,请务必检查 application.xmlibm-application-bnd.xmiibm-application-ext.xmi 文件并捕获其配置。 有关详细信息,请参阅 在 WebSphere 上生成企业存档 (EAR) 包。

预生成的Azure 市场产品/服务允许使用现有的容器映像。 可以根据业务需求准备应用程序。

确定在生产服务器上运行的所有外部进程和守护程序

如果在应用程序服务器外运行任何进程(如监视守护程序),则需消除它们或将它们迁移到其他位置。

确定是否使用以及如何使用文件系统

Kubernetes 处理包含永久性卷的文件系统(PV)。 预生成Azure 市场产品/服务不支持装载永久性卷。 若要启用不同的存储选项,请按照Azure Kubernetes 服务中应用程序的存储选项中的说明进行操作

只读静态内容

如果应用程序当前提供静态内容,则需为其提供一个备用位置。 可能需要考虑将静态内容移到 Azure Blob 存储,并添加 Azure CDN,方便用户在全球范围内快速下载。 有关详细信息,请参阅 Azure 存储中的静态网站托管快速入门:将 Azure 存储帐户与 Azure CDN 集成。 还可以直接将静态内容部署到 Azure Spring Apps Enterprise 计划中的应用。 有关详细信息,请参阅部署 Web 静态文件

动态发布的静态内容

如果应用程序允许那些通过应用程序上传/生成但在创建后不可变的静态内容,则可将上述 Azure Blob 存储和 Azure CDN 与 Azure 函数配合使用,以便处理上传和 CDN 刷新操作。 我们提供了一个示例实现,用于通过 Azure Functions 进行静态内容的上传和 CDN 预加载操作。 还可以直接将静态内容部署到 Azure Spring Apps Enterprise 计划中的应用。 有关详细信息,请参阅部署 Web 静态文件

确定网络拓扑

当前Azure 市场套餐集是迁移的起点。 如果产品/服务未涵盖需要迁移的体系结构的各个方面,则需要捕获现有部署的网络拓扑。 然后,即使在使用解决方案模板之一建立基本产品/服务之后,也需要在 Azure 中重现该拓扑。

网络拓扑是一个广泛的主题,但以下参考可以指导迁移工作:

考虑使用 JCA 适配器和资源适配器

如果现有应用程序使用 JCA 适配器或资源适配器连接到其他企业系统,请确保将这些项目的配置应用到 AKS 上运行的 Liberty 服务器。 有关详细信息,请参阅 JCA 配置元素Java 连接or 体系结构概述。

确定是否使用聚类分析

操作员处理 AKS 上运行 WAS 工作负荷的所有可能方式的聚类分析。

检查 EJB 聚类分析

如果应用程序使用的是本地企业 Java Beans (EJB),则可能需要将它们迁移到群集 EJB。 有关详细信息,请参阅 在 Liberty 上开发 EJB 应用程序。

用于满足负载均衡要求的帐户

考虑负载均衡的最佳方式是使用内置Azure 市场产品/服务提供的应用网关集成。

迁移

本部分中的步骤假定分析已引导你决定使用预生成Azure 市场产品/服务。

预配套餐

若要在Azure 门户中打开产品/服务,请参阅 IBM WebSphere Liberty 和 Open Liberty on Azure Kubernetes 服务。 选择“创建,然后使用前面步骤中收集的信息来帮助填写产品/服务字段。

考虑密钥存储

必须考虑应用程序使用的任何 SSL/TLS 密钥存储的迁移。 有关详细信息,请参阅 Configuring Keystores(配置密钥存储)。

连接 JMS 源

连接数据库后,可以按照 IBM 文档中 JCA 配置元素概述中的说明配置 JMS。

考虑日志记录

如果不掌握日志记录,则无法执行云。 操作员提供了不同的监视方法。 有关详细信息,请参阅 监视 Liberty 服务器运行时环境。 如果更喜欢使用 Elastic Stack,Azure 为 Elastic 提供了很好的支持。 有关完整详细信息,请参阅 什么是 Elastic 与 Azure 的集成? 可以结合这两个资源中的知识来实现 AKS 上的 Liberty 的 Azure 优化日志记录解决方案。

迁移应用程序

无论是否在部署时选择提供应用程序映像,都需要通过 CI/CD 更新应用程序。 IBM 文档包含一个演示如何执行此更新的示例。 有关详细信息,请参阅 在 Liberty 中部署应用程序。

配置测试

必须针对应用程序配置任何容器内测试,以访问在 Azure 中运行的新服务器。 与 CI/CD 问题一样,必须确保必要的网络安全规则允许测试访问部署到 Azure 的应用程序。 有关详细信息,请参阅网络安全组

迁移后

实现在预迁移步骤中定义的迁移目标后,请执行某些端到端验收测试,验证一切是否按预期工作。 以下文章提供有关迁移后增强功能的信息: