第 9 章 在 OpenShift Container Platform 上部署您的 Jboss EAP 应用程序


EAP 操作器是扩展 OpenShift API 的 JBoss EAP 特定控制器。您可以使用 EAP 操作器创建、配置、管理和无缝升级复杂有状态应用的实例。

EAP 操作器在集群中管理多个 JBoss EAP Java 应用实例。它还通过在缩减副本前验证所有事务完成,并将 pod 标记为 clean 以进行终止,确保应用程序集群中的安全事务恢复。EAP 操作器使用 StatefulSet 来适当处理 Jakarta Enterprise Beans 远程和事务恢复处理。StatefulSet 确保持久性存储和网络主机名稳定性,即使 pod 重启后也是如此。

您必须使用 OperatorHub 安装 EAP 操作器,供 OpenShift 集群管理员用于发现、安装和升级操作器。

在 OpenShift Container Platform 4 中,您可以使用 Operator Lifecycle Manager (OLM)安装、更新和管理所有 Operator 以及在多个集群中运行的关联服务的生命周期。

OLM 在 OpenShift Container Platform 4 中默认运行。它帮助集群管理员对集群上运行的操作器进行安装、升级和授予访问权。OpenShift Container Platform Web 控制台为集群管理员提供管理界面,用于安装 Operator,以及授予特定项目访问权限以使用集群中可用的 Operator 目录。

如需有关 Operator 和 OLM 的更多信息,请参阅 OpenShift 文档

9.1.1. 使用 Web 控制台安装 EAP Operator

作为 JBoss EAP 集群管理员,您可以使用 OpenShift Container Platform Web 控制台从 Red Hat OperatorHub 安装 EAP operator。然后,您可以将 EAP 操作器订阅到一个或多个命名空间,供集群上的开发人员使用。

在使用 Web 控制台安装 EAP operator 之前,您必须注意以下几个点:

  • Installation Mode :选择 All namespaces on the cluster (default),以在所有命名空间上安装 Operator,或者选择单独的命名空间(如果可用),仅在所选命名空间中安装 Operator。
  • 更新频道: 如果 EAP 操作器可以通过多个频道获得,您可以选择您要订阅的频道。例如,要通过 stable 频道部署(如果可用),则从列表中选择这个选项。
  • 批准策略:您可以选择自动手动更新。如果选择自动更新 EAP 操作器,则当有新版本 Operator 可用时,Operator Lifecycle Manager(OLM)会自动升级正在运行的 EAP 实例。如果选择手动更新,则当有新版 Operator 可用时,OLM 会创建更新请求。然后,您必须手动批准更新请求,以便 Operator 更新至新版本。
注意

以下流程可能会根据 OpenShift Container Platform Web 控制台中的修改而有所变化。有关最新和最准确的流程,请参阅 OpenShift Container Platform 指南中的使用 Web 控制台从 OperatorHub 安装 部分。

先决条件

  • 使用具有 cluster-admin 权限的账户访问 OpenShift Container Platform 集群。

流程

  1. 在 OpenShift Container Platform Web 控制台中导航至 OperatorsOperatorHub
  2. 向下滚动或在 Filter by keyword 框中输入 EAP,以查找 EAP 操作器。
  3. 选择 JBoss EAP operator 并单击 Install
  4. Create Operator Subscription 页面:

    1. 任选以下一项:

      • All namespaces on the cluster(default),将 operator 安装至默认 openshift-operators 命名空间,以便供集群中的所有命名空间监视和使用。该选项并非始终可用。
      • 集群中的特定命名空间会将 Operator 安装到您选择的特定命名空间中。Operator 仅可在该单一命名空间中使用。
    2. 选择一个 Update Channel
    3. 如前面所述,选择自动手动批准策略。
  5. Subscribe 使 EAP Operator 可供此 OpenShift Container Platform 集群上的所选命名空间使用。

    1. 如果选择了手动批准策略,订阅的升级状态将保持在 Upgrading,直至您审核并批准了它的安装计划。批准 Install Plan 页面中的安装计划后,订阅升级状态将变为 Up to date
    2. 如果您选择了一个自动批准策略,则升级状态会在不干预的情况下变为 Up to date
  6. 在订阅的升级状态变为 Up to date 后,选择 Operators Installed Operators 来验证 EAP ClusterServiceVersion(CSV)是否显示为 up,其 Status 会在相关命名空间中变为 InstallSucceeded

    注意

    对于 All namespaces…​ 安装模式,openshift-operators 命名空间中显示的状态为 InstallSucceeded。在其他命名空间中,显示的状态是 Copied。如果 Status 字段没有更改为 InstallSucceeded,请检查 openshift-operators 项目(如果选择了 A specific namespace…​ 安装模式)中的 openshift-operators 项目中的 pod 的日志,这会在 Workloads Pods 页面中报告问题以便进一步排除故障。

