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

本指南介绍在将现有 WebLogic Server (WLS) 应用程序迁移到 Azure Kubernetes 服务(AKS)上运行时应注意的内容。

预迁移

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

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

成功将 WLS 应用程序迁移到 Azure 的第一步是选择最合适的迁移目标。 WLS 在 Azure 虚拟机(VM)或Azure Kubernetes 服务(AKS)上运行良好。 VM 目标是最简单的选择,因为它最类似于本地部署。 虚拟机的管理和部署体验与本地体验非常相似。 这种宽松的权衡是经济成本。 一般来说,与 AKS 相比,基于 VM 的解决方案的每分钟成本更高。 虽然基于 AKS 的解决方案运行成本较低,但必须限制应用程序以适应 AKS 的要求。 如果最大程度地减少更改是迁移工作最重要的因素,请考虑基于 VM 的迁移。 在这种情况下,请参阅将 WebLogic 应用程序迁移到 Azure 虚拟机。 如果可以容忍将应用程序转换为 Kubernetes 中运行以降低运行时成本,请考虑基于 AKS 的迁移。 在这种情况下,请继续迁移 WebLogic Server 应用程序以Azure Kubernetes 服务

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

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

  • Oracle 和 Microsoft 创建了此产品/服务,使你能够使用 映像 域主源类型中的模型在 AKS 上快速预配 WLS。 本文稍后将更详细地介绍此概念。
  • 概括而言,产品/服务会自动执行以下步骤。
    • 如果需要,请执行现有的 WAR 或 EAR 部署。
    • 使用 WebLogic 映像工具(WIT)将其包装在容器中。 有关详细信息,请参阅 Oracle 文档中的 WebLogic 映像工具
    • 在 AKS 上安装和配置 WebLogic Kubernetes 运算符。
    • 使用运算符运行整个操作。 操作员调用 WebLogic 部署工具(WDT),以基于元数据模型以可重复的方式运行 WebLogic 环境并执行域生命周期操作。 有关详细信息,请参阅 Oracle 文档中的 WebLogic 部署工具
  • 尽管预生成产品/服务确实提供了许多 Azure 服务集成,例如应用网关、弹性日志记录、数据库集成等,但它确实做了许多简化的假设。 这些假设使产品/服务不如自己掌握和使用操作员那么灵活。

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

本部分的其余部分提供了一些注意事项,用于决定使用预生成Azure 市场产品/服务或使用操作员直接使用。

决定是否使用预生成的Azure 市场产品/服务

首先,必须了解 WLS“域”的概念。 域是逻辑上相关的 WLS 资源组。 有关 WLS 域的规范定义,请参阅 Oracle 文档。 在 AKS 上运行 WLS 需要确定 AKS 如何处理域。 各种选项称为“域主源类型”。 WLS Kubernetes 运算符支持域主源类型的三种选择。 预生成的Azure 市场产品/服务使用此表中的第一个产品/服务。

域主源类型 说明 积极方面 负面方面
图像中的模型 WLS 和应用程序位于容器映像中,其他所有内容都保留在该映像之外。 预生成产品/服务支持。 记录为官方示例;请参阅 Oracle。 大多数都使用 WDT。 大多数“云原生”选项。 最简单的 CI/CD 集成。 最大的学习曲线。
PV 中的域 域驻留在 Kubernetes 永久性卷上。 从概念上讲,类似于在 VM 上运行。 可以使用 WLS 控制台进行更改,并且这些更改会在 AKS Pod 重启时保留。 记录为官方示例;请参阅 Oracle 必须缓解与 NFS 相关的一些挑战。 有关详细信息,请参阅 Oracle。 此方法是最少的“云原生”技术;状态完全驻留在 AKS 群集之外。
图像中的域 域驻留在容器映像中。 应用程序包含在域映像上叠加的容器映像中。 与 PV 中的域相比,“云原生”更多。 CI/CD 更容易。 无法使用 WLS 控制台。 必须维护更多容器映像。

