你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务 (AKS) 群集上使用 WebLogic Server 部署 Java 应用程序

本文演示了以下内容的操作方法:

  • 在 Oracle WebLogic Server (WLS) 上运行 Java 应用程序。
  • 使用 Azure 市场产品/服务在 AKS 上建立 WebLogic Server 群集。
  • 生成包含 WebLogic 部署工具 (WDT) 模型的应用程序 Docker 映像。
  • 将容器化应用程序部署到 AKS 上的 WebLogic Server 群集并连接到 Microsoft Azure SQL。

本文使用适用于 WebLogic Server 的 Azure 市场产品/服务来加速你的 AKS 之旅。 该产品/服务会自动预配多种 Azure 资源,包括以下资源:

  • Azure 容器注册表实例
  • 一个 AKS 群集
  • Azure 应用程序网关入口控制器 (AGIC) 实例
  • WebLogic Kubernetes 运算符
  • 包含 WebLogic 运行时的容器映像
  • 没有应用程序的 WebLogic Server 群集

然后,本文介绍如何生成映像以更新 WebLogic Server 群集。 该映像提供应用程序和 WDT 模型。

如果希望采用自动化程度较低的方法在 AKS 上部署 WebLogic,请参阅 Oracle 官方文档 Azure Kubernetes 服务中包含的分步指南。

如果你有兴趣提供反馈或与开发 WebLogic on AKS 解决方案的工程团队就迁移方案展开密切合作,请填写这份简短的有关 WebLogic 迁移的调查并提供联系人信息。 项目经理、架构师和工程师团队会及时与你联系,以开展密切合作。

先决条件

  • 如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户
  • 确保用于登录并完成本文的 Azure 标识具有当前订阅中的所有者角色,或当前订阅中的参与者用户访问管理员角色。 有关 Azure 角色的概述,请参阅什么是 Azure 基于角色的访问控制 (Azure RBAC)? 有关 AKS 上的 WLS 所需的特定角色的详细信息,请参阅Azure 内置角色
  • 具有 Oracle 单一登录 (SSO) 帐户的凭据。 要创建帐户,请参阅创建 Oracle 帐户
  • 接受 WebLogic Server 的许可条款。
    • 访问Oracle 容器注册表并登录。
    • 如果有支持权利,请选择“中间件”,然后搜索并选择“weblogic_cpu”。
    • 如果没有 Oracle 的支持权利,请选择“中间件”,然后搜索并选择“Weblogic”。
    • 接受许可协议。

    注意

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

  • 准备安装了 Unix 之类操作系统(如 Ubuntu、Azure Linux、macOS、适用于 Linux 的 Windows 子系统)的本地计算机。
    • Azure CLI。 使用 az --version 测试 az 是否有效。 本文档已使用版本 2.55.1 进行测试。
    • kubectl。 使用 kubectl version 测试 kubectl 是否有效。 本文档已使用版本 v1.21.2 进行测试。
    • Java 开发工具包 (JDK)。 本文指导你安装 Microsoft Build of OpenJDK 11。 确保在运行命令的 shell 中正确设置 JAVA_HOME 环境变量。
    • Maven 3.5.0 或更高版本。
    • 确保已安装 zip/unzip 实用工具。 使用 zip/unzip -v 测试 zip/unzip 是否有效。

创建 Azure SQL 数据库

本部分在启用托管标识连接的情况下,使用 Microsoft Entra 身份验证创建 Azure SQL 数据库。

创建资源组

使用 az group create 创建资源组。 由于资源组在订阅中必须是唯一的,因此请选择一个唯一名称。 拥有唯一名称的一种简单方法是使用首字母缩写、今天的日期和一些标识符的组合。 例如,abc1228rg。 此示例在 eastus 位置创建一个名为 abc1228rg 的资源组:

export RESOURCE_GROUP_NAME="abc1228rg"
az group create \
    --name ${RESOURCE_GROUP_NAME} \
    --location eastus

创建数据库服务器和数据库

使用 az sql server create 命令创建服务器。 此示例使用管理员用户 azureuser 和管理员密码创建一个名为 myazuresql20130213 的服务器。 将 <your-password> 替换为你的密码。 有关详细信息,请参阅快速入门:创建单一数据库 - Azure SQL 数据库

注意

即使你在此处使用用户名和密码,这些凭据也不会在数据库外部公开。 应用层与数据库之间的连接使用托管标识进行保护。

export AZURESQL_SERVER_NAME="myazuresql20130213"
export AZURESQL_ADMIN_USER="azureuser"
export AZURESQL_ADMIN_PASSWORD="<your-password>"
export DATABASE_NAME="mysingledatabase20230213"
az sql server create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $AZURESQL_SERVER_NAME \
    --location westus \
    --admin-user $AZURESQL_ADMIN_USER \
    --admin-password $AZURESQL_ADMIN_PASSWORD

使用 az sql db create 命令在无服务器计算机层中创建数据库。

az sql db create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $AZURESQL_SERVER_NAME \
    --name $DATABASE_NAME \
    --sample-name AdventureWorksLT \
    --edition GeneralPurpose \
    --compute-model Serverless \
    --family Gen5 \
    --capacity 2

配置 Microsoft Entra 管理员