9.1.2. 使用 CLI 安装 EAP Operator

作为 JBoss EAP 集群管理员,您可以使用 OpenShift Container Platform CLI 从 Red Hat OperatorHub 安装 EAP operator。然后,您可以将 EAP 操作器订阅到一个或多个命名空间,供集群上的开发人员使用。

使用 CLI 从 OperatorHub 安装 EAP Operator 时,请使用 oc 命令创建 Subscription 对象。

先决条件

  • 可以使用具有 cluster-admin 权限的账户访问 OpenShift Container Platform 集群。
  • 您已在本地系统中安装了 oc 工具。

流程

  1. 查看 OperatorHub 中集群可用的 Operator 列表:

    $ oc get packagemanifests -n openshift-marketplace | grep eap
    NAME        CATALOG               AGE
    ...
    eap         Red Hat Operators     43d
    ...
    Copy to Clipboard Toggle word wrap
  2. 创建一个 Subscription 对象 YAML 文件(例如,eap-operator-sub.yaml)来向 EAP operator 订阅命名空间。以下是 Subscription 对象 YAML 文件示例:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: eap
      namespace: openshift-operators
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: eap 
    1
    
      source:  redhat-operators 
    2
    
      sourceNamespace: openshift-marketplace
    Copy to Clipboard Toggle word wrap
    1
    要订阅的 Operator 的名称。
    2
    EAP Operator 由 redhat-operators CatalogSource 提供。

    有关频道和批准策略的详情,请查看此流程的 Web 控制台 版本。

  3. 从 YAML 文件创建 Subscription 对象:

    $ oc apply -f eap-operator-sub.yaml
    $ oc get csv -n openshift-operators
    NAME                  DISPLAY     VERSION   REPLACES   PHASE
    eap-operator.v1.0.0   JBoss EAP   1.0.0                Succeeded
    Copy to Clipboard Toggle word wrap

    EAP 操作器已经安装成功。此时,OLM 知道 EAP 操作器。Operator 的 ClusterServiceVersion(CSV)出现在目标命名空间中,由 EAP 操作器提供的 API 可用于创建。

EAP 操作员有助于在 OpenShift 上自动化 Java 应用程序部署。如需有关 EAP 操作器 API 的信息,请参阅 EAP Operator: API Information

先决条件

  • 已安装 EAP operator。有关安装 EAP 操作器的更多信息,请参阅使用 Web 控制台安装 EAP 操作器, 以及使用 CLI 安装 EAP 操作器
  • 您已使用 JBoss EAP for OpenShift Source-to-Image (S2I)构建镜像,构建了 user 应用的 Docker 镜像。
  • 如果应用程序的 CustomResourceDefinition(CRD)文件引用了一个 Secret 对象,则已创建了 Secret。有关创建新 Secret 对象的更多信息,请参阅创建 Secret
  • 如果您的应用程序的 CRD 文件引用了 ConfigMap,则已创建了 ConfigMap。有关创建 ConfigMap 的详情,请参考 创建 ConfigMap
  • 如果选择这样做,则已从 standalone.xml 文件创建了 ConfigMap。有关从 standalone.xml 文件创建 ConfigMap 的详情,请参考 从 standalone.xml 文件创建 ConfigMap
注意

JBoss EAP 8.0 不支持从 ConfigMap 提供 standalone.xml 文件。

