教程:将 Oracle WebLogic Server 迁移到基于 Prometheus 指标的 KEDA 缩放程序Azure Kubernetes 服务(AKS)

本教程介绍如何将 Oracle WebLogic Server (WLS) 迁移到 Azure Kubernetes 服务 (AKS),并基于 Prometheus metrics 配置自动水平缩放。

在本教程中,你将完成以下任务:

  • 了解可以使用 WebLogic Monitoring Exporter 导出哪些 WebLogic 应用程序指标。
  • 使用 Azure 市场产品/服务在 AKS 上部署和运行 WebLogic 应用程序。
  • 使用 Azure 市场产品/服务为 Prometheus 启用 Azure Monitor 托管服务。
  • 使用 Azure 市场产品/服务将 WLS 指标馈送到 Azure Monitor 工作区。
  • 使用 Azure 市场产品/服务将 Kubernetes Event-driven Autoscaling (KEDA) 与 AKS 群集集成。
  • 基于 Prometheus Metrics 创建 KEDA 缩放程序。
  • 验证缩放程序配置。

下图说明了你构建的体系结构:

基于 Prometheus Metrics 的 KEDA 缩放程序在 AKS 上的 WLS 解决方案体系结构图。

AKS 上的 Oracle WebLogic Server 产品/服务在 AKS 上运行 WLS Operator 和 WLS 域。 WLS Operator 管理使用映像中的模型域源类型中部署的 WLS 域。 若要了解有关 WLS Operator 的详细信息,请参阅 Oracle WebLogic Kubernetes Operator

WebLogic Monitoring Exporter 抓取 WebLogic Server 指标,并将其馈送给 Prometheus。 导出程序使用 WebLogic Server 12.2.1.x RESTful 管理接口来访问运行时状态和指标。

适用于 Prometheus 的 Azure Monitor 托管服务可根据 Cloud Native Computing Foundation 中的 Prometheus 项目,使用与 Prometheus 兼容的监视解决方案大规模收集和分析来自 WLS 的指标。 有关详细信息,请参阅适用于 Prometheus 的 Azure Monitor 托管服务

本文将 KEDA 与 AKS 群集集成,以基于 Azure Monitor 工作区中的 Prometheus 指标缩放 WLS 群集。 KEDA 监视适用于 Prometheus 的 Azure Monitor 托管服务,并将这些数据馈送给 AKS 和水平 Pod 自动缩放程序 (HPA),以推动 WLS 工作负载的快速缩放。

默认情况下,导出以下 WLS 状态和指标。 可以将导出程序配置为按需导出其他指标。 有关 WebLogic Monitoring Exporter 配置和用法的详细说明,请参阅 WebLogic Monitoring Exporter

WebLogic Metrics。

先决条件

  • Azure 订阅。 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户
  • 确保你在订阅中拥有 Owner 角色或 ContributorUser Access Administrator 角色。 可以使用使用 Azure 门户列出 Azure 角色分配中的步骤来验证分配。
  • 准备一台安装了 WSL、GNU/Linux 或 macOS 的 Windows 本地计算机。
  • 安装 Azure CLI 2.54.0 或更高版本以运行 Azure CLI 命令。
  • 安装并设置 kubectl
  • 安装 cURL
  • 具有 Oracle 单一登录 (SSO) 帐户的凭据。 要创建帐户,请参阅创建 Oracle 帐户
  • 使用以下步骤接受 WLS 的许可条款:
    1. 访问Oracle 容器注册表并登录。
    2. 如果有支持权利,请选择“中间件”,然后搜索并选择“weblogic_cpu”。
    3. 如果没有 Oracle 的支持权利,请选择“中间件”,然后搜索并选择“Weblogic”。
    4. 接受许可协议。

准备示例应用程序

本文使用 weblogic-kubernetes-operator 存储库中的 testwebapp 作为示例应用程序。

使用以下命令下载预生成的示例应用并将其扩展到目录中。 由于本文编写了多个文件,因此这些命令创建了一个包含所有内容的顶级目录。

export BASE_DIR=$PWD/wlsaks
mkdir $BASE_DIR && cd $BASE_DIR
curl -L -o testwebapp.war https://aka.ms/wls-aks-testwebapp
unzip -d testwebapp testwebapp.war

修改示例应用程序