重要

如果选择 PV 源类型中的域,强烈建议使用 NFS 而不是 SMB。 NFS 从 UNIX 操作系统和其他变体(如 GNU/Linux)演变而来。 因此,将 NFS 与 Docker 等容器技术配合使用时,并发读取和文件锁定不太可能出现问题。

请务必启用 NFS v4.1。 低于 v4.1 的版本将出现问题。

运算符文档还包括一个有用的表,用于比较各种选项。 有关详细信息,请参阅 “选择域主源类型”。

若要了解预生成的Azure 市场产品/服务,请参阅快速入门:使用 Azure 门户 在 Azure Kubernetes 服务 上部署 WebLogic Server。 有关预生成Azure 市场产品/服务的参考文档,请参阅 Oracle

若要直接使用运算符,请尝试操作员文档中的示例

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

确定 WebLogic 版本是否兼容

现有 WLS 版本必须是操作员支持的版本之一。 Oracle 在 Oracle 容器注册表(OCR)中维护这些版本。 使用以下步骤查看受支持的版本列表。

  1. 访问 Oracle 容器注册表网站并登录。 有关详细信息,请参阅 https://container-registry.oracle.com/
  2. 如果你有支持权利,请选择 中间件,然后搜索 weblogic_cpu。 选择 weblogic_cpu
  3. 如果没有 Oracle 的支持权利,请选择 中间件,然后搜索 Weblogic。 选择 Weblogic

注意

在进入生产之前,获取 Oracle 的支持权利。 否则会导致运行不安全的映像,这些映像未针对严重安全漏洞进行修补。 有关 Oracle 关键修补程序更新的详细信息,请参阅关键修补程序汇报、安全警报和公告

预生成的Azure 市场产品/服务允许从 OCR 中选择 WLS 映像和Azure 容器注册表 (ACR),从而隐式支持 OCR 提供的所有版本。 如果指示产品/服务从 ACR 拉取映像,请确保它派生自 OCR 中列出的某个受支持的版本。

清点服务器容量

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

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

清点所有机密

在出现“配置即服务”技术(如 Azure Key Vault)之前,没有有关“机密”的明确定义的概念。 你只能使用一组不同的配置设置,这些设置可以有效地充当我们现在所称的“机密”。 在应用服务器(如 WebLogic Server)中,这些机密位于许多不同的配置文件和配置存储中。 检查生产服务器上的所有属性和配置文件中是否有机密和密码。 请确保在 WAR 中检查 weblogic.xml。 还可以在应用程序中查找包含密码或凭据的配置文件。 有关详细信息,请参阅 Azure Key Vault 基本概念

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

清点所有证书

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

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

拥有可靠的证书清单后,可以直接使用预生成的Azure 市场产品/服务安装它们。 有关详细信息,请参阅 TLS/SSL 配置。 如果直接使用操作员,请参阅 “更新操作员”外部证书

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

WebLogic 到 Azure 的所有迁移路径都需要一个特定的 Java 版本,该版本因路径而异。 需验证应用程序能否使用该支持的版本正确运行。

注意

如果当前服务器在不受支持的 JDK(如 Oracle JDK 或 IBM OpenJ9)上运行,则此验证尤其重要。

若要获取当前的 Java 版本,请登录到生产服务器并运行以下命令:

java -version

注意

迁移到 Azure 虚拟机上的 WLS 时,特定 Java 版本的要求由虚拟机上预安装的 Java 确定。 迁移到 AKS 上的 WLS 时,特定 Java 版本由所选的容器映像决定。 有多种选择,但所有这些选项都使用 Oracle JDK。

清点 JNDI 资源

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

如果使用预生成Azure 市场产品/服务,则可以在部署时自定义的 JNDI 资源集仅限于产品/服务支持的内容。 在产品/服务文档中搜索 JNDI。 如果直接使用操作员,可以根据所选域主源类型定义 JDNI 资源。 对于 PV 中的域,可以使用 WLST 或管理控制台设置常规方式。 有关 图像 中的域或 图像中的模型,请参阅 典型替代