流程

  1. 打开 Web 浏览器并登录到 OperatorHub。
  2. 选择您要用于 Java 应用程序的 Project 或命名空间。
  3. 进入到 Installed Operator,再选择 JBoss EAP operator
  4. Overview 选项卡上,单击 Create Instance 链接。
  5. 指定应用程序镜像详情。

    应用镜像指定包含 Java 应用的 Docker 镜像。该镜像必须使用 JBoss EAP for OpenShift Source-to-Image (S2I)构建镜像来构建。如果 applicationImage 字段与 imagestreamtag 对应,对镜像的任何更改都会触发应用程序的自动升级。

    您可以为 OpenShift 应用程序镜像提供以下 JBoss EAP 参考:

    • 镜像的名称:mycomp/myapp
    • tag: mycomp/myapp:1.0
    • 摘要:mycomp/myapp:@sha256:0af38bc38be93116b6a1d86a9c78bd14cd527121970899d719baf78e5dc7bfd2
    • imagestreamtag: my-app:latest
  6. 指定应用程序的大小。例如:

    spec:
      replicas:2
    Copy to Clipboard Toggle word wrap
  7. 使用 env spec 配置应用程序环境。环境变量 可以直接来自值,如 POSTGRESQL_SERVICE_HOST 或来自 Secret 对象,如 POSTGRESQL_USER。例如:

    spec:
      env:
      - name: POSTGRESQL_SERVICE_HOST
        value: postgresql
      - name: POSTGRESQL_SERVICE_PORT
        value: '5432'
      - name: POSTGRESQL_DATABASE
        valueFrom:
          secretKeyRef:
            key: database-name
            name: postgresql
      - name: POSTGRESQL_USER
        valueFrom:
          secretKeyRef:
            key: database-user
            name: postgresql
      - name: POSTGRESQL_PASSWORD
        valueFrom:
          secretKeyRef:
            key: database-password
            name: postgresql
    Copy to Clipboard Toggle word wrap
  8. 完成与应用程序部署相关的以下可选配置:

    • 指定服务器数据目录的存储要求。如需更多信息,请参阅为应用程序配置持久性存储
    • 指定您在 WildFlyServerSpec 中创建的 Secret 名称,将其挂载为运行应用的 pod 中的卷。例如:

      spec:
        secrets:
          - my-secret
      Copy to Clipboard Toggle word wrap

      Secret 挂载到 /etc/secrets/<secret name& gt;,每个键/值存储为一个文件。文件的名称是键,内容是值。Secret 作为一个卷在 pod 中挂载。以下示例演示了可用于查找键值的命令:

      $ ls /etc/secrets/my-secret/
      my-key  my-password
      $ cat /etc/secrets/my-secret/my-key
      devuser
      $ cat /etc/secrets/my-secret/my-password
      my-very-secure-pasword
      Copy to Clipboard Toggle word wrap
      注意

      修改 Secret 对象可能会导致项目不一致。红帽建议创建一个与旧内容相同的新对象,而不是修改现有 Secret 对象。然后,您可以根据需要更新内容,并将 operator 自定义资源(CR)中的引用从 old 改为 new。这被视为一个新的 CR 更新,pod 被重新加载。

    • 指定您在 WildFlyServerSpec 中创建的 ConfigMap 名称,将其挂载为运行应用程序的 pod 中的卷。例如:

      spec:
        configMaps:
        - my-config
      Copy to Clipboard Toggle word wrap

      ConfigMap 挂载于 /etc/configmaps/<configmap name& gt;,每个键/值都存储为一个文件。文件的名称是键,内容是值。ConfigMap 作为一个卷在 pod 中挂载。查找键值:

      $ ls /etc/configmaps/my-config/
      key1 key2
      $ cat /etc/configmaps/my-config/key1
      value1
      $ cat /etc/configmaps/my-config/key2
      value2
      Copy to Clipboard Toggle word wrap
      注意

      修改 ConfigMap 可能会导致项目不一致。红帽建议创建一个与旧内容相同的新 ConfigMap,而不是修改现有 ConfigMap。然后,您可以根据需要更新内容,并将 operator 自定义资源(CR)中的引用从 old 改为 new。这被视为一个新的 CR 更新,pod 被重新加载。

    • 如果您选择拥有自己的独立 ConfigMap,请提供 ConfigMap 的名称以及 standalone.xml 文件的密钥:

        standaloneConfigMap:
          name: clusterbench-config-map
          key: standalone.xml
      Copy to Clipboard Toggle word wrap
      注意

      JBoss EAP 8.0 不支持从 standalone.xml 文件创建 ConfigMap

    • 如果要在 OpenShift 中禁用默认的 HTTP 路由创建,请将 disableHTTPRoute 设置为 true

      spec:
        disableHTTPRoute: true
      Copy to Clipboard Toggle word wrap

9.1.3.1. 创建 secret

如果应用程序的 CustomResourceDefinition (CRD)文件引用 Secret,则必须在使用 EAP operator 在 OpenShift 上部署应用程序前创建 Secret

流程

  • 创建 Secret
$ oc create secret generic my-secret --from-literal=my-key=devuser --from-literal=my-password='my-very-secure-pasword'
Copy to Clipboard Toggle word wrap

9.1.3.2. 创建 configMap

如果应用程序的 CustomResourceDefinition (CRD)文件引用了 spec.ConfigMaps 字段中的 ConfigMap,则必须在使用 EAP operator 在 OpenShift 上部署应用程序前创建 ConfigMap。

流程

  • 创建 configmap:
 $ oc create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
configmap/my-config created
Copy to Clipboard Toggle word wrap

9.1.3.3. 从 standalone.xml 文件创建 configMap

您可以创建自己的 JBoss EAP 独立配置,而不使用来自 JBoss EAP for OpenShift Source-to-Image (S2I)的应用镜像中的一个。standalone.xml 文件必须放在可由 Operator 访问的 ConfigMap 中。

注意

JBoss EAP 8.0 不支持从 ConfigMap 提供 standalone.xml 文件。

流程

  • standalone.xml 文件创建 ConfigMap
 $ oc create configmap clusterbench-config-map --from-file examples/clustering/config/standalone.xml