本文使用指标 openSessionsCurrentCount 来纵向扩展和缩减 WLS 群集。 默认情况下,WebLogic Server 上的会话超时为 60 分钟。 若要快速观察纵向缩减功能,请使用以下步骤设置短超时:

  1. 使用以下命令,使用 wls:timeout-secs 指定 150 秒的会话超时。 HEREDOC 格式用于使用所需内容覆盖 testwebapp/WEB-INF/weblogic.xml 上的文件。

    cat <<EOF > testwebapp/WEB-INF/weblogic.xml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
        <wls:weblogic-version>12.2.1</wls:weblogic-version>
        <wls:jsp-descriptor>
        <wls:keepgenerated>false</wls:keepgenerated>
        <wls:debug>false</wls:debug>
      </wls:jsp-descriptor>
      <wls:context-root>testwebapp</wls:context-root>
      <wls:session-descriptor>
        <wls:timeout-secs>150</wls:timeout-secs>
     </wls:session-descriptor>
    </wls:weblogic-web-app>
    EOF
    
  2. 使用以下命令重新打包示例应用:

    cd testwebapp && zip -r ../testwebapp.war * && cd ..
    

创建 Azure 存储帐户,并上传应用程序

使用以下步骤创建存储帐户和容器。 其中一些步骤会将你定向到其他指南。 完成这些步骤后,你可以上传一个示例应用程序以在 WLS 上部署。

  1. 登录到 Azure 门户
  2. 按照创建存储帐户中的步骤创建存储帐户。 对该文章中的值使用以下专用化:
    • 为存储帐户创建新的资源组。
    • 对于“区域”,请选择“美国东部”。
    • 对于存储帐户名,请使用与资源组名相同的值。
    • 对于“性能”,请选择“标准”。
    • 其余选项卡不需要专用化。
  3. 继续验证并创建帐户,然后返回本文。
  4. 按照快速入门:使用 Azure 门户上传、下载和列出 blob创建容器部分中的步骤,在帐户中创建存储容器。
  5. 在同一篇文章中,按照上传块 blob 部分中的步骤上传 testwebapp.war 文件。 然后,返回到本文。

使用 Azure 市场产品/服务在 AKS 上部署 WLS

在本节中,将使用 AKS 上的 Oracle WebLogic Server 产品/服务在 AKS 上创建 WLS 群集。 产品/服务提供了一个完整的功能集,用于在 AKS 上轻松部署 WebLogic Server。 本文重点介绍产品/服务的高级动态缩放功能。 有关产品/服务的详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 群集上使用 WebLogic Server 部署 Java 应用程序。 有关产品/服务的完整参考文档,请参阅 Oracle 文档

此产品/服务实现了以下水平自动缩放选项:

  • Kubernetes 指标服务器。 此选项在部署时设置所有必要的配置。 水平 Pod 自动缩放程序 (HPA) 的部署具有多种指标可供选择。 部署后,你可以进一步自定义 HPA。

  • WebLogic Monitoring Exporter。 此选项会自动预配 WebLogic Monitoring Exporter、适用于 Prometheus 的 Azure Monitor 托管服务和 KEDA。 产品/服务部署完成后,WLS 指标将导出并保存在 Azure Monitor 工作区中。 KEDA 已安装,能够从 Azure Monitor 工作区中检索指标。

    使用此选项,必须在部署后执行更多步骤才能完成配置。