检查域配置

WebLogic Server 中的主要配置单元是域。 因此,config.xml 文件包含了大量的配置,进行迁移时必须仔细考虑这些配置。 此文件包含对存储在子目录中的其他 XML 文件的引用。 Oracle 建议你正常情况下使用管理控制台来配置 WebLogic Server 的可管理对象和服务,并允许 WebLogic Server 保留 config.xml 文件。 有关详细信息,请参阅 Domain Configuration Files(域配置文件)。

在应用程序中

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

预生成的Azure 市场产品/服务会自动创建域资源。 如果直接使用操作员,则可以完全自定义域的表示方式。 有关完整信息,请参阅 “域资源”。

确定是否使用了会话复制

如果应用程序依赖于会话复制,则无论是否有 Oracle Coherence*Web,都可以使用三个选项:

  • Coherence*Web 可以在 Azure 虚拟机中与 WebLogic Server 一起运行,但你必须在预配套餐后手动配置此选项。 如果使用独立的 Coherence,也可在 Azure 虚拟机中运行它,但必须在预配套餐后手动配置此选项。
  • 重构应用程序,使用数据库进行会话管理。
  • 重构应用程序,将 Azure Redis 服务的会话外部化。 有关详细信息,请参阅 Azure Cache for Redis

对于所有这些选项,最后是掌握 WebLogic 如何执行 HTTP 会话状态复制。 有关详细信息,请参阅 Oracle 文档中的 HTTP 会话状态复制

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

记录数据源

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

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

有关 WebLogic 中的 JDBC 驱动程序的详细信息,请参阅 Using JDBC Drivers with WebLogic Server(将 JDBC 驱动程序与 WebLogic Server 配合使用)。

预生成的Azure 市场产品/服务支持最常用的数据库。 有关详细信息,请参阅 数据库。 对于 PV 中的域,可以使用 WLST 或管理控制台设置常规方式。 有关 图像 中的域或 图像中的模型,请参阅 典型替代

确定是否已自定义 WebLogic

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

  • 是否更改了启动脚本? 此类脚本包括 setDomainEnvcommEnvstartWebLogicstopWebLogic
  • 是否有任何特定参数传递到 JVM?
  • 是否存在添加到服务器 classpath 中的 JAR?

需要在 AKS 运行的容器映像中捕获这些自定义。 对于预生成的Azure 市场产品/服务,此类自定义项最好是通过创建自定义容器映像并在Azure 容器注册表中可用,然后在部署时指向该注册表。 有关详细信息,请参阅 图像选择。 如果直接使用运算符,请参阅 JVM 内存和 Java 选项环境变量

确定是否使用了基于 REST 的管理

如果应用程序的生命周期包括使用基于 REST 的管理,则需捕获用于访问 REST API 的具体端口,并确定如何对其进行身份验证以及如何将其公开。 迁移后,需确保这些相同的端口和身份验证机制是公开的,这样应用程序生命周期就能以类似于迁移之前的方式运行。 有关详细信息,请参阅使用 RESTful Management Services 管理 Oracle WebLogic Server

唯一一种域主源类型,即继续使用基于 REST 的管理是 PV 中的域。 可以将它与其他域主源类型一起使用,但所做的更改是临时的,不会在 Pod 重启之间保留。

确定是否需要连接到本地

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

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

如果应用程序使用 JMS 队列或主题,则需将其迁移到外部托管的 JMS 服务器。 Azure 服务总线和高级消息队列协议可成为那些使用 JMS 的项目的理想迁移策略。 有关详细信息,请参阅将 JMS 与 Azure 服务总线和 AMQP 1.0 配合使用

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

如果使用 Oracle Message Broker,则可将此软件迁移到 Azure 虚拟机并按原样使用。

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

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

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