configmap/clusterbench-config-map created
Copy to Clipboard Toggle word wrap

9.1.3.4. 为应用程序配置持久性存储

如果您的应用程序需要一些数据的持久性存储,如在 pod 重启后必须保留的事务或消息日志,请配置存储规格。如果存储 spec 为空,则应用程序的每个 pod 都会使用 EmptyDir 卷。但是,这个卷在对应的 pod 停止后不会保留。

流程

  1. 指定 volumeClaimTemplate 来配置资源要求,以存储 JBoss EAP 独立数据目录。模板的名称派生自 JBoss EAP 的名称。对应的卷以 ReadWriteOnce 访问模式挂载。

    spec:
      storage:
        volumeClaimTemplate:
          spec:
            resources:
              requests:
                storage: 3Gi
    Copy to Clipboard Toggle word wrap

    满足此存储要求的持久性卷挂载到 /eap/standalone/data 目录中。

9.1.4. 使用 EAP 操作器查看应用的指标

您可以使用 EAP 操作器查看 OpenShift 上部署的应用的指标。

当集群管理员在项目中启用指标监控时,EAP 操作器会自动显示 OpenShift 控制台中的指标。

先决条件

流程

  1. 在 OpenShift Container Platform Web 控制台中进入 MonitoringMetrics
  2. Metrics 屏幕上,在文本框中键入应用程序的名称以选择您的应用程序。您的应用程序的指标会出现在屏幕上。

9.1.5. 使用 Web 控制台卸载 EAP operator

您可以从集群中删除或卸载 EAP Operator,您可以删除订阅来将其从订阅的命名空间中删除。您还可以删除 EAP Operator 的 ClusterServiceVersion(CSV)和部署。

注意

为确保数据一致性和安全性,请在卸载 EAP 操作器前将集群中的 pod 数量缩减为 0。

您可以使用 Web 控制台卸载 EAP 操作器。

警告

如果您决定删除整个 wildflyserver 定义(oc delete wildflyserver <deployment_name&gt;),则不会启动事务恢复过程,无论未完成的事务是什么,pod 都会被终止。此操作中未完成的结果可能会阻止您稍后启动的数据更改。其他涉及事务性企业所涉及的 JBoss EAP 实例的数据变化也会被利用这个 wildflyserver 进行远程调用。

流程

  1. OperatorsInstalled Operators 页面中,选择 JBoss EAP
  2. Operator Details 页面的右侧,从 Actions 下拉菜单中选择 Uninstall Operator
  3. 如果要删除所有安装相关组件,则在看到 Remove Operator Subscription 窗口提示时,勾选 Also completely remove the Operator from the selected namespace 复选框。这会删除 CSV,并删除与 Operator 关联的 pod、部署、自定义资源定义(CRD)和自定义资源(CR)。
  4. 单击 Remove。EAP 操作器将停止运行,并且不再接收更新。

9.1.6. 使用 CLI 卸载 JBoss EAP operator

您可以从集群中删除或卸载 EAP Operator,您可以删除订阅来将其从订阅的命名空间中删除。您还可以删除 EAP Operator 的 ClusterServiceVersion(CSV)和部署。

注意

为确保数据一致性和安全性,请在卸载 EAP 操作器前将集群中的 pod 数量缩减为 0。

您可以使用命令行卸载 EAP 操作器。

使用命令行时,您可以通过从目标命名空间中删除订阅和 CSV 来卸载 Operator。

警告

如果您决定删除整个 wildflyserver 定义(oc delete wildflyserver <deployment_name&gt;),则不会启动事务恢复过程,无论未完成的事务是什么,pod 都会被终止。此操作中未完成的结果可能会阻止您稍后启动的数据更改。其他涉及事务性企业所涉及的 JBoss EAP 实例的数据变化也会被利用这个 wildflyserver 进行远程调用。

流程

  1. currentCSV 字段中检查 EAP operator 订阅的当前版本:

    $ oc get subscription eap-operator -n openshift-operators -o yaml | grep currentCSV
      currentCSV: eap-operator.v1.0.0
    Copy to Clipboard Toggle word wrap
  2. 删除 EAP Operator 的订阅:

    $ oc delete subscription eap-operator -n openshift-operators
    subscription.operators.coreos.com "eap-operator" deleted
    Copy to Clipboard Toggle word wrap
  3. 使用上一步中的 currentCSV 值删除目标命名空间中 EAP Operator 的 CSV:

    $ oc delete clusterserviceversion eap-operator.v1.0.0 -n openshift-operators
    clusterserviceversion.operators.coreos.com "eap-operator.v1.0.0" deleted
    Copy to Clipboard Toggle word wrap

9.1.7. 用于安全事务恢复的 JBoss EAP operator