本文介绍第二种选择。 使用以下步骤完成配置:

  1. 在浏览器中打开 AKS 上的 Oracle WebLogic Server 产品/服务,然后选择创建。 应会看到产品/服务的基本信息窗格。

  2. 使用以下步骤填写基本信息窗格:

    1. 确保为订阅显示的值与“先决条件”部分中列出的角色的值相同。
    2. 必须在空资源组中部署产品/服务。 在资源组字段中,选择新建,然后为资源组填写唯一值 - 例如,wlsaks-eastus-20240109
    3. 实例详细信息下,选择区域,选择美国东部
    4. 凭据 WebLogic 下,分别提供 WebLogic 管理员WebLogic 模型加密的密码。 为 WebLogic 管理员保存用户名和密码。
    5. 可选基本配置旁边,选择
    6. 可选基本配置下,将最大动态群集大小设置为 10。 此值使你能够观察自动缩放行为。

    Azure 门户的屏幕截图,显示了 AKS“基本信息”窗格上的 Oracle WebLogic Server。

  3. 选择下一步,然后转到 AKS 选项卡。

  4. 图像选择下,使用以下步骤:

    1. 对于 Oracle 单点登录身份验证的用户名,请从前提条件中填写 Oracle SSO 用户名。
    2. 对于 Oracle 单点登录身份验证的密码,请从前提条件中填写 Oracle SSO 凭据。

    Azure 门户的屏幕截图,显示了“AKS 上的 Oracle WebLogic Server”窗格 -“图像选择”。

  5. 应用程序下,使用以下步骤:

    1. 应用程序部分的部署应用程序?旁边,选择“是”。

    2. 在“应用程序包 (.war,.ear,.jar) ”旁边,选择“浏览”。

    3. 开始键入上一部分中的存储帐户名称。 当所需的存储帐户出现时,请选择它。

    4. 选择上一部分中的存储容器。

    5. 选中你在上一节中上传的 testwebapp.war 旁边的复选框。 选择“选择” 。

    6. 选择下一步

      Azure 门户的屏幕截图,显示了“AKS 上的 Oracle WebLogic Server”窗格 -“应用选择”。

  6. TLS/SSL 配置窗格中保留默认值。 选择下一步转到负载均衡窗格,然后使用以下步骤:

    1. 保留所有选项的默认值,但为管理控制台创建入口。确保没有带有路径 /console* 的应用程序,这将导致与管理控制台路径冲突除外。 对于此选项,选择
    2. 保留其余字段的默认值。
    3. 选择下一步

    Azure 门户的屏幕截图,显示了“AKS 上的 Oracle WebLogic Server 群集负载均衡”窗格。

  7. 保留 DNS 窗格的默认值,然后选择下一步转到数据库窗格。

  8. 保留数据库窗格的默认值,选择下一步转到自动缩放窗格,然后使用以下步骤:

    1. 为水平自动缩放预配资源?旁边,选择
    2. 水平自动缩放设置下,在选择自动缩放选项旁,选择 WebLogic Monitor Exporter(高级自动缩放)
    3. 选择“查看 + 创建”。

    Azure 门户的屏幕截图,显示了“AKS 上的 Oracle WebLogic Server 群集水平自动缩放”窗格。

  9. 等待正在运行最终验证... 成功完成,然后选择创建。 过了一会儿,应会看到部署页,其中显示了部署正在进行中

如果在正在运行最终验证... 期间看到任何问题,请修复这些问题,然后重试。

连接到 AKS 群集

以下部分需要安装了 kubectl 的终端来管理 WLS 群集。 若要在本地安装 kubectl,请使用 az aks install-cli 命令。

使用以下步骤连接到 AKS 群集:

  1. 打开 Azure 门户,转到在使用 Azure 市场产品/服务在 AKS 上部署 WLS 部分中预配的资源组。
  2. 从资源列表中选择类型为 Kubernetes 服务的资源。
  3. 选择“连接” 。 此时会显示连接 AKS 群集的指南。
  4. 选择 Azure CLI,并按照步骤连接到本地终端中的 AKS 群集。

从 Azure Monitor 工作区检索指标

使用以下步骤,查看使用 Prometheus 查询语言 (PromQL) 查询的 Azure Monitor 工作区中的指标:

  1. 在Azure 门户中,查看使用 Azure 市场产品/服务在 AKS 上部署 WLS 部分中使用的资源组。

  2. 选择类型为 Azure Monitor 工作区的资源。

  3. 托管 Prometheus 下,选择 Prometheus 资源管理器

  4. 输入 webapp_config_open_sessions_current_count,查询当前已打开会话的帐户,如以下屏幕截图所示:

    Azure 门户的屏幕截图,显示了 Prometheus 资源管理器。

注意

可以使用以下命令通过公开 WebLogic Monitoring Exporter 来访问指标:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: sample-domain1-cluster-1-exporter
  namespace: sample-domain1-ns
spec:
  ports:
  - name: default
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    weblogic.domainUID: sample-domain1
    weblogic.clusterName: cluster-1
  sessionAffinity: None
  type: LoadBalancer
EOF

kubectl get svc -n sample-domain1-ns -w

等待 sample-domain1-cluster-1-exporter 所在行的 EXTERNAL-IP 列从 <pending> 切换到 IP 地址。 然后,在浏览器中打开 URL http://<exporter-public-ip>:8080/metrics,并使用部署产品/服务时指定的凭据登录。 在这里,可以找到所有可用的指标。 可以在 PromQL 窗口中输入其中任一项,以在 Azure Monitor 中显示它们。 例如,heap_free_percent 显示一个有趣的图形。 若要在将负载应用于应用程序时监视内存压力,请将自动刷新时间范围设置为尽可能小的间隔,并将选项卡保持打开状态。