有关 Azure SQL Server 如何与托管标识交互的信息,请参阅使用 Microsoft Entra 身份验证进行连接

使用以下步骤从 Azure 门户将 Microsoft Entra 管理员帐户配置到 Azure SQL Server:

  1. Azure 门户中,打开 Azure SQL Server 实例 myazuresql20130213
  2. 选择设置,然后选择 Microsoft Entra ID。 在 Microsoft Entra ID 页上,选择设置管理员
  3. 添加管理员页中,搜索某位用户,选择该用户或组作为管理员,然后选择选择
  4. Microsoft Entra ID 页的顶部,选择保存。 对于 Microsoft Entra 用户和组,“对象 ID”显示在管理员名称旁。
  5. 更改管理员的过程可能需要几分钟时间。 然后,新管理员将显示在 Microsoft Entra ID 框中。

创建用户分配的托管标识

接下来,在 Azure CLI 中,使用 az identity create 命令在订阅中创建一个标识。 使用此托管标识连接到数据库。

az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name myManagedIdentity

为托管标识创建数据库用户

现在,从 Azure 门户以 Microsoft Entra 管理员用户身份连接到 Azure SQL 数据库,并为托管标识创建用户。

首先,创建防火墙规则以从门户访问 Azure SQL Server,如以下步骤所示:

  1. Azure 门户中,打开 Azure SQL Server 实例 myazuresql20130213
  2. 选择安全性,然后选择网络
  3. 防火墙规则下,选择添加客户端 IPV4 IP 地址
  4. 例外下,选中允许 Azure 服务和资源访问此服务器
  5. 选择“保存”。

创建防火墙规则后,可以从门户访问 Azure SQL Server。 使用以下步骤创建数据库用户:

  1. 选择设置,然后选择 SQL 数据库。 选择 mysingledatabase20230213

  2. 选择查询编辑器。 在“欢迎使用 SQL 数据库查询编辑器”页上的“Active Directory 身份验证”下,找到类似 Logged in as user@contoso.com 的消息。

  3. 选择以 user@contoso.com 继续,其中 user 是 AD 管理员帐户名称。

  4. 登录后,在查询 1 编辑器中运行以下命令,为托管标识 myManagedIdentity 创建数据库用户。

    CREATE USER "myManagedIdentity" FROM EXTERNAL PROVIDER
    ALTER ROLE db_datareader ADD MEMBER "myManagedIdentity";
    ALTER ROLE db_datawriter ADD MEMBER "myManagedIdentity";
    ALTER ROLE db_ddladmin ADD MEMBER "myManagedIdentity";
    GO
    
  5. 查询 1 编辑器中,选择运行以运行 SQL 命令。

  6. 如果命令成功完成,你会看到一条消息称“Query succeeded: Affected rows: 0”。

使用以下命令获取下一节中使用的连接字符串:

export CONNECTION_STRING="jdbc:sqlserver://${AZURESQL_SERVER_NAME}.database.windows.net:1433;database=${DATABASE_NAME};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
echo ${CONNECTION_STRING}

为示例应用程序创建架构

选择“新建查询”,然后在查询编辑器中运行以下查询:

CREATE TABLE COFFEE (ID NUMERIC(19) NOT NULL, NAME VARCHAR(255) NULL, PRICE FLOAT(32) NULL, PRIMARY KEY (ID));
CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT NUMERIC(28) NULL, PRIMARY KEY (SEQ_NAME));
INSERT INTO SEQUENCE VALUES ('SEQ_GEN',0);

成功运行后,应该会看到消息“查询成功: 受影响的行: 1”。 如果没有看到此消息,请先排除故障并解决问题,然后再继续。

可以继续在 AKS 上部署 WLS。

部署 AKS 上的 WebLogic Server

使用以下查找 AKS 上的 WebLogic Server 产品/服务并填写“基本信息”窗格:

  1. 在 Azure 门户顶部的搜索栏中输入“weblogic”。 在自动建议的搜索结果的“Azure 市场”部分中,选择“AKS 上的 WebLogic Server”。

    Azure 门户的屏幕截图,其中显示了搜索结果中的 WebLogic Server。

    也可以直接访问 AKS 上的 WebLogic Server 产品/服务。

  2. 在产品/服务页面,选择“创建”。

  3. 在“基本信息”窗格中,确保“订阅”字段中显示的值与你在登录 Azure 时使用的值相同。 确保你在订阅中使用“先决条件”部分中列出的角色。

    屏幕截图:Azure 门户,其中显示了 AKS 上的 WebLogic Server。

  4. 必须在空资源组中部署产品/服务。 在“资源组”字段中,选择“新建”,然后填写资源组的值。 由于资源组在订阅中必须是唯一的,因此请选择一个唯一名称。 拥有唯一名称的一种简单方法是使用首字母缩写、今天的日期和一些标识符的组合,例如 ejb0723wls

  5. 在“实例详细信息”下,选择部署的区域。 有关 AKS 可用 Azure 区域列表,请参阅AKS 区域可用性

  6. 在“WebLogic 的凭据”下,保留““WebLogic 管理员用户名”的默认值。

  7. 填写“WebLogic 管理员密码”的wlsAksCluster2022。 对确认和“WebLogic 模型加密的密码”字段使用相同的值。

  8. 选择下一步