JBoss EAP 操作器在终止应用程序集群前确保数据一致性。要做到这一点,Operator 会在缩减副本前验证所有事务是否都完成,并将 pod 标记为 干净 以终止。

这意味着,如果要在没有数据不一致的情况下安全地删除部署,您必须首先将 pod 数量缩减为 0,等待所有 pod 终止,然后只删除 wildflyserver 实例。

警告

如果您决定删除整个 wildflyserver 定义(oc delete wildflyserver <deployment_name&gt;),则不会启动事务恢复过程,无论未完成的事务是什么,pod 都会被终止。此操作中未完成的结果可能会阻止您稍后启动的数据更改。其他涉及事务性企业所涉及的 JBoss EAP 实例的数据变化也会被利用这个 wildflyserver 进行远程调用。

当 scaledown 进程启动 pod 状态(oc get pod <pod_name>)时,pod 仍标记为 Running,因为 pod 必须完成所有未完成的事务,包括针对它的远程企业级 Bean 调用。

如果要监控 scaledown 进程的状态,请观察 wildflyserver 实例的状态。如需更多信息 ,请参阅监控扩展进程。有关缩减期间 pod 状态的信息,请参阅扩展 过程中 Pod 状态

9.1.7.1. stable 网络主机名的 StatefulSets

管理 wildflyserver 的 EAP 操作器将创建一个 StatefulSet 作为管理 JBoss EAP pod 的底层对象。

StatefulSet 是管理有状态应用程序的工作负载 API 对象。它管理一组 pod 的部署和扩展,并为这些 pod 的排序和唯一性提供保证。

StatefulSet 确保集群中的 pod 以预定义的顺序命名。它还确保 pod 终止遵循相同的顺序。例如,pod-1 有一个交易的结果,因此处于 SCALING_DOWN_RECOVERY_DIRTY 状态。即使 pod-0 处于 SCALING_DOWN_CLEAN 状态,它也不会在 pod-1 之前终止。在 pod-1 清理 并终止前,pod-0 会一直处于 SCALING_DOWN_CLEAN 状态。但是,即使 pod-0 处于 SCALING_DOWN_CLEAN 状态,也不会收到任何新请求,且实际闲置。

注意

减少 StatefulSet 的副本大小或删除 pod 本身无效,并会恢复此类更改。

9.1.7.2. 监控 scaledown 进程

如果要监控 scaledown 进程的状态,您必须观察 wildflyserver 实例的状态。有关 scaledown 期间不同 pod 状态的更多信息,请参阅 在扩展过程中 Pod 状态

流程

  • 观察 scaledown 进程的状态:

    oc describe wildflyserver <name>
    Copy to Clipboard Toggle word wrap
    • WildFlyServer.Status.Scalingdown PodsWildFlyServer.Status.Replicas 字段显示 active 和 non-active pod 的整体状态。
    • Scalingdown Pods 字段显示所有未完成事务时要终止的 pod 数量。
    • WildFlyServer.Status.Replicas 字段显示当前运行的 pod 数量。
    • WildFlyServer.Spec.Replicas 字段显示处于 ACTIVE 状态的 pod 数量。
    • 如果没有 pod 在 scaledown 处理 WildFlyServer.Status.ReplicasWildFlyServer.Spec.Replicas 字段中的 pod 数量。
9.1.7.2.1. scaledown 期间的 Pod 状态

下表描述了 scaledown 期间的不同 pod 状态:

Expand
表 9.1. Pod 状态描述
Pod 状态描述

ACTIVE

pod 处于活跃状态并处理请求。

SCALING_DOWN_RECOVERY_INVESTIGATION

pod 即将缩减。缩减流程正在调查 JBoss EAP 中的事务状态。

SCALING_DOWN_RECOVERY_DIRTY

JBoss EAP 包含一些不完整的事务。在清理前 pod 无法被终止。事务恢复过程在 JBoss EAP 中定期运行,它会等待事务完成。

SCALING_DOWN_CLEAN

pod 由事务缩减处理处理,并标记为 clean 以从集群中移除。

9.1.7.3. 在处理人员的交易期间缩减

当事务的结果未知时,无法自动事务恢复。然后,您必须手动恢复您的事务。

先决条件

  • 您的 pod 的状态一直处于 SCALING_DOWN_RECOVERY_DIRTY 中。

流程

  1. 使用 CLI 访问您的 JBoss EAP 实例。
  2. 解决事务对象存储中的所有 heuristics 事务记录。如需更多信息,请参阅 JBoss EAP 管理事务中的恢复 Heuristic Outcomes
  3. 从企业 bean 客户端恢复文件夹中删除所有记录。

    1. 从 pod enterprise bean 客户端恢复目录中删除所有文件:

      $JBOSS_HOME/standalone/data/ejb-xa-recovery
      oc exec <podname> rm -rf $JBOSS_HOME/standalone/data/ejb-xa-recovery
      Copy to Clipboard Toggle word wrap
  4. pod 的状态更改为 SCALING_DOWN_CLEAN,pod 被终止。