创建 KEDA 缩放程序

缩放器定义 KEDA 应如何以及何时缩放部署。 本文使用 Prometheus 缩放程序从 Azure Monitor 工作区检索 Prometheus 指标。

本文使用 openSessionsCurrentCount 作为触发器。 此指标的规则如下所述。 当平均打开会话计数超过 10 时,请纵向扩展 WLS 群集,直到达到最大副本大小。 否则,请纵向缩减 WLS 群集,直到达到其最小副本大小。 下表列出了重要参数:

参数名称
serverAddress Azure Monitor 工作区的查询终结点。
metricName webapp_config_open_sessions_current_count
query sum(webapp_config_open_sessions_current_count{app="app1"})
threshold 10
minReplicaCount 1
maxReplicaCount 默认值为 5。 如果在产品/服务部署期间修改了最大群集大小,请替换为最大群集大小。

由于在部署时选择了 WebLogic Monitoring Exporter,因此 KEDA 缩放程序已准备好进行部署。 以下步骤介绍如何配置 KEDA 缩放程序以用于 AKS 群集:

  1. 打开 Azure 门户,转到在使用 Azure 市场产品/服务在 AKS 上部署 WLS 部分中预配的资源组。

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

  3. 滚动到此列表中最早的条目。 此条目对应于你在上一节中启动的部署。 选择最旧的部署,其名称以类似于 oracle.20210620-wls-on-aks 的内容开头。

  4. 选择“输出”。 此选项显示部署的输出列表。

  5. kedaScalerServerAddress 值是保存 WLS 指标的服务器地址。 KEDA 能够从地址访问和检索指标。

  6. shellCmdtoOutputKedaScalerSample 值是缩放程序示例的 base64 字符串。 复制该值,并在终端中运行。 命令应类似于以下示例:

    echo -e YXBpVm...XV0aAo= | base64 -d > scaler.yaml
    

    此命令在当前目录中生成一个 scaler.yaml 文件。

  7. 修改 scaler.yaml 中的 metric:query: 行,如以下示例所示:

    metricName: webapp_config_open_sessions_current_count
    query: sum(webapp_config_open_sessions_current_count{app="app1"})
    

    注意

    当使用产品/服务部署应用时,默认情况下它的名称为 app1。 可以使用以下步骤访问 WLS 管理控制台,以获取应用程序名称:

    1. 使用前面的步骤查看部署输出。
    2. adminConsoleExternalUrl 值是 WLS 管理控制台的完全限定的公共 Internet 可见链接。 选择该字段值旁边的复制图标以将链接复制到剪贴板。
    3. 将该值粘贴到浏览器,并打开 WLS 管理控制台。
    4. 使用 WLS 管理员帐户登录,该帐户是你在使用 Azure 市场产品/服务在 AKS 上部署 WLS 部分中保存的帐户。
    5. 域结构下,选择部署。 你会发现 app1 已列出。
    6. 选择 app1,可发现应用程序的名称值为 app1。 在查询中使用 app1 作为应用程序名称。
  8. 如果需要,请修改 scaler.yaml 中的 maxReplicaCount: 行,如以下示例所示。 将此值设置为高于你在部署时在 AKS 选项卡上指定的值是错误的。

    maxReplicaCount: 10
    
  9. 使用以下命令通过应用 scaler.yaml 来创建 KEDA 缩放程序规则:

    kubectl apply -f scaler.yaml
    

    KEDA 从 Azure Monitor 工作区检索指标需要几分钟的时间。 你可以使用以下命令查看缩放程序状态:

    kubectl get hpa -n sample-domain1-ns -w
    

    缩放程序准备就绪后,输出看起来类似于以下内容。 TARGETS 列中的值从 <unknown> 切换到 0

    NAME                                       REFERENCE                          TARGETS              MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)           1         5         2          15s
    

测试自动缩放