可以使用与确定 WebLogic 是否已自定义相同的技术来处理这些库。

确定是否使用了 OSGi 捆绑

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

可以将它们包含在提供给预生成的Azure 市场产品/服务的 WAR 或 EAR 中,也可以直接使用操作员。

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

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

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

确定 Oracle 服务总线是否正在使用中

如果应用程序使用 Oracle 服务总线 (OSB),则需捕获 OSB 的配置方式。 有关详细信息,请参阅 About the Oracle Service Bus Installation(关于 Oracle 服务总线安装)。

预生成Azure 市场产品/服务中不支持 OSB。 如果必须使用 OSB,则必须直接使用运算符。

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

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

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

如果应用程序打包为 EAR 文件,请务必检查 application.xmlweblogic-application.xml 文件并捕获其配置。

预生成的Azure 市场产品/服务支持 WAR 和 EAR。 直接使用运算符还支持 WAR 和 EAR。

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

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

确定是否使用了 WebLogic 脚本编写工具 (WLST)

如果当前使用 WLST 来执行部署,则需评估其功能。 如果 WLST 在部署过程中更改应用程序的任何(运行时)参数,则需确保在迁移后测试应用程序时此行为继续有效。

与使用 WLST 兼容的唯一域主源类型是 PV 中的域。 有关详细信息,请参阅 PV 上的域主页。

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

Kubernetes 处理包含永久性卷的文件系统(PV)。 预生成Azure 市场产品/服务支持装载永久性卷,并且直接使用运算符时支持装载永久性卷。 如果在 PV 中使用域,则文件系统是配置的核心方面。

只读静态内容

如果应用程序当前提供静态内容,则需为其提供一个备用位置。 可能需要考虑将静态内容移到 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 适配器和资源适配器的使用

如果部署依赖于资源适配器,则最受支持的选项是 PV 上的域主页。

考虑自定义安全提供程序和 JAAS 的使用

如果应用程序使用 JAAS,则需确保正确迁移安全提供程序的配置。 有关详细信息,请参阅 Oracle 文档中的 About Configuring WebLogic Security Providers(关于配置 WebLogic 安全提供程序)。

如果部署依赖于安全提供程序,则最受支持的选项是 PV 上的域主页。

确定是否使用了 WebLogic 聚类分析

运算符处理 AKS 上运行 WLS 的所有可能方式的聚类分析。

检查 EJB 聚类分析

如果应用程序使用的是本地 EJB,则需要将其迁移到群集 EJB。 有关详细信息,请参阅 群集 EJB 与本地 EJB

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

考虑负载均衡的最佳方式是使用内置Azure 市场产品/服务提供的应用网关集成。 有关详细信息,请参阅教程:使用Azure 应用程序网关作为负载均衡器将 WebLogic Server 群集迁移到 Azure。

确定是否使用了 Java EE 应用程序客户端功能

如果部署依赖于 Java 企业版应用程序客户端,最好直接使用运算符。 有关详细信息,请参阅 外部客户端

确定是否需要多个容器映像

WebLogic Server 域可以包含多个群集。 例如,多层应用程序可以在单个域中表示,但有两个群集,例如“前端”和“后端”。 在不更新后端的情况下,能够更新前端非常有用,反之亦然。 但是,使用 Image 域主源类型的模型,整个域在一个容器映像中表示。 若要适应此用例,必须将群集分成自己的域,每个群集都有自己的容器映像。 操作员可以在多个命名空间中管理多个域。 有关详细信息,请参阅 “选择域命名空间选择策略”

采用多个域可能会导致域之间出现 T3 访问问题。 若要解决这些问题,请启用自定义通道,如 确定是否需要启用未知主机访问

确定是否需要启用未知主机访问

对于以下方案,可能需要向 WebLogic 应用修补程序来启用未知主机访问:

  • 允许通过自定义通道从 AKS 外部的外部客户端访问 AKS 中的 WLS 群集。
  • 允许通过自定义通道在 AKS 中的不同 WLS 域之间进行 T3 访问。