如果系统不提供用于存储 事务日志 的文件系统,请使用 JBoss EAP S2I 镜像来配置 JDBC 对象存储。

重要

当 JBoss EAP 部署为可引导 JAR 时,S2I 环境变量不可用。在这种情况下,您必须创建一个 Galleon 层或配置 CLI 脚本来进行必要的配置更改。

JDBC 对象存储可使用环境变量 TX_DATABASE_PREFIX_MAPPING 设置。此变量具有与 DB_SERVICE_PREFIX_MAPPING 相同的结构。

前提条件

  • 您已根据环境变量的值创建了数据源。
  • 您已确保数据库和写入权限的一致性,在数据库和 JDBC 对象存储通信 的事务管理器 之间存在。如需更多信息,请参阅配置 JDBC 数据源

流程

  • 通过 S2I 环境变量设置和配置 JDBC 对象存储。

    示例

    # Narayana JDBC objectstore configuration via s2i env variables
    - name: TX_DATABASE_PREFIX_MAPPING
      value: 'PostgresJdbcObjectStore-postgresql=PG_OBJECTSTORE'
    - name: POSTGRESJDBCOBJECTSTORE_POSTGRESQL_SERVICE_HOST
      value: 'postgresql'
    - name: POSTGRESJDBCOBJECTSTORE_POSTGRESQL_SERVICE_PORT
      value: '5432'
    - name: PG_OBJECTSTORE_JNDI
      value: 'java:jboss/datasources/PostgresJdbc'
    - name: PG_OBJECTSTORE_DRIVER
      value: 'postgresql'
    - name: PG_OBJECTSTORE_DATABASE
      value: 'sampledb'
    - name: PG_OBJECTSTORE_USERNAME
      value: 'admin'
    - name: PG_OBJECTSTORE_PASSWORD
      value: 'admin'
    Copy to Clipboard Toggle word wrap

验证

  • 您可以通过检查 standalone.xml 配置文件 oc rsh <podname> cat /opt/server/standalone/configuration/standalone.xml 来验证数据源配置和事务子系统配置。

    预期输出:

    <datasource jta="false" jndi-name="java:jboss/datasources/PostgresJdbcObjectStore" pool-name="postgresjdbcobjectstore_postgresqlObjectStorePool"
        enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
        <connection-url>jdbc:postgresql://postgresql:5432/sampledb</connection-url>
        <driver>postgresql</driver>
        <security>
            <user-name>admin</user-name>
            <password>admin</password>
        </security>
    </datasource>
    
    <!-- under subsystem urn:jboss:domain:transactions -->
    <jdbc-store datasource-jndi-name="java:jboss/datasources/PostgresJdbcObjectStore">
         <!-- the pod name was named transactions-xa-0 -->
        <action table-prefix="ostransactionsxa0"/>
        <communication table-prefix="ostransactionsxa0"/>
        <state table-prefix="ostransactionsxa0"/>
    </jdbc-store>
    Copy to Clipboard Toggle word wrap

9.1.7.5. 缩减过程中的事务恢复

当您在 JBoss EAP 应用服务器中使用事务部署应用程序时,务必要了解集群缩减过程中发生的情况。减少活动 JBoss EAP 副本的数量可能会离开需要完成(或解决)需要完成的事务的 in-doubt (或更高)。这种情况是 XA 标准的结果,即交易声明为成功完成事务。此外,XA 事务还可以完成,其结果需要手动解决。关闭正在管理此类事务(即 in-doubt 或 heuristic 事务)的 pod 可能会导致数据不一致/术语或数据锁定。

JBoss EAP 操作器提供缩减功能,以确保所有事务在减少副本数前完成。此功能验证 pod 中的所有事务是否已完成/解决,仅 Operator 会将 pod 标记为 clean 以进行终止。

如需更多信息,请参阅 WildFly Operator 用户指南

流程

  1. 要减少 JBoss EAP 应用服务器中的副本大小,请执行以下操作之一:

    • 对副本大小进行补丁:

      oc patch wildflyserver <name> -p '[{"op":"replace", "path":"/spec/replicas", "value":0}]' --type json
      Copy to Clipboard Toggle word wrap
    • 手动编辑副本大小:

      oc edit wildflyserver <name>
      Copy to Clipboard Toggle word wrap
注意

直接减少 StatefulSet 中的副本大小,或删除 pod 将无效。此类更改将自动恢复。

重要