使用以下步骤开始部署过程:

  1. 滚动到标记为“提供 Oracle 单一登录 (SSO) 帐户”的部分。 填写先决条件中的 Oracle SSO 凭据。

    屏幕截图:Azure 门户,其中显示了配置的 SSO 窗格。

  2. 确保记下信息框中从“在继续之前,必须先接受 Oracle 标准条款和限制”开始的步骤。

  3. 根据 Oracle SSO 帐户是否具有 Oracle 支持权利,为“选择 WebLogic Server 映像的类型”选择适当的选项。 如果帐户具有支持权利,请选择“修补的 WebLogic Server 映像”。 否则,请选择“常规 WebLogic Server 映像”。

  4. 将“选择所需的 WebLogic Server 组合...”中的值保留为默认值。 有多种 WebLogic Server、JDK 和 OS 版本可供选择。

  5. 在“应用程序”部分中,选择“部署应用程序?”旁边的“”。

以下步骤使 WebLogic Server 管理控制台和示例应用通过内置的应用程序网关入口加载项向公共 Internet 公开。 有关详细信息,请参阅什么是应用程序网关入口控制器?

  1. 选择“下一步”以查看“TLS/SSL”窗格。

  2. 选择“下一步”以查看“负载均衡”窗格。

  3. 在“负载均衡选项”旁边,选择“应用程序网关入口控制器”。

    屏幕截图:Azure 门户,其中显示了“在 Azure Kubernetes 服务上创建 Oracle WebLogic Server”页面上最简单的负载均衡器配置。

  4. 在“应用程序网关入口控制器”下,应该会看到所有字段均已预填充“虚拟网络”和“子网”的默认值。 保留默认值。

  5. 对于“为管理控制台创建入口”,选择“”。

    屏幕截图:Azure 门户,其中显示了“在 Azure Kubernetes 服务上创建 Oracle WebLogic Server”页面上的应用程序网关入口控制器配置。

  6. 选择“下一步”以查看“DNS”窗格。

  7. 选择“下一步”以查看“数据库”窗格。

通过以下步骤使用托管标识配置数据库连接:

  1. 对于连接到数据库?,请选择
  2. 在“连接设置”下,对于“选择数据库类型”,打开下拉菜单,然后选择“Microsoft SQL Server(支持无密码连接)”
  3. 对于“JNDI 名称”,输入“jdbc/WebLogicCafeDB”
  4. 对于数据源连接字符串,输入在上一节中获取的连接字符串。
  5. 选择使用无密码数据源连接
  6. 对于用户分配的托管标识,选择在上一步中创建的托管标识。 在本示例中,其名称为 myManagedIdentity
  7. 选择 添加

“连接设置”部分应如以下屏幕截图所示:

Azure 门户的屏幕截图,其中显示了“Azure Kubernetes 服务”页面上“创建 Oracle WebLogic Server”的“数据库”选项卡。

按照以下步骤完成部署:

  1. 选择“查看 + 创建”。 确保验证不会失败。 如果失败,请解决任何验证问题,然后再次选择“查看 + 创建”。
  2. 选择创建
  3. 在“部署正在进行”页面跟踪部署进度。

根据所选区域中的网络状况和其他活动,部署可能需要长达 50 分钟才能完成。

注意

如果你的组织要求在不允许公共 IP 的企业虚拟网络中部署工作负载,则你可以选择内部负载均衡器服务。 若要配置内部负载均衡器服务,请使用“负载均衡”选项卡中的以下步骤:

  1. 在“负载均衡选项”旁,选择“标准负载均衡器服务”

  2. 选择“使用内部负载均衡器”

  3. 将以下行添加到表中:

    服务名称前缀 目标 端口
    wls-admin-internal admin-server 7001
    wls-cluster-internal cluster-1 8001

“负载均衡”选项卡应如以下屏幕截图所示:

Azure 门户的屏幕截图,其中显示了“Azure Kubernetes 服务”页面上“创建 Oracle WebLogic Server”的“负载均衡”选项卡。

部署后,可以从输出中找到管理员服务器和群集的访问 URL,这些 URL 标记为 adminConsoleExternalUrlclusterExternalUrl

检查部署输出

使用本部分中的步骤验证部署是否成功。

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

  1. 在任何 Azure 门户页面的一角,依次选择汉堡菜单和“资源组”。

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

  3. 在导航窗格的“设置”部分,选择“部署”。 你将看到此资源组的部署的有序列表,最新的部署在最前面。

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

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

  5. 在导航窗格中,选择“输出”。 此列表显示了部署的输出值。 输出中包含有用的信息。

  6. adminConsoleExternalUrl 值是指向此 AKS 群集的 WebLogic Server 管理控制台的完全限定的公共 Internet 可见链接。 选择该字段值旁边的复制图标以将链接复制到剪贴板。 保存此值供稍后使用。

  7. clusterExternalUrl 值是指向此 AKS 群集上部署在 WebLogic Server 中的示例应用的完全限定的公共 Internet 可见链接。 选择该字段值旁边的复制图标以将链接复制到剪贴板。 保存此值供稍后使用。

  8. shellCmdtoOutputWlsImageModelYaml 值是用于生成容器映像的 WDT 模型的 base64 字符串。 保存此值供稍后使用。

  9. shellCmdtoOutputWlsImageProperties 值是用于生成容器映像的 WDT 模型属性的 base64 字符串。 保存此值供稍后使用。

  10. shellCmdtoConnectAks 值是用于连接到此特定 AKS 群集的 Azure CLI 命令。