有关修补程序的详细信息,请按照“如何在 My Oracle 支持(MOS)中使用修补程序搜索”中的指南进行操作,然后搜索修补程序30656708

应用修补程序后,请参阅 “启用未知主机访问”。

迁移

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

预配套餐

若要在Azure 门户中打开产品/服务,请参阅https://aka.ms/wlsaks。 选择“创建,然后按照产品/服务文档中的说明进行操作。 使用前面步骤中收集的信息来帮助填写产品/服务字段。

迁移域

预配产品/服务后,请按照以下步骤输出域。

如果你已离开“部署正在进行”页面,后续步骤将演示如何返回该页面。 如果你仍在显示“部署已完成”的页面上,则可以跳到步骤 5。

  1. 在任何门户页面的左上角,选择汉堡菜单,并选择“资源组”。

  2. 在包含文本“筛选任何字段”的框中,输入之前创建的资源组的前几个字符。 如果遵循了建议的约定,请输入缩写,然后选择相应的资源组。

  3. 在左侧导航窗格中的“设置”部分中,选择“部署以查看此资源组的部署的有序列表,其中最先显示一个部署。

  4. 滚动到此列表中最早的条目。 此条目对应于在上一部分中启动的部署。 选择最早的部署,如以下屏幕截图所示。

    Azure 门户的屏幕截图,其中显示了资源组部署列表。

  5. 在左侧窗格中,选择“输出”。 此列表显示了部署的输出值。 输出中包含有用的信息。 我们对允许我们检查域并与操作员交互的输出感兴趣。 输出中的其他值在 AKS 用户指南中的 WebLogic 中详细介绍。

  6. 找到名为 shellCmdtoConnectAks.. 的输出。 将输出的值粘贴到 Bash shell 中,然后运行该命令。 此命令使你能够按照群集连接中所述使用kubectl

  7. 找到名为 shellCmdtoOutputWlsDomainYaml.. 的输出。 将输出的值粘贴到 Bash shell 中,然后运行该命令。 此命令将域资源输出为 YAML 文件。

  8. 拥有当前部署的域 YAML 后,可以应用部署域资源 YAML 文件中的知识,并查看本指南,了解有关如何迁移域的更多线索。 本指南需要适应 Kubernetes 执行操作的方式,但了解这一点仍然很有用。

考虑密钥存储

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

连接 JMS 源

连接数据库后,可以按照 WebLogic 文档的 Fusion Middleware Administering JMS Resources for Oracle WebLogic Server(Fusion Middleware:管理 Oracle WebLogic Server 的 JMS 资源)中的说明配置 JMS。

考虑日志记录

如果不掌握日志记录,则无法执行云。 操作员提供了使用 Elasticsearch 和 Kibana 的示例。 有关详细信息,请参阅 操作员文档。 Azure 为 Elastic 提供了很好的支持。 有关完整详细信息,请参阅什么是 Elastic 与 Azure 的集成? 可以结合这两个资源中的知识来实现 AKS 上的 WLS 的 Azure 优化日志记录解决方案。

迁移应用程序

无论在部署时是否选择提供 WAR 或 EAR 文件,都需要通过 CI/CD 更新应用程序。 操作员文档包含一个演示如何执行此更新的示例。 有关详细信息,请参阅 Update 3。 其他更新示例与迁移相关,值得探索。

测试

针对应用程序的任何容器内测试都必须配置为访问 Azure 中运行的新服务器。 如果涉及 CI/CD,则必须确保所需的网络安全规则允许你的测试访问已部署到 Azure 的应用程序。 有关详细信息,请参阅网络安全组

迁移后

实现在预迁移步骤中定义的迁移目标后,请执行某些端到端验收测试,验证一切是否按预期工作。 有关某些潜在的迁移后增强功能的指导,请参阅以下建议: