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

本指南介绍在需要迁移现有 WebLogic Server (WLS) 应用程序以使之在 Azure Kubernetes 服务 (AKS) 上运行时应注意的事项。

预迁移

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

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

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

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

一旦你确定了 AKS 是合适的部署目标,你必须接受 Oracle WLS Kubernetes operator(操作员)是在 Kubernetes 上运行 WLS 的唯一方法。 接受此事实后,必须确定预生成的 Azure 市场产品/服务是否是一个很好的起点。 以下是关于预生成的 Azure 市场产品/服务需要考虑的一些事项。

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

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

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

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

首先,你必须了解 WLS“域”的概念。 域是一组逻辑上相关的 WLS 资源。 有关 WLS 域的规范定义,请参阅 Oracle 文档。 运行 AKS 上的 WLS 需要确定 AKS 如何处理域。 各种选择被称为“域主源类型”。 WLS Kubernetes Operator 支持域主源类型的三种选择。 预生成的 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 的关键补丁更新的详细信息,请参阅 Oracle 中的关键补丁更新、安全警报和公告

预生成的 Azure 市场产品/服务允许你从 OCR 和 Azure容器注册表 (ACR) 中选择 WLS 映像,从而隐式支持 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 的相关性以禁用它。 在产品/服务文档中查找基于 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 的项目的理想迁移策略。 有关详细信息,请参阅将 Java Message Service 1.1 与 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 的依赖项,则需重构该代码,删除那些依赖项。 例如,如果应用程序在 Windows 上运行,则可能需要将文件系统路径中的 /\ 替换为 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 Blob 存储和 Azure CDN 与 Azure 函数配合使用,以便处理上传和 CDN 刷新操作。 我们提供了一个示例实现,用于通过 Azure Functions 进行静态内容的上传和 CDN 预加载操作

确定网络拓扑

当前的 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 EE 应用程序客户端,最好直接使用操作员。 有关详细信息,请参阅外部客户端

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

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

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

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

在以下情况下,你可能需要通过向 WebLogic 应用修补程序来启用未知主机访问:

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

有关修补程序的详细信息,请按照如何在我的 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 更新应用程序。 操作员文档中有一个示例,显示了如何进行此更新。 有关详细信息,请参阅更新 3。 其他更新示例与迁移相关,值得探索。

测试

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

迁移后

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