输出中的其他值超出了本文范围,但在AKS 上的 WebLogic 用户指南中对此进行了详细说明。

配置和部署示例应用程序

产品/服务通过映像中的模型来预配 WebLogic Server 群集。 目前,WebLogic Server 群集尚未部署任何应用程序。

本部分使用辅助映像部署示例应用程序,以此来更新 WebLogic Server 群集。

签出应用程序

在本部分,你将克隆本指南的示例代码。 该示例位于 GitHub 上 weblogic-on-azure 存储库的 javaee/weblogic-cafe/ 文件夹中。 下面是应用程序的文件结构。

weblogic-cafe
├── pom.xml
└── src
    └── main
        ├── java
        │   └── cafe
        │       ├── model
        │       │   ├── CafeRepository.java
        │       │   └── entity
        │       │       └── Coffee.java
        │       └── web
        │           ├── rest
        │           │   └── CafeResource.java
        │           └── view
        │               └── Cafe.java
        ├── resources
        │   ├── META-INF
        │   │   └── persistence.xml
        │   └── cafe
        │       └── web
        │           ├── messages.properties
        │           └── messages_es.properties
        └── webapp
            ├── WEB-INF
            │   ├── beans.xml
            │   ├── faces-config.xml
            │   └── web.xml
            ├── index.xhtml
            └── resources
                └── components
                    └── inputPrice.xhtml

使用以下命令克隆存储库:

# cd <parent-directory-to-check-out-sample-code>
export BASE_DIR=$PWD

git clone --single-branch https://github.com/microsoft/weblogic-on-azure.git --branch 20240201 $BASE_DIR/weblogic-on-azure

如果看到消息显示正处于“拆离的 HEAD”状态,可以放心地忽略此消息。 这只标识你签出了一个标签。

使用以下命令构建 javaee/weblogic-cafe/

mvn clean package --file $BASE_DIR/weblogic-on-azure/javaee/weblogic-cafe/pom.xml

该软件包应已成功生成并位于 $BASE_DIR/weblogic-on-azure/javaee/weblogic-cafe/target/weblogic-cafe.war。 如果没有看到该包,则必须先排查并解决问题,然后才能继续。

使用 Azure 容器注册表创建辅助映像

本节中的步骤说明如何构建辅助映像。 该映像包括以下组件:

  • 映像中的模型模型文件
  • 应用程序
  • Java 数据库连接 (JDBC) 驱动程序存档文件
  • WebLogic 部署工具安装

辅助映像是包含应用程序和配置的 Docker 容器映像。 WebLogic Kubernetes 运算符将辅助映像与包含 WebLogic Server、JDK 和操作系统的 AKS 群集中的 domain.spec.image 相结合。 有关辅助映像的更多信息,请参阅 Oracle 文档中的辅助映像

本部分需要安装 Azure CLI 和 kubectl 的 Linux 终端。

