相关文章推荐
儒雅的皮带  ·  Ubuntu20.04 ...·  4 月前    · 
开朗的丝瓜  ·  pytorch量化后转onnx·  9 月前    · 
欢快的南瓜  ·  子查詢 (SQL Server) - ...·  11 月前    · 

本文演示如何将 Red Hat JBoss Enterprise Application Platform (JBoss EAP) 应用部署到 Azure Red Hat OpenShift (ARO) 4 群集。 该应用程序是由 SQL 数据库支持的 Jakarta EE 应用程序。 该应用使用 JBoss EAP Helm 图表 进行部署。

本指南采用一个传统的 Jakarta EE 应用程序,引导你完成将此应用程序迁移到 Azure Red Hat OpenShift 等容器业务流程协调程序的过程。 本指南首先介绍如何将该应用程序打包为 可启动 JAR 以在本地运行。 最后,介绍如何使用 Helm 图表,通过 JBoss EAP 应用程序的三个副本在 OpenShift 上进行部署。

该应用程序是一个有状态应用程序,它在 HTTP 会话中存储信息。 它利用 JBoss EAP 群集功能,并使用以下 Jakarta EE 8 和 MicroProfile 4.0 技术:

  • Jakarta Server Faces
  • Jakarta Enterprise Beans
  • Jakarta Persistence
  • MicroProfile Health
  • 本文使用 JBoss EAP Helm 图表部署应用程序。 在撰写本文时,此功能仍以 技术预览版 提供。 选择在生产环境中使用 JBoss EAP Helm 图表部署应用程序之前,请确保此功能是你的 JBoss EAP/XP 产品版本支持的功能。

    虽然 ARO 由 Red Hat 和 Microsoft 共同设计、运营并提供支持,可以提供集成式支持体验,但你在 ARO 之上运行的软件(包括本文中所述的软件)受其自身的支持和许可条款约束。 有关 ARO 支持的详细信息,请参阅 Azure Red Hat OpenShift 4 的支持生命周期 。 有关本文中所述软件支持的详细信息,请查看本文中列出的相应软件的主页。

    Azure Red Hat OpenShift 至少需要 40 个核心才能创建和运行 OpenShift 群集。 新 Azure 订阅的默认 Azure 资源配额不满足此要求。 若要请求提高资源上限,请参阅 标准配额:按 VM 系列提高上限 中所述。 请注意,免费试用订阅无法增加配额,请 升级到即用即付订阅 再请求增加配额。

  • 为本地计算机准备一个类似 Unix 的操作系统,由安装的各种产品进行支持(例如 Windows 上的 WSL )。

  • 安装 Java SE 实现。 本文中的本地开发步骤是使用 OpenJDK 的 Microsoft 内部版本的 JDK 17 进行测试的。

  • 安装 Maven 3.8.6 或更高版本。

  • 安装 Azure CLI 2.40 或更高版本。

  • 将此演示应用程序(待办事项列表)的代码克隆到本地系统。 该演示应用程序已在 GitHub 上提供。

  • 按照 创建 Azure Red Hat OpenShift 4 群集 中的说明进行操作。

    尽管“获取 Red Hat 请求机密”这一步标记为可选步骤,但本文仍需要此步骤。 “拉取机密”步骤使 ARO 群集能够找到 JBoss EAP 应用程序映像。

    如果你打算在群集上运行内存密集型应用程序,请使用 --worker-vm-size 参数为工作器节点指定适当的虚拟机大小。 有关详细信息,请参阅:

  • 使用 Azure CLI 创建群集
  • 内存优化支持的虚拟机大小
  • 按照 连接到 Azure Red Hat OpenShift 4 群集 中的步骤连接到该群集。

  • 执行“安装 OpenShift CLI”中的步骤
  • kubeadmin 用户的身份使用 OpenShift CLI 连接到 Azure Red Hat OpenShift 群集
  • 执行以下命令,为此演示应用程序创建 OpenShift 项目:

    oc new-project eap-demo
    
  • 执行以下命令,将视图角色添加到默认服务帐户。 只有添加此角色,应用程序才能发现其他 pod 并使用它们来组建群集:

    oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
    

    准备应用程序

    在此阶段,你已克隆 Todo-list 演示应用程序;本地存储库位于 main 分支上。 该演示应用程序是一个简单的 Jakarta EE 8 应用程序,可以创建、读取、更新和删除 Microsoft SQL Server 上的记录。 可将此应用程序按原样部署在本地计算机中安装的 JBoss EAP 服务器上。 只需使用所需的数据库驱动程序和数据源配置该服务器。 还需要可从本地环境访问的数据库服务器。

    但是,在以 OpenShift 为目标时,可能需要缩减 JBoss EAP 服务器的功能。 例如,减少预配服务器的安全隐患并减少总体占用空间。 可能还需要包含某些 MicroProfile 规范,使应用程序更适合在 OpenShift 环境中运行。 使用 JBoss EAP 时,实现此目的的一种方法是将应用程序和服务器打包在一个称作“可启动 JAR”的部署单元中。 为此,让我们添加需要对演示应用程序所做的更改。

    导航到演示应用程序的本地存储库,并将分支更改为 bootable-jar

    git checkout bootable-jar
    

    让我们快速回顾一下我们在此分支中所做的更改:

  • 我们添加了 wildfly-jar-maven 插件,以在单个可执行 JAR 文件中预配服务器和应用程序。 OpenShift 部署单元是包含我们应用程序的服务器。
  • 在 maven 插件上,我们指定了一组 Galleon 层。 此配置使我们能够将服务器功能缩减为只包括所需的功能。 有关 Galleon 的完整文档,请参阅 WildFly 文档
  • 应用程序将 Jakarta Faces 与 Ajax 请求配合使用,这意味着,将在 HTTP 会话中存储信息。 如果删除了某个 pod,我们不希望丢失此类信息。 可将此信息保存在客户端上,并在每个请求中将其发回。 但是,在某些情况下,你可能不想要向客户分发某些信息。 对于本演示,我们已选择在所有 pod 副本之间复制会话。 为此,我们已将 <distributable /> 添加到 web.xml。 它与服务器群集功能相结合,使 HTTP 会话可在所有 pod 之间分发。
  • 我们添加了两项 MicroProfile Health 检查,这样就可以识别应用程序何时处于活动状态并准备好接收请求。
  • 在本地运行应用程序

    在 OpenShift 上部署应用程序之前,我们将在本地运行它以验证是否可正常运行。 以下步骤假定你已在本地环境中运行并提供 Microsoft SQL Server。

    若要创建数据库,请按照快速入门:创建 Azure SQL 数据库单一数据库中的步骤操作,但使用以下替换项。

  • 对于 “资源组 ”,请使用之前创建的资源组。
  • 对于“数据库名称”,请使用 todos_db
  • 对于“服务器管理员登录名”,请使用 azureuser
  • 对于“密码”,请使用 Passw0rd!
  • 在“防火墙规则”部分,将“允许 Azure 服务和资源访问此服务器”切换为“是”。
  • 可以放心使用链接的文章中的所有其他设置。

    在“其他设置”页上,无需选择使用示例数据预填充数据库的选项,但这样做不会造成任何损害。

    使用上述数据库名称、服务器管理员登录名和密码创建数据库后,从门户中新建数据库资源的概述页获取服务器名称值。 将鼠标悬停在“服务器名称”字段的值上方,然后选择该值旁边出现的复制图标。 将此值保存到某个位置以备后用(我们将为此值设置一个名为 MSSQLSERVER_HOST 的变量)。

    为了保持较低的成本,本快速入门将指导读者选择无服务器计算层。 没有活动时,此层将缩减为零。 发生这种情况时,数据库不会立即做出响应。 如果在执行本文中的步骤期间发现数据库问题,请考虑禁用“自动暂停”。 若要了解如何操作,请在 Azure SQL 数据库无服务器中搜索“自动暂停”。 在撰写本文时,以下 AZ CLI 命令将为本文中配置的数据库禁用自动暂停。 az sql db update -g $RESOURCEGROUP -s $RESOURCEGROUP -n todos_db --auto-pause-delay -1

    按照后续步骤在本地生成并运行应用程序。

  • 生成可启动 JAR。 由于我们将 与 MS SQL Server 数据库一起使用eap-datasources-galleon-pack,因此必须指定要用于此特定环境变量的数据库驱动程序版本。 有关 eap-datasources-galleon-pack 和 MS SQL Server的详细信息,请参阅 Red Hat 中的文档

    export MSSQLSERVER_DRIVER_VERSION=7.4.1.jre11
    mvn clean package
    
  • 使用以下命令启动可启动 JAR。

    必须确保远程 MSSQL 数据库允许来自运行此服务器的主机的网络流量。 因为你在执行快速入门:创建 Azure SQL 数据库单一数据库中的步骤时选择了“添加当前客户端 IP 地址”,如果运行服务器的主机是浏览器从中连接到 Azure 门户的同一台主机,则应允许网络流量。 如果运行服务器的主机是其他某台主机,则需要参阅使用 Azure 门户管理服务器级 IP 防火墙规则

    启动应用程序时,需要传递所需的环境变量以配置数据源:

    export MSSQLSERVER_USER=azureuser
    export MSSQLSERVER_PASSWORD='Passw0rd!'
    export MSSQLSERVER_JNDI=java:/comp/env/jdbc/mssqlds
    export MSSQLSERVER_DATABASE=todos_db
    export MSSQLSERVER_HOST=<server name saved aside earlier>
    export MSSQLSERVER_PORT=1433
    mvn wildfly-jar:run
    

    如果你想要详细了解本演示使用的基础运行时,用于集成数据源的 Galleon 功能包文档提供了可用环境变量的完整列表。 有关功能包概念的详细信息,请参阅 WildFly 文档

    如果收到包含如下所示文本的错误:

    Cannot open server '<your prefix>mysqlserver' requested by the login. Client with IP address 'XXX.XXX.XXX.XXX' is not allowed to access the server.
    

    用于确保允许上述网络流量的步骤未起作用。 确保错误消息中的 IP 地址包含在防火墙规则中。

    如果收到一条消息,其中包含类似于以下内容的文本:

    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: There is already an object named 'TODOS' in the database.
    

    此消息表明示例数据已在数据库中。 可忽略此消息。

  • (可选)若要验证群集功能,还可以通过将 jboss.node.name 参数传递给可启动 JAR 来启动同一应用程序的更多实例;为避免端口号冲突,请使用 jboss.socket.binding.port-offset 来偏移端口号。 例如,若要在 OpenShift 上启动表示新 pod 的另一个实例,可以在新的终端窗口中执行以下命令:

    export MSSQLSERVER_USER=azureuser
    export MSSQLSERVER_PASSWORD='Passw0rd!'
    export MSSQLSERVER_JNDI=java:/comp/env/jdbc/mssqlds
    export MSSQLSERVER_DATABASE=todos_db
    export MSSQLSERVER_HOST=<server name saved aside earlier>
    export MSSQLSERVER_PORT=1433
    mvn wildfly-jar:run -Dwildfly.bootable.arguments="-Djboss.node.name=node2 -Djboss.socket.binding.port-offset=1000"
    

    如果群集正在工作,则会在服务器控制台日志中看到类似于下面的跟踪:

    INFO  [org.infinispan.CLUSTER] (thread-6,ejb,node) ISPN000094: Received new cluster view for channel ejb
    

    默认情况下,可启动 JAR 会将 JGroups 子系统配置为使用 UDP 协议,并向 230.0.0.4 多播地址发送消息以发现其他群集成员。 若要正确验证本地计算机上的群集功能,操作系统应该能够发送和接收多播数据报,并通过以太网接口将其路由到 IP 230.0.0.4。 如果在服务器日志中看到与群集相关的警告,请检查网络配置并验证它是否支持该地址上的多播。

  • 在浏览器中打开 http://localhost:8080/ 以访问应用程序主页。 如果创建了更多实例,可以通过偏移端口号(例如 http://localhost:9080/)来访问这些实例。 应用程序类似于下图:

  • 检查应用程序的运行情况和就绪情况探测。 OpenShift 将使用这些终结点来验证 pod 何时处于活动状态并准备好接收用户请求:

    若要检查运行情况状态,请运行:

    curl http://localhost:9990/health/live
    

    你应该会看到以下输出:

    {"status":"UP","checks":[{"name":"SuccessfulCheck","status":"UP"}]}
    

    若要检查就绪状态,请运行:

    curl http://localhost:9990/health/ready
    

    你应该会看到以下输出:

     {"status":"UP","checks":[{"name":"deployments-status","status":"UP","data":{"todo-list.war":"OK"}},{"name":"server-state","status":"UP","data":{"value":"running"}},{"name":"boot-errors","status":"UP"},{"name":"DBConnectionHealthCheck","status":"UP"}]}
    
  • 按 Ctrl-C 停止应用程序。

    部署到 OpenShift

    为了部署应用程序,我们将使用 ARO 中已有的 JBoss EAP Helm 图表。 此外,需要提供所需的配置,例如,数据库用户、数据库密码、要使用的驱动程序版本,以及数据源使用的连接信息。 以下步骤假设正在运行一个可从 OpenShift 群集访问的 Microsoft SQL 数据库服务器,并且已将数据库用户名、密码、主机名、端口和数据库名称存储在名为 mssqlserver-secret 的 OpenShift OpenShift 机密对象中。

    导航到演示应用程序的本地存储库,并将当前分支更改为 bootable-jar-openshift

    git checkout bootable-jar-openshift
    

    让我们快速回顾一下在此分支中所做的更改:

  • 我们添加了一个名为 bootable-jar-openshift 的新 maven 配置文件,用于通过特定的配置准备可启动 JAR,以便在云中运行服务器。 例如,该配置文件使 JGroups 子系统能够通过 TCP 请求使用 KUBE_PING 协议发现其他 pod。
  • 我们在 jboss-on-aro-jakartaee/deployment 目录中添加了一组配置文件。 在此目录中,可以找到用于部署应用程序的配置文件。
  • 在 OpenShift 上部署应用程序

    后续步骤将说明如何使用 OpenShift Web 控制台通过 Helm 图表部署应用程序。 请避免使用称作“机密”的功能在 Helm 图表中硬编码敏感值。 机密只是“名称=值”对的集合,需要其中的值时,将提前在某个已知位置指定这些值。 在本例中,Helm 图表使用两个机密,其中每个机密包含以下“名称=值”对。

  • mssqlserver-secret

  • db-host 传递 MSSQLSERVER_HOST 值。
  • db-name 传递 MSSQLSERVER_DATABASE
  • db-password 传递 MSSQLSERVER_PASSWORD
  • db-port 传递 MSSQLSERVER_PORT 值。
  • db-user 传递 MSSQLSERVER_USER 值。
  • todo-list-secret

  • app-cluster-password 传递用户指定的任意密码,以便可以更安全地构成群集节点。
  • app-driver-version 传递 MSSQLSERVER_DRIVER_VERSION 值。
  • app-ds-jndi 传递 MSSQLSERVER_JNDI 值。
  • 创建 mssqlserver-secret

    oc create secret generic mssqlserver-secret \
    --from-literal db-host=${MSSQLSERVER_HOST} \
    --from-literal db-name=${MSSQLSERVER_DATABASE} \
    --from-literal db-password=${MSSQLSERVER_PASSWORD} \
    --from-literal db-port=${MSSQLSERVER_PORT} \
    --from-literal db-user=${MSSQLSERVER_USER}
    
  • 创建 todo-list-secret

    export MSSQLSERVER_DRIVER_VERSION=7.4.1.jre11
    oc create secret generic todo-list-secret \
    --from-literal app-cluster-password=mut2UTG6gDwNDcVW \
    --from-literal app-driver-version=${MSSQLSERVER_DRIVER_VERSION} \
    --from-literal app-ds-jndi=${MSSQLSERVER_JNDI}
    
  • 打开 OpenShift 控制台并导航到开发人员视图。 可以通过运行以下命令来发现 OpenShift 群集的控制台 URL。 使用从上一步获取的 kubeadmin userid 和密码登录。

    az aro show \
    --name $CLUSTER \
    --resource-group $RESOURCEGROUP \
    --query "consoleProfile.url" -o tsv
    

    从导航窗格顶部的下拉菜单中选择/>开发人员透视。<

  • <“/>开发人员透视”中,从“项目”下拉菜单中选择 eap-demo 项目。

  • 选择“+添加” 。 在“开发人员目录”部分,选择“Helm 图表”。 随后你将看到 ARO 群集上可用的 Helm 图表目录。 在“按关键字筛选”框中,键入“eap”。 应会看到多个选项,如下所示:

    因为我们的应用程序使用 MicroProfile 功能,因此我们为 EAP Xp 选择 Helm 图表。 Xp 是“扩展包”的英文缩写。 借助 JBoss Enterprise Application Platform 扩展包,开发人员可以使用 Eclipse MicroProfile 应用程序编程接口 (API) 来生成和部署基于微服务的应用程序。

  • 选择 EAP Xp4 Helm 图表,然后选择 “安装 Helm 图表”。

    此时,我们需要配置该图表,以生成和部署应用程序:

  • 将版本名称更改为“eap-todo-list-demo”。

  • 可以使用“表单视图”或“YAML 视图”来配置 Helm 图表。 在标有“配置方式”的部分,选择“YAML 视图”。

  • 通过复制并粘贴 deployment/application/todo-list-helm-helm.yaml 中提供的 Helm 图表文件内容(而不是现有内容)来更改 YAML 内容,以配置 Helm 图表:

    请注意,此内容引用前面设置的机密。

  • 最后,选择“安装”开始部署应用程序。 这会打开“拓扑”视图,其中包含 Helm 版本(名为 eap-todo-list-demo)及其关联资源的图形表示形式。

    Helm 版本(缩写为 HR)命名为 eap-todo-list-demo。 其中包含一个部署资源(缩写为 D),该资源也名为 eap-todo-list-demo。

    如果选择“D”框左下方的图标(带两个箭头的圆圈),你将转到“日志”窗格。 在此处可以观察生成进度。 若要返回拓扑视图,请在左侧导航窗格中选择“拓扑”。

  • 生成完成后,左下角的图标将显示绿色复选

  • 部署完成后,圆圈轮廓将为深蓝色。 如果将鼠标悬停在深蓝色上,应会看到一条类似于“3 正在运行”的消息。 看到该消息时,可以使用与部署关联的路由的右上角图标) 转到 url (应用程序。

  • 该应用程序将在浏览器中打开(如下图所示)并可供使用:

  • 该应用程序会显示已提供信息的 pod 的名称。 若要验证群集功能,可以添加一些待办事项。 然后删除名称为应用程序上显示的“服务器主机名”字段中所示名称 ((oc delete pod <pod name>)) 的 pod,删除后,在同一应用程序窗口中创建一条新的待办事项。 你将看到,新的待办事项已通过 Ajax 请求添加,“服务器主机名”字段现在显示了不同的名称。 在幕后,新请求已由 OpenShift 负载均衡器分派并传送到可用的 pod。 Jakarta Faces 视图已从 pod(正在处理请求)中存储的 HTTP 会话副本还原。 你会发现“会话 ID”字段事实上并未更改。 如果会话未在 pod 之间复制,你将收到 Jakarta Faces ViewExpiredException,并且应用程序不会按预期方式工作。

    删除应用程序

    如果你只想删除应用程序,可以打开 OpenShift 控制台,然后在开发人员视图中导航到“Helm”菜单选项。 在此菜单中,你将看到群集上安装的所有 Helm 图表版本。

    找到“eap-todo-list-demo”Helm 图表,并在行尾选择树状垂直点以打开操作上下文菜单项。

    选择“卸载 Helm 版本”以删除应用程序。 请注意,用于提供应用程序配置的机密对象不是图表的一部分。 如果不再需要该对象,则需要单独删除它。

    若要删除用于保存应用程序配置的机密,请执行以下命令:

    $ oc delete secrets/todo-list-secret
    # secret "todo-list-secret" deleted
    

    删除 OpenShift 项目

    还可以通过删除 eap-demo 项目来删除为本演示创建的所有配置。 为此,请执行以下操作:

    $ oc delete project eap-demo
    # project.project.openshift.io "eap-demo" deleted
    

    删除 ARO 群集

    按照教程:删除 Azure Red Hat OpenShift 4 群集中的步骤删除 ARO 群集

    删除资源组

    如果要删除上述步骤创建的所有资源,只需删除为 ARO 群集创建的资源组。

    在本指南中,你了解了以下内容:

  • 为 OpenShift 准备一个 JBoss EAP 应用程序。
  • 在本地将该应用程序与容器化 Microsoft SQL Server 一起运行。
  • 使用 OpenShift CLI 在 ARO 4 上部署 Microsoft SQL Server。
  • 使用 JBoss Helm 图表和 OpenShift Web 控制台在 ARO 4 上部署应用程序。
  • 可以通过本指南中使用的参考了解详细信息:

  • Red Hat JBoss Enterprise Application Platform
  • Azure Red Hat OpenShift
  • JBoss EAP Helm 图表
  • JBoss EAP 可启动 JAR
  •