删除整个 JBoss EAP 服务器定义(oc delete wildflyserver <deployment_name>')不会启动事务恢复过程。无论未完成的事务是什么,pod 都会终止。要在没有数据不一致的情况下安全地删除部署,首先将 pod 数量缩减为零,等待所有 pod 终止,然后删除 JBoss EAP 实例。

重要

确保在 JBoss EAP 事务子系统中启用 Narayana recovery 侦听器。如果不这样做,缩减事务恢复处理会跳过该特定 JBoss EAP pod。

9.1.7.6. 缩减过程

当 scaledown 进程启动时,您会看到 oc get pod <pod_name> 的 pod 状态仍显示为 Running。在此状态下,操作员允许 Pod 完成所有未完成事务,包括针对它的远程 EJB 调用。要观察 scaledown 进程,您可以监控 JBoss EAP 实例的状态。使用 oc describe wildflyserver <name& gt; 来查看 pod 状态。

Expand
Name描述

ACTIVE

pod 主动处理请求。

SCALING_DOWN_RECOVERY_INVESTIGATION

pod 正在调查,以找出是否有无法成功完成其生命周期的事务。

SCALING_DOWN_RECOVERY_PROCESSING

日志存储中有 in-doubt 事务。在完成或清理这些事务前,pod 无法终止。

SCALING_DOWN_RECOVERY_HEURISTICS

日志存储中有一些事务。在手动解决或清理这些事务前,pod 无法终止。

SCALING_DOWN_CLEAN

pod 已完成事务缩减过程,并在从集群中删除时清除。

9.1.7.7. 在扩展过程中禁用事务恢复

如果要在缩减过程中禁用事务恢复,您可以将属性 WildFlyServerSpec.DeactivateTransactionRecovery 配置为 true (默认为 false)。当您启用 DeactivateTransactionRecovery, in-doubt 和 heuristic 事务不会被完成或报告时,在使用分布式事务时可能会导致数据不一致或丢失。

heuristic Transactions

XA 事务的结果可以是 提交回滚 或更高。后一结果代表了根据双阶段协议(用于完成 XA 事务)的第一阶段的结果,对分布式交易的参与者没有完成的确认。因此,Huristic 事务需要人工干预才能强制执行正确的结果(在第一阶段,事务协调员强制给所有参与者)。

如果 JBoss EAP pod 正在处理异常事务,则该 pod 将被标记为 SCALING_DOWN_RECOVERY_HEURISTICS。管理员必须手动连接到特定的 JBoss EAP pod (使用 jboss-cli),并手动解决高度事务。从事务对象存储解决/删除所有这些记录后,Operator 会将 pod 标记为 SCALING_DOWN_CLEAN,pod 将被终止。

StatefulSet 行为
StatefulSet 确保 stable 网络主机名,这取决于 pod 的排序。Pod 以定义的顺序命名,需要在 pod-0 之前终止 pod-1。如果 pod-1 处于 SCALING_DOWN_RECOVERY_HEURISTICS 和 pod-0 处于 SCALING_DOWN_CLEAN,pod-0 将处于其状态,直到 pod-1 终止为止。即使 pod 处于 SCALING_DOWN_CLEAN,也不会接收新请求并保持闲置。

9.1.8. 使用 pod 横向自动扩展 HPA 自动扩展 pod

通过 EAP 操作器,您可以使用 pod 横向自动扩展 HPA 根据属于该 EAP 应用的 pod 收集的指标自动增加或减少 EAP 应用的规模。

注意

使用 HPA 确保在 pod 缩减时仍处理事务恢复。

流程

  1. 配置资源:

    apiVersion: wildfly.org/v1alpha1
    kind: WildFlyServer
    metadata:
      name: eap-helloworld
    spec:
      applicationImage: 'eap-helloworld:latest'
      replicas: 1
      resources:
        limits:
          cpu: 500m
          memory: 2Gi
        requests:
          cpu: 100m
          memory: 1Gi
    Copy to Clipboard Toggle word wrap
    重要

    您必须为 pod 中的容器指定资源限值和请求,以便自动扩展按预期工作。

  2. 创建 Horizontal pod 自动缩放器:

    oc autoscale wildflyserver/eap-helloworld --cpu-percent=50 --min=1 --max=10
    Copy to Clipboard Toggle word wrap

验证

  • 您可以通过检查副本来验证 HPA 行为。副本数量会根据工作负载的增加或减少而进行相应的增加或减少。
oc get hpa -w
NAME               REFERENCE                        TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
eap-helloworld   WildFlyServer/eap-helloworld   217%/50%   1         10        1          4s
eap-helloworld   WildFlyServer/eap-helloworld   217%/50%   1         10        4          17s
eap-helloworld   WildFlyServer/eap-helloworld   133%/50%   1         10        8          32s
eap-helloworld   WildFlyServer/eap-helloworld   133%/50%   1         10        10         47s
eap-helloworld   WildFlyServer/eap-helloworld   139%/50%   1         10        10         62s
eap-helloworld   WildFlyServer/eap-helloworld   180%/50%   1         10        10         92s
eap-helloworld   WildFlyServer/eap-helloworld   133%/50%   1         10        10         2m2s
Copy to Clipboard Toggle word wrap

9.1.9. OpenShift 上的 Jarkarta 企业 Bean remoting

要使 JBoss EAP 能够在 OpenShift 上的不同 JBoss EAP 集群之间正确地使用企业 bemoting 调用,您必须了解 OpenShift 上的企业 bean remoting 配置选项。

注意

在 OpenShift 上部署时,请考虑使用 EAP 操作器。EAP 操作员使用 StatefulSet 来处理企业 bean remoting 和事务恢复处理。StatefulSet 确保持久性存储和网络主机名稳定性,即使 pod 重启后也是如此。

当使用带有事务传播的企业 bean 远程调用联系 JBoss EAP 实例时,需要网络主机名稳定性。即使 pod 重启,JBoss EAP 实例必须可以被同一主机名访问。事务管理器(有状态组件)将持久事务数据绑定到特定的 JBoss EAP 实例。由于事务日志绑定到特定的 JBoss EAP 实例,它必须在同一实例中完成。

要在使用 JDBC 事务日志存储时防止数据丢失,请确保您的数据库提供了数据一致性的读取和写入。当数据库通过多个实例水平扩展时,一致数据读取和写入非常重要。

企业 bean 远程调用者有两个选项来配置远程调用:

  • 定义远程出站连接。

您必须重新配置代表目标节点地址的值,具体取决于企业 bean 远程调用配置方法。

注意

远程调用的目标企业 bean 的名称必须是第一个 pod 的 DNS 地址。

StatefulSet 的行为取决于 pod 的排序。pod 以预定义的顺序命名。例如,如果您将应用扩展为三个副本,则您的 pod 具有名称,如 eap-server-0eap-server-1eap-server-2

EAP 操作器也使用 无头服务 来确保将特定的 DNS 主机名分配给 pod。如果应用使用 EAP 操作器,则使用名称(如 eap-server-headless )创建一个无头服务。在本例中,第一个 pod 的 DNS 名称为 eap-server-0.eap-server-headless

使用主机名 eap-server-0.eap-server-headless 确保企业 bean 调用达到连接到集群的任何 EAP 实例。bootstrap 连接用于初始化 Jakarta Enterprise Beans 客户端,它会在下一步中收集 EAP 集群的结构。

9.1.9.1.1. 在 OpenShift 上配置 Jakarta Enterprise Beans

您必须配置作为企业级补救的调用者的 JBoss EAP 服务器。目标服务器必须配置一个具有权限的用户,才能接收企业 bean 远程调用。

先决条件

  • 您已使用 EAP 操作器和支持的 OpenShift S2I 镜像,用于在 OpenShift 中部署和管理 JBoss EAP 应用实例。
  • 集群设置正确。有关 JBoss EAP 集群的更多信息,请参阅 集群 部分。

流程

  1. 在目标服务器上创建一个用户,并有权接收企业 bean 远程调用:

    $JBOSS_HOME/bin/add-user.sh
    Copy to Clipboard Toggle word wrap
  2. 配置调用 JBoss EAP 应用服务器。

    1. 使用自定义配置功能,在 $JBOSS_HOME/standalone/configuration 中创建 eap-config.xml 文件。如需更多信息,请参阅 自定义配置
    2. 使用 wildfly.config.url 属性配置调用器 JBoss EAP 应用服务器:

      JAVA_OPTS_APPEND="-Dwildfly.config.url=$JBOSS_HOME/standalone/configuration/eap-config.xml"
      Copy to Clipboard Toggle word wrap
      注意

      如果您的配置使用以下示例,请将 >>PASTE_…​_HERE<< 替换为您配置的用户名和密码。

      配置示例

      <configuration>
         <authentication-client xmlns="urn:elytron:1.0">
            <authentication-rules>
               <rule use-configuration="jta">
                  <match-abstract-type name="jta" authority="jboss" />
               </rule>
            </authentication-rules>
            <authentication-configurations>
               <configuration name="jta">
                  <sasl-mechanism-selector selector="DIGEST-MD5" />
                  <providers>
                     <use-service-loader />
                  </providers>
                  <set-user-name name="PASTE_USER_NAME_HERE" />
                  <credentials>
                     <clear-password password="PASTE_PASSWORD_HERE" />
                  </credentials>
                  <set-mechanism-realm name="ApplicationRealm" />
               </configuration>
            </authentication-configurations>
         </authentication-client>
      </configuration>
      Copy to Clipboard Toggle word wrap

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部