使用以下步骤构建映像:

  1. 使用以下命令创建一个目录来暂存模型和应用程序:

    mkdir -p ${BASE_DIR}/mystaging/models
    cd ${BASE_DIR}/mystaging/models
    
  2. 复制从部署输出中保存的 shellCmdtoOutputWlsImageModelYaml 值,将其粘贴到 Bash 窗口中,然后运行命令。 命令应类似于以下示例:

    echo -e IyBDb3B5cmlna...Cgo= | base64 -d > model.yaml
    

    此命令会生成一个 ${BASE_DIR}/mystaging/models/model.yaml 文件,其内容类似于以下示例:

    # Copyright (c) 2020, 2021, Oracle and/or its affiliates.
    # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    
    # Based on ./kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.yaml
    # in https://github.com/oracle/weblogic-kubernetes-operator.
    
    domainInfo:
      AdminUserName: "@@SECRET:__weblogic-credentials__:username@@"
      AdminPassword: "@@SECRET:__weblogic-credentials__:password@@"
      ServerStartMode: "prod"
    
    topology:
      Name: "@@ENV:CUSTOM_DOMAIN_NAME@@"
      ProductionModeEnabled: true
      AdminServerName: "admin-server"
      Cluster:
        "cluster-1":
          DynamicServers:
            ServerTemplate: "cluster-1-template"
            ServerNamePrefix: "@@ENV:MANAGED_SERVER_PREFIX@@"
            DynamicClusterSize: "@@PROP:CLUSTER_SIZE@@"
            MaxDynamicClusterSize: "@@PROP:CLUSTER_SIZE@@"
            MinDynamicClusterSize: "0"
            CalculatedListenPorts: false
      Server:
        "admin-server":
          ListenPort: 7001
      ServerTemplate:
        "cluster-1-template":
          Cluster: "cluster-1"
          ListenPort: 8001
      SecurityConfiguration:
        NodeManagerUsername: "@@SECRET:__weblogic-credentials__:username@@"
        NodeManagerPasswordEncrypted: "@@SECRET:__weblogic-credentials__:password@@"
    
    resources:
      SelfTuning:
        MinThreadsConstraint:
          SampleMinThreads:
            Target: "cluster-1"
            Count: 1
        MaxThreadsConstraint:
          SampleMaxThreads:
            Target: "cluster-1"
            Count: 10
        WorkManager:
          SampleWM:
            Target: "cluster-1"
            MinThreadsConstraint: "SampleMinThreads"
            MaxThreadsConstraint: "SampleMaxThreads"
    
  3. 以类似的方式复制 shellCmdtoOutputWlsImageProperties 值,将其粘贴到 Bash 窗口中,然后运行命令。 命令应类似于以下示例:

    echo -e IyBDb3B5cml...pFPTUK | base64 -d > model.properties
    

    此命令会生成一个 ${BASE_DIR}/mystaging/models/model.properties 文件,其内容类似于以下示例:

    # Copyright (c) 2021, Oracle Corporation and/or its affiliates.
    # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
    
    # Based on ./kubernetes/samples/scripts/create-weblogic-domain/model-in-image/model-images/model-in-image__WLS-v1/model.10.properties
    # in https://github.com/oracle/weblogic-kubernetes-operator.
    
    CLUSTER_SIZE=5
    
  4. 使用以下步骤创建应用程序模型文件。

    1. 使用以下命令复制 weblogic-cafe.war 并将其保存到 wlsdeploy/applications

      mkdir -p ${BASE_DIR}/mystaging/models/wlsdeploy/applications
      cp $BASE_DIR/weblogic-on-azure/javaee/weblogic-cafe/target/weblogic-cafe.war ${BASE_DIR}/mystaging/models/wlsdeploy/applications/weblogic-cafe.war
      
    2. 使用以下命令创建具有所示内容的应用程序模型文件。 将模型文件保存到 ${BASE_DIR}/mystaging/models/appmodel.yaml

      cat <<EOF >appmodel.yaml
      appDeployments:
        Application:
          weblogic-cafe:
            SourcePath: 'wlsdeploy/applications/weblogic-cafe.war'
            ModuleType: ear
            Target: 'cluster-1'
      EOF
      
  5. 使用以下步骤配置数据源连接。

    1. 使用以下步骤下载并安装 Microsoft SQL Server JDBC 驱动程序和 Azure 标识扩展,以使用 Azure 托管标识启用数据库连接。

      1. 使用以下命令将 Microsoft SQL Server JDBC 驱动程序下载并安装至 wlsdeploy/externalJDBCLibraries

        export DRIVER_VERSION="10.2.1.jre8"
        export MSSQL_DRIVER_URL="https://repo.maven.apache.org/maven2/com/microsoft/sqlserver/mssql-jdbc/${DRIVER_VERSION}/mssql-jdbc-${DRIVER_VERSION}.jar"
        
        mkdir ${BASE_DIR}/mystaging/models/wlsdeploy/externalJDBCLibraries
        curl -m 120 -fL ${MSSQL_DRIVER_URL} -o ${BASE_DIR}/mystaging/models/wlsdeploy/externalJDBCLibraries/mssql-jdbc-${DRIVER_VERSION}.jar
        
      2. 使用以下命令将 Azure 标识扩展安装至 wlsdeploy/classpathLibraries

        curl -LO https://github.com/oracle/weblogic-azure/raw/refs/heads/main/weblogic-azure-aks/src/main/resources/azure-identity-extensions.xml
        
        mvn dependency:copy-dependencies -f azure-identity-extensions.xml
        
        mkdir -p ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/azureLibraries
        mkdir ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/jackson
        # fix JARs conflict issue in GA images, put jackson libraries to PRE_CLASSPATH to upgrade the existing libs.
        mv target/dependency/jackson-annotations-*.jar ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/jackson/
        mv target/dependency/jackson-core-*.jar ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/jackson/
        mv target/dependency/jackson-databind-*.jar ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/jackson/
        mv target/dependency/jackson-dataformat-xml-*.jar ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/jackson/
        # Thoes jars will be appended to CLASSPATH
        mv target/dependency/*.jar ${BASE_DIR}/mystaging/models/wlsdeploy/classpathLibraries/azureLibraries/
        
      3. 使用以下命令清理资源:

        rm target -f -r
        rm azure-identity-extensions.xml
        
    2. 通过复制之前保存的 shellCmdtoConnectAks 值,将其粘贴到 Bash 窗口中,然后运行命令来连接到 AKS 群集。 命令应类似于以下示例:

      az account set --subscription <subscription>;
      az aks get-credentials \
          --resource-group <resource-group> \
          --name <name>
      

      应会看到与如下示例类似的输出。 如果没有看到此输出,请先排除故障并解决问题,然后再继续。

      Merged "<name>" as current context in /Users/<username>/.kube/config
      
    3. 导出数据库连接模型并将其保存至 ${BASE_DIR}/mystaging/models/dbmodel.yaml。 以下步骤从 ConfigMap sample-domain1-wdt-config-map 中提取数据库配置模型。 名称遵循在产品/服务部署期间设置 <domain-uid> 的格式 <domain-uid>-wdt-config-map。 如果修改了默认值,请将其替换为你自己的域 UID。

      1. 数据密钥为 <db-secret-name>.yaml。 使用以下命令检索数据库机密名称:

        export WLS_DOMAIN_UID=sample-domain1
        export WLS_DOMAIN_NS=${WLS_DOMAIN_UID}-ns
        export DB_K8S_SECRET_NAME=$(kubectl get secret -n ${WLS_DOMAIN_NS} | grep "ds-secret" | awk '{print $1}')
        
      2. 接下来,使用以下命令提取数据库模型:

        kubectl get configmap sample-domain1-wdt-config-map -n ${WLS_DOMAIN_NS} -o=jsonpath="{['data']['${DB_K8S_SECRET_NAME}\.yaml']}" >${BASE_DIR}/mystaging/models/dbmodel.yaml
        
      3. 最后,使用以下命令验证 dbmodel.yaml 的内容。

        cat ${BASE_DIR}/mystaging/models/dbmodel.yaml
        

        此命令的输出应如下结构所示:

        # Copyright (c) 2020, 2021, Oracle and/or its affiliates.
        # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
        
        resources:
          JDBCSystemResource:
            jdbc/WebLogicCafeDB:
              Target: 'cluster-1'
              JdbcResource:
              JDBCDataSourceParams:
                 JNDIName: [
                    jdbc/WebLogicCafeDB
                 ]
                 GlobalTransactionsProtocol: OnePhaseCommit
              JDBCDriverParams:
                 DriverName: com.microsoft.sqlserver.jdbc.SQLServerDriver
                 URL: '@@SECRET:ds-secret-sqlserver-1727147748:url@@'
                 PasswordEncrypted: '@@SECRET:ds-secret-sqlserver-1727147748:password@@'
                 Properties:
                    user:
                    Value: '@@SECRET:ds-secret-sqlserver-1727147748:user@@'
              JDBCConnectionPoolParams:
                    TestTableName: SQL SELECT 1
                    TestConnectionsOnReserve: true
        
  6. 使用以下命令创建存档文件,然后移除不再需要的 wlsdeploy 文件夹:

    cd ${BASE_DIR}/mystaging/models
    zip -r archive.zip wlsdeploy
    
    rm -f -r wlsdeploy
    
  7. 使用以下命令在暂存目录中下载并安装 WebLogic 部署工具 (WDT),然后移除其 weblogic-deploy/bin/*.cmd 文件(这些文件在 UNIX 环境中不使用):

    cd ${BASE_DIR}/mystaging
    curl -m 120 -fL https://github.com/oracle/weblogic-deploy-tooling/releases/latest/download/weblogic-deploy.zip -o weblogic-deploy.zip
    
    unzip weblogic-deploy.zip -d .
    rm ./weblogic-deploy/bin/*.cmd
    
  8. 使用以下命令清理 WDT 安装程序:

    rm weblogic-deploy.zip
    
  9. 使用以下命令创建一个 dockerfile:

    cd ${BASE_DIR}/mystaging
    cat <<EOF >Dockerfile
    FROM busybox
    ARG AUXILIARY_IMAGE_PATH=/auxiliary
    ARG USER=oracle
    ARG USERID=1000
    ARG GROUP=root
    ENV AUXILIARY_IMAGE_PATH=\${AUXILIARY_IMAGE_PATH}
    RUN adduser -D -u \${USERID} -G \$GROUP \$USER
    COPY --chown=\$USER:\$GROUP ./ \${AUXILIARY_IMAGE_PATH}/
    USER \$USER
    EOF
    
  10. 使用 ${BASE_DIR}/mystaging/Dockerfile 运行 az acr build 命令,如以下示例所示:

    export ACR_NAME=<value-from-clipboard>
    export IMAGE="wlsaks-auxiliary-image:1.0"
    
  11. 使用以下命令仔细检查暂存文件:

    cd ${BASE_DIR}/mystaging
    find -maxdepth 2 -type f -print
    

    此命令会生成类似于以下示例的输出:

    ./models/model.properties
    ./models/model.yaml
    ./models/appmodel.yaml
    ./models/dbmodel.yaml
    ./models/archive.zip
    ./Dockerfile
    ./weblogic-deploy/VERSION.txt
    ./weblogic-deploy/LICENSE.txt
    
  12. 使用 az acr build以下示例所示生成映像:

    az acr build -t ${IMAGE} --build-arg AUXILIARY_IMAGE_PATH=/auxiliary -r ${ACR_NAME} --platform linux/amd64 .
    

    成功构建映像后,输出类似于以下示例:

    ...
    Step 1/9 : FROM busybox
    latest: Pulling from library/busybox
    Digest: sha256:9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7
    Status: Image is up to date for busybox:latest
    ---> 65ad0d468eb1
    Step 2/9 : ARG AUXILIARY_IMAGE_PATH=/auxiliary
    ---> Running in 1f8f4e82ccb6
    Removing intermediate container 1f8f4e82ccb6
    ---> 947fde618be9
    Step 3/9 : ARG USER=oracle
    ---> Running in dda021591e41
    Removing intermediate container dda021591e41
    ---> f43d84be4517
    Step 4/9 : ARG USERID=1000
    ---> Running in cac4df6dfd13
    Removing intermediate container cac4df6dfd13
    ---> e5513f426c74
    Step 5/9 : ARG GROUP=root
    ---> Running in 8fec1763270c
    Removing intermediate container 8fec1763270c
    ---> 9ef233dbe279
    Step 6/9 : ENV AUXILIARY_IMAGE_PATH=${AUXILIARY_IMAGE_PATH}
    ---> Running in b7754f58157a
    Removing intermediate container b7754f58157a
    ---> 4a26a97eb572
    Step 7/9 : RUN adduser -D -u ${USERID} -G $GROUP $USER
    ---> Running in b6c1f1a81af1
    Removing intermediate container b6c1f1a81af1
    ---> 97d3e5ad7540
    Step 8/9 : COPY --chown=$USER:$GROUP ./ ${AUXILIARY_IMAGE_PATH}/
    ---> 21088171876f
    Step 9/9 : USER $USER
    ---> Running in 825e0abc9f6a
    Removing intermediate container 825e0abc9f6a
    ---> b81d6430fcda
    Successfully built b81d6430fcda
    Successfully tagged wlsaksacru6jyly7kztoqu.azurecr.io/wlsaks-auxiliary-image:1.0
    2024/08/28 03:06:19 Successfully executed container: build
    2024/08/28 03:06:19 Executing step ID: push. Timeout(sec): 3600, Working directory: '', Network: ''
    2024/08/28 03:06:19 Pushing image: wlsaksacru6jyly7kztoqu.azurecr.io/wlsaks-auxiliary-image:1.0, attempt 1
    The push refers to repository [wlsaksacru6jyly7kztoqu.azurecr.io/wlsaks-auxiliary-image]
    ee589b3cda86: Preparing
    c1fd1adab3b9: Preparing
    d51af96cf93e: Preparing
    c1fd1adab3b9: Pushed
    d51af96cf93e: Pushed
    ee589b3cda86: Pushed
    1.0: digest: sha256:c813eb75576eb07a179c3cb4e70106ca7dd280f933ab33a2f6858de673b12eac size: 946
    2024/08/28 03:06:21 Successfully pushed image: wlsaksacru6jyly7kztoqu.azurecr.io/wlsaks-auxiliary-image:1.0
    2024/08/28 03:06:21 Step ID: build marked as successful (elapsed time in seconds: 8.780235)
    2024/08/28 03:06:21 Populating digests for step ID: build...
    2024/08/28 03:06:22 Successfully populated digests for step ID: build
    2024/08/28 03:06:22 Step ID: push marked as successful (elapsed time in seconds: 1.980158)
    2024/08/28 03:06:22 The following dependencies were found:
    2024/08/28 03:06:22
    - image:
       registry: wlsaksacru6jyly7kztoqu.azurecr.io
       repository: wlsaks-auxiliary-image
       tag: "1.0"
       digest: sha256:c813eb75576eb07a179c3cb4e70106ca7dd280f933ab33a2f6858de673b12eac
    runtime-dependency:
       registry: registry.hub.docker.com
       repository: library/busybox
       tag: latest
       digest: sha256:9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7
    git: {}
    
    Run ID: ca1 was successful after 14s
    

    映像在成功生成后推送到 ACR。

  13. 可以运行 az acr repository show 来测试映像是否成功已推送到远程存储库,如以下示例所示:

    az acr repository show --name ${ACR_NAME} --image ${IMAGE}
    

    此命令应生成类似于以下示例的输出:

    {
       "changeableAttributes": {
          "deleteEnabled": true,
          "listEnabled": true,
          "readEnabled": true,
          "writeEnabled": true
       },
       "createdTime": "2024-01-24T06:14:19.4546321Z",
       "digest": "sha256:a1befbefd0181a06c6fe00848e76f1743c1fecba2b42a975e9504ba2aaae51ea",
       "lastUpdateTime": "2024-01-24T06:14:19.4546321Z",
       "name": "1.0",
       "quarantineState": "Passed",
       "signed": false
    }
    

应用辅助映像

在前面的步骤中,你创建了包括模型和 WDT 的辅助映像。 使用以下步骤将辅助映像应用到 WebLogic Server 群集。

  1. 通过使用 kubectl patch 命令修补域自定义资源定义 (CRD) 来应用辅助映像。

    辅助映像在 spec.configuration.model.auxiliaryImages 中定义,如以下示例所示:

    spec:
      clusters:
      - name: sample-domain1-cluster-1
      configuration:
        model:
          auxiliaryImages:
          - image: wlsaksacrafvzeyyswhxek.azurecr.io/wlsaks-auxiliary-image:1.0
            imagePullPolicy: IfNotPresent
            sourceModelHome: /auxiliary/models
            sourceWDTInstallHome: /auxiliary/weblogic-deploy
    

    使用以下命令增加 restartVersion 值并使用 kubectl patch 将辅助映像应用到使用所示定义的域 CRD:

    export VERSION=$(kubectl -n ${WLS_DOMAIN_NS} get domain ${WLS_DOMAIN_UID} -o=jsonpath='{.spec.restartVersion}' | tr -d "\"")
    export VERSION=$((VERSION+1))
    
    export ACR_LOGIN_SERVER=$(az acr show --name ${ACR_NAME} --query "loginServer" --output tsv)
    
    cat <<EOF >patch-file.json
    [
      {
        "op": "replace",
        "path": "/spec/restartVersion",
        "value": "${VERSION}"
      },
      {
        "op": "add",
        "path": "/spec/configuration/model/auxiliaryImages",
        "value": [{"image": "$ACR_LOGIN_SERVER/$IMAGE", "imagePullPolicy": "IfNotPresent", "sourceModelHome": "/auxiliary/models", "sourceWDTInstallHome": "/auxiliary/weblogic-deploy"}]
      },
      {
       "op": "remove",
       "path": "/spec/configuration/model/configMap"
      }
    ]
    EOF
    
    kubectl -n ${WLS_DOMAIN_NS} patch domain ${WLS_DOMAIN_UID} \
        --type=json \
        --patch-file patch-file.json
    
  2. 由于在辅助映像中配置了数据库连接,请运行以下命令以移除 ConfigMap:

    kubectl delete configmap sample-domain1-wdt-config-map -n ${WLS_DOMAIN_NS}
    

在继续之前,请等待以下命令为管理员服务器和托管服务器生成以下输出:

kubectl get pod -n ${WLS_DOMAIN_NS} -w
NAME                             READY   STATUS    RESTARTS   AGE
sample-domain1-admin-server      1/1     Running   0          20m
sample-domain1-managed-server1   1/1     Running   0          19m
sample-domain1-managed-server2   1/1     Running   0          18m

系统可能需要 5-10 分钟才能达到此状态。 以下列表概述了等待期间会发生的情况:

  • 应该会看到 sample-domain1-introspector 首先运行。 该软件会查找域自定义资源的更改,以便可以对 Kubernetes 群集采取必要的操作。
  • 当检测到更改时,域内省程序会终止并启动新的 Pod 来推出更改。
  • 接下来,应该会看到 sample-domain1-admin-server Pod 终止并重启。
  • 然后,应该会看到两个托管服务器终止并重启。
  • 只有当所有三个 Pod 都显示 1/1 Running 状态时,才可以继续。

验证部署功能

按照以下步骤操作,通过查看 WebLogic Server 管理控制台和示例应用来验证部署的功能性:

  1. adminConsoleExternalUrl 值粘贴到连接 Internet 的 Web 浏览器的地址栏中。 您应该会看到熟悉的 WebLogic Server 管理控制台登录屏幕。

  2. 使用用户名 weblogic 和从 Azure 门户部署 WebLogic Server 时输入的密码登录。 回想一下,此值为 wlsAksCluster2022

  3. 在“域结构”框中,选择“服务”

  4. 在“服务”下,选择“数据源”

  5. 在“JDBC 数据源概要”面板中,选择“监视”。 屏幕外观应类似于以下示例。 你会发现数据源的状态在托管服务器上运行。

    屏幕截图:数据源状态。

  6. 在“域结构”框中,选择“部署”。

  7. 在“部署”表中,应该有一行。 该名称应与 appmodel.yaml 文件中的 Application 值相同。 选择名称。

  8. 选择“测试”选项卡

  9. 选择“weblogic-cafe”。

  10. 在“weblogic-cafe 设置”面板中,选择“测试”选项卡。

  11. 展开 weblogic-café 旁边的 + 图标。 屏幕外观应类似于以下示例。 具体而言,你应该在“测试点”列中看到类似于 http://sample-domain1-managed-server1:8001/weblogic-cafe/index.xhtml 的值。

    屏幕截图:weblogic-cafe 测试点。

    注意

    “测试点”列中的超链接不可选,因为我们没有使用运行管理控制台的外部 URL 配置管理控制台。 本文仅通过演示方式介绍 WebLogic Server 管理控制台。 运行 AKS 上的 WebLogic Server 时,请勿将 WebLogic Server 管理控制台用于任何持久配置更改。 AKS 上的 WebLogic Server 的云原生设计要求任何持久配置都必须在初始 Docker 映像中表示,或者使用 CI/CD 技术(例如更新模型)应用于正在运行的 AKS 群集,如 Oracle 文档中所述。

  12. 了解部署的示例应用的 context-path 值。 如果已部署建议的示例应用,则context-pathweblogic-cafe

  13. context-path 追加到 clusterExternalUrl 值,从而为示例应用构造完全限定的 URL。 如果已部署建议的示例应用,完全限定的 URL 应类似于 http://wlsgw202401-wls-aks-domain1.eastus.cloudapp.azure.com/weblogic-cafe/

  14. 将完全限定的 URL 粘贴到连接 Internet 的 Web 浏览器中。 如果已部署建议的示例应用,应会看到类似于以下屏幕截图的结果:

    测试 Web 应用的屏幕截图。

清理资源

若要避免 Azure 费用,应清除不需要的资源。 不再需要群集时,请使用az group delete命令。 以下命令将移除资源组、容器服务、容器注册表、数据库和所有相关资源:

az group delete --name <resource-group-name> --yes --no-wait
az group delete --name <db-resource-group-name> --yes --no-wait

后续步骤

通过以下链接详细了解如何运行 AKS 或虚拟机上的 WebLogic Server:

有关 Azure 市场上的 Oracle WebLogic 产品/服务的详细信息,请参阅 Azure 上的 Oracle WebLogic Server。 这些产品/服务全都采用自带许可模式。 它们假设你已经从 Oracle 获得了适当的许可证,并且得到了在 Azure 中运行这些产品/服务的适当许可。