现在,你已准备好观察自动缩放功能。 本文使用 curl 打开新会话以访问应用程序。 在平均会话计数大于 10 后,将执行纵向扩展操作。 会话持续 150 秒,打开的会话计数随着会话过期而减少。 在平均会话计数小于 10 后,将执行纵向缩减操作。 使用以下步骤可进行纵向扩展和纵向缩减操作:

  1. 使用以下步骤获取应用程序 URL:

    1. 使用前面的步骤查看部署输出。
    2. clusterExternalUrl 值是指向此 AKS 群集上部署在 WLS 中的示例应用的完全限定的公共 Internet 可见链接。 若要将链接复制到剪贴板,请选择字段值旁边的复制图标。
    3. 访问 testwebapp.war 的 URL 是 ${clusterExternalUrl}testwebapp - 例如 http://wlsgw202403-wlsaks0314-domain1.eastus.cloudapp.azure.com/testwebapp/
  2. 运行 curl 命令,以访问应用程序并创建新会话。 以下示例打开 22 个新会话。 会话将在 150 秒后过期。 将 WLS_CLUSTER_EXTERNAL_URL 值替换为你的值。

    COUNTER=0
    MAXCURL=22
    WLS_CLUSTER_EXTERNAL_URL="http://wlsgw202403-wlsaks0314-domain1.eastus.cloudapp.azure.com/"
    APP_URL="${WLS_CLUSTER_EXTERNAL_URL}testwebapp/"
    
    while [ $COUNTER -lt $MAXCURL ]; do curl ${APP_URL}; let COUNTER=COUNTER+1; sleep 1;done
    
  3. 在两个单独的 shell 中,使用以下命令:

    • 使用以下命令观察缩放程序:

      kubectl get hpa -n sample-domain1-ns -w
      

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

      $ kubectl get hpa -n sample-domain1-ns -w
      NAME                                       REFERENCE                          TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         1         24m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         1         24m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   5/10 (avg)       1         10         1         26m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   22/10 (avg)      1         10         1         27m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   7334m/10 (avg)   1         10         3         29m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   14667m/10 (avg)  1         10         3         48m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         3         30m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         3         35m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         1         35m
      keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         5         53m
      
    • 在单独的 shell 中,使用以下命令观察 WLS Pod:

      kubectl get pod -n sample-domain1-ns -w
      

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

      $ kubectl get pod -n sample-domain1-ns -w
      NAME                             READY   STATUS              RESTARTS   AGE
      sample-domain1-admin-server      2/2     Running             0          28h
      sample-domain1-managed-server1   2/2     Running             0          28h
      sample-domain1-managed-server1   2/2     Running             0          28h
      sample-domain1-managed-server2   0/2     Pending             0          0s
      sample-domain1-managed-server2   0/2     Pending             0          0s
      sample-domain1-managed-server2   0/2     ContainerCreating   0          0s
      sample-domain1-managed-server3   0/2     Pending             0          0s
      sample-domain1-managed-server3   0/2     Pending             0          0s
      sample-domain1-managed-server3   0/2     ContainerCreating   0          0s
      sample-domain1-managed-server3   1/2     Running             0          1s
      sample-domain1-admin-server      2/2     Running             0          95m
      sample-domain1-managed-server1   2/2     Running             0          94m
      sample-domain1-managed-server2   2/2     Running             0          56s
      sample-domain1-managed-server3   2/2     Running             0          55s
      sample-domain1-managed-server4   1/2     Running             0          9s
      sample-domain1-managed-server5   1/2     Running             0          9s
      sample-domain1-managed-server5   2/2     Running             0          37s
      sample-domain1-managed-server4   2/2     Running             0          42s
      sample-domain1-managed-server5   1/2     Terminating         0          6m46s
      sample-domain1-managed-server5   1/2     Terminating         0          6m46s
      sample-domain1-managed-server4   1/2     Running             0          6m51s
      sample-domain1-managed-server4   1/2     Terminating         0          6m53s
      sample-domain1-managed-server4   1/2     Terminating         0          6m53s
      sample-domain1-managed-server3   1/2     Running             0          7m40s
      sample-domain1-managed-server3   1/2     Terminating         0          7m45s
      sample-domain1-managed-server3   1/2     Terminating         0          7m45s
      

Azure Monitor 工作区中的图形类似于以下屏幕截图:

Azure 门户的屏幕截图,显示了 Prometheus 资源管理器图表。

清理资源

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

az group delete --name <wls-resource-group-name> --yes --no-wait
az group delete --name <ama-resource-group-name> --yes --no-wait

后续步骤

继续浏览以下参考,以获取更多用于生成自动缩放解决方案并在 Azure 上运行 WLS 的选项: