教程:使用基于 Prometheus 指标的 KEDA 缩放程序将 Oracle WebLogic Server 迁移到 AKS

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

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

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

下图演示了生成的体系结构:

基于 Prometheus 指标的 AKS 上的 WLS 的解决方案体系结构图。

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

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

Prometheus 的 Azure Monitor 托管服务使用与 Prometheus 兼容的监视解决方案从 WLS 大规模收集并保存指标,具体取决于 Cloud Native Computing Foundation 中的 Prometheus 项目。 有关详细信息,请参阅适用于 Prometheus 的 Azure Monitor 托管服务

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

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

WebLogic 指标。

先决条件

  • Azure 订阅。 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户
  • 请确保在订阅中具有 Owner 角色或 Contributor 角色 User 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. 使用以下命令指定会话超时 150 秒。wls:timeout-secsHEREDOC格式用于使用所需内容覆盖 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 监视导出程序。 此选项会自动预配 WebLogic Monitoring 导出程序、适用于 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. 选择下一步

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

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

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

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

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

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

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

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

  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 ,如以下屏幕截图所示:

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

注意

可以通过公开 WebLogic 监视导出程序来使用以下命令来访问指标:

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

等待 EXTERNAL-IPsample-domain1-cluster-1-exporter 中的列从 <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 监视导出程序 ,因此 KEDA 缩放程序已准备好进行部署。 以下步骤演示如何配置 KEDA 缩放程序以用于 AKS 群集:

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

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

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

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

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

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

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

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

  7. metric:修改 scaler.yaml 中的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 以查找应用程序的 Name 值。app1 用作 app1 查询中的应用程序名称。
  8. 如果需要,请修改 maxReplicaCount: scaler.yaml 中的行,如以下示例所示。 将此值设置为高于在 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 工作区中的图形类似于以下屏幕截图:

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

清理资源

若要避免 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: