在 Azure Kubernetes Service (AKS) 群集上,将 Java EE JCache 与 Open Liberty 或 WebSphere Liberty 结合使用

本文介绍如何在部署到 AKS 的容器化应用程序中使用 Java EE JCache。

在本指南中,你将:

  • 创建基础结构,以便在 Open Liberty 或 WebSphere Liberty 运行时上运行 Java、Java EE、Jakarta EE 或 MicroProfile 应用程序。
  • 使用 Azure Cache for Redis 支持的 Java EE JCache 作为会话缓存。
  • 使用 Open Liberty 或 WebSphere Liberty 容器映像构建应用程序 Docker 映像。
  • 使用 Open Liberty Operator 将容器化应用程序部署到 AKS 群集。

本文旨在帮助你快速进行部署。 在进入生产环境之前,应探索 Tuning Liberty

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

先决条件

  • Azure 订阅。 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户
  • 准备一台安装了类似于 Unix 的操作系统(例如 Ubuntu、macOS 或适用于 Linux 的 Windows 子系统)的本地计算机。
  • 安装 Azure CLI,以运行 Azure CLI 命令。
  • 安装 Java SE 实现版本 17 或更高版本 - 例如,Microsoft 版 OpenJDK
  • 安装 Maven 3.5.0 或更高版本。
  • 安装适用于 OS 的 Docker
  • 确保已安装 Git
  • 确保你已获分配了订阅的 Owner 角色或 ContributorUser Access Administrator 角色。 你可以按照列出用户或组的角色分配中的步骤验证分配。

创建基础结构

本节中的步骤将指导你在 Azure 上创建应用程序基础结构。 完成这些步骤后,你将创建 Azure 容器注册表、Azure Kubernetes 服务群集和 Azure Cache for Redis 实例,以运行示例应用程序。

创建资源组

Azure 资源组是用于部署和管理 Azure 资源的逻辑组。

使用 az group create 命令在 eastus 位置创建名为“java-liberty-project”的资源组。 此资源组稍后用于创建 Azure 容器注册表 (ACR) 实例和 AKS 群集。

export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus

创建 ACR 实例

使用 az acr create 命令创建 ACR 实例。 下面的示例创建名为“youruniqueacrname”的 ACR 实例。 请确保“youruniqueacrname”在 Azure 中是独一无二的。

export REGISTRY_NAME=youruniqueacrname
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic

很快,你应该会看到包含以下内容的 JSON 输出:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "java-liberty-project",

或者,可以按照快速入门:通过 Azure 门户创建 Azure 容器注册表中的步骤创建 Azure 容器注册表实例。

连接到该 ACR 实例

你需要先登录 ACR 实例,然后才能向其推送映像。 运行以下命令,以验证连接:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'loginServer' \
    --output tsv)

az acr login \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME

注意

不建议使用用户名和密码凭据授予对容器注册表的访问权限。 如果特定使用要求建议基于凭据的访问是最佳方法,则可以使用 az acr credential show 获得用户名和密码,并将这些值与 docker login 结合使用。

如果已成功登录到 ACR 实例,则应在命令输出的末尾看到 Login Succeeded

如果在登录 Azure 容器注册表时遇到问题,请参阅注册表登录疑难解答

创建 AKS 群集

使用 az aks create 命令创建 AKS 群集,并授予其从 ACR 实例中提取映像的权限。 以下示例创建一个具有一个节点的名为 myAKSCluster 的群集。 此命令需要几分钟才能完成。

export CLUSTER_NAME=myAKSCluster
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --generate-ssh-keys \
    --enable-managed-identity \
    --attach-acr $REGISTRY_NAME

片刻之后,该命令将会完成,并返回有关群集的 JSON 格式信息,包括以下行:

  "nodeResourceGroup": "MC_java-liberty-project_myAKSCluster_eastus",
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "java-liberty-project",

连接到 AKS 群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 若要在本地安装 kubectl,请使用 az aks install-cli 命令:

az aks install-cli

若要将 kubectl 配置为连接到 Kubernetes 群集,请使用 az aks get-credentials 命令。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

az aks get-credentials \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --overwrite-existing

若要验证到群集的连接,请使用 kubectl get 命令返回群集节点列表。

kubectl get nodes

以下示例输出显示在上一步创建的单个节点。 请确保节点的状态为就绪

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.18.10

安装 Open Liberty Operator

在创建并连接到群集后,请通过运行以下命令来安装 Open Liberty Operator

# Install cert-manager Operator
CERT_MANAGER_VERSION=v1.11.2
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml

# Install Open Liberty Operator
export OPERATOR_VERSION=1.3.3
mkdir -p overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/kustomization.yaml -q -P ./overlays/watch-all-namespaces
mkdir base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/kustomization.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-crd.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-operator.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-roles.yaml -q -P ./base
kubectl create namespace open-liberty
kubectl apply --server-side -k overlays/watch-all-namespaces

创建用于 Redis 的 Azure 缓存实例

Azure Cache for Redis 支持在 Open Liberty 或 WebSphere Liberty 服务器中运行的 Java 应用程序的 HttpSession 的持久性。 按照本节中的步骤创建 Azure Cache for Redis 实例,并记下其连接信息。 稍后将使用此信息。

  1. 按照快速入门:在 Java 中使用 Azure Cache for Redis 中的步骤操作,但不包括了解 Java 示例

    注意

    在“创建用于 Redis 的 Azure 缓存”部分的步骤 6 中,为“身份验证”选项选择“访问密钥身份验证”。 需要此选项,此示例应用程序才能使用 Redisson 客户端库连接到用于 Redis 的 Azure 缓存实例。 有关详细信息,请参阅 Redisson 配置

  2. 为 Azure Cache for Redis 实例复制主机名主访问密钥,然后运行以下命令以添加环境变量:

    export REDISCACHEHOSTNAME=<YOUR_HOST_NAME>
    export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
    

构建应用程序

按照本节中的步骤生成和容器化示例应用程序。 这些步骤使用 Maven、liberty-maven-pluginaz acr build。 如需详细了解 liberty-maven-plugin,请参阅使用 Maven 构建 Web 应用程序

签出应用程序

使用以下命令克隆本指南的示例代码。 此示例位于 GitHub 上的 open-liberty-on-aks 存储库中。 存储库中有一些示例。 本文使用 java-app-jcache

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20240909
cd java-app-jcache

如果看到消息显示正处于“拆离的 HEAD”状态,可以放心地忽略此消息。 它只是表示你已签出标记。

应用程序具有以下文件结构:

java-app-jcache/
├── pom.xml
└── src
    └── main
        ├── aks
        │   └── openlibertyapplication.yaml
        ├── docker
        │   ├── Dockerfile
        │   └── Dockerfile-wlp
        ├── java
        ├── liberty
        │   └── config
        │       └── server.xml
        ├── redisson
        │   └── redisson-config.yaml
        ├── resources
        └── webapp

目录 javaresourceswebapp 包含示例应用程序的源代码。

aks 目录中,部署文件 openlibertyapplication.yaml 用于部署应用程序映像。

docker 目录中,我们放置两个 Dockerfile。 Dockerfile 用于使用 Open Liberty 生成映像,Dockerfile-wlp 用于使用 WebSphere Liberty 生成映像。

liberty/config 目录中,server.xml 文件用于为 Open Liberty 和 WebSphere Liberty 群集配置会话缓存。

redisson 目录中,redisson-config.yaml 文件用于配置 Azure Cache for Redis 实例的连接。

容器化应用程序

若要在 AKS 群集上部署并运行 Liberty 应用程序,请使用以下步骤将应用程序容器化为 Docker 映像。 可以使用 Open Liberty 容器映像WebSphere Liberty 容器映像

  1. 验证本地克隆中的当前工作目录是否为 java-app-jcache

  2. 运行 mvn clean package 来打包应用程序。

  3. 运行 mvn -Predisson validate 以将 Redisson 配置文件复制到指定位置。 此步骤将环境变量 REDISCACHEHOSTNAMEREDISCACHEKEY 的值插入到 redisson-config.yaml 文件中,该文件由 server.xml 文件引用。

  4. 运行 mvn liberty:dev 来测试该应用程序。 如果测试成功,你应该会在命令输出中看到 The defaultServer server is ready to run a smarter planet.。 如果 Redis 连接成功,应会看到类似于以下内容的输出。

    [INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.23.4
    [INFO] [err] [redisson-netty-2-7] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    
  5. 你可以访问 http://localhost:9080/ 查看正在应用程序的运行情况,但 Redis 运行的证明是上一步中列出的输出。

  6. 使用 Ctrl+C 停止应用程序。

  7. 使用以下命令检索在 pom.xml 文件中定义的属性 artifactIdversion 的值。

    export artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)
    export version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
    
  8. 运行 cd target 以将目录更改为示例的构建。

  9. 运行以下某个命令来生成应用程序映像并将其推送到 ACR 实例。

    • 如果你更喜欢将 Open Liberty 用作轻量级开源 Java™ 运行时,请使用以下命令来使用 Open Liberty 基础映像进行构建:

      # Build and tag application image. This causes the ACR instance to pull the necessary Open Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME .
      
    • 如果你更喜欢使用 Open Liberty 的商业版本,请使用以下命令来构建 WebSphere Liberty 基础映像:

      # Build and tag application image. This causes the ACR instance to pull the necessary WebSphere Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME --file=Dockerfile-wlp .
      

部署应用程序

按照本节中的步骤在 AKS 群集上部署容器化示例应用程序。

  1. 验证本地克隆中的当前工作目录是否为 java-app-jcache/target

  2. 使用以下命令创建包含 Redisson 配置信息的机密。 使用此机密,应用程序就可以连接到创建的 Azure Cache for Redis 实例。

    export REDISSON_CONFIG_SECRET_NAME=redisson-config-secret
    kubectl create secret generic ${REDISSON_CONFIG_SECRET_NAME} --from-file=$(pwd)/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml
    
  3. 使用以下命令将具有三个副本的 Liberty 应用程序部署到 AKS 群集。 命令输出也以内联方式显示。

    # Set number of application replicas
    export REPLICAS=3
    
    # Create OpenLibertyApplication "javaee-cafe-jcache-cluster"
    envsubst < openlibertyapplication.yaml | kubectl create -f -
    
    openlibertyapplication.openliberty.io/javaee-cafe-jcache-cluster created
    
    # Check if OpenLibertyApplication instance is created
    kubectl get openlibertyapplication ${artifactId}-cluster
    
    NAME                               IMAGE                                                         EXPOSED      RECONCILED   AGE
    javaee-cafe-jcache-cluster         youruniqueacrname.azurecr.io/javaee-cafe-jcache:1.0.0                      True         59s
    
    # Check if deployment created by Operator is ready
    kubectl get deployment ${artifactId}-cluster --watch
    
    NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-jcache-cluster         0/3     3            0           20s
    
  4. 等到在 READY 列下方看到 3/3,在 AVAILABLE 列下方看到 3,然后使用 Ctrl+C 停止 kubectl 监视进程。

测试应用程序

在应用程序运行时,Kubernetes 负载均衡器服务会将向 Internet 公开应用程序前端。 此进程可能需要一段时间才能完成。

若要监视进度,请将 kubectl get service 命令与 --watch 参数配合使用。

kubectl get service ${artifactId}-cluster --watch

NAME                               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-jcache-cluster         LoadBalancer   10.0.50.29     20.84.16.169    80:31732/TCP     68s

EXTERNAL-IP 地址从挂起更改为实际公共 IP 地址后,使用 Ctrl+C 来停止 kubectl 监视进程。

打开 Web 浏览器访问服务的外部 IP 地址(上面示例中的 20.84.16.169),以查看应用程序主页。 如果页面加载不正确,那是因为应用正在启动。 可以等待一段时间,稍后刷新页面。 你应该看到应用程序副本的 pod 名称显示在页面的左上角(本例中为 javaee-cafe-jcache-cluster-77d54bccd4-5xnzx)。

Java Liberty 应用程序已成功部署在 AKS 上的屏幕截图。

在表单在会话中新建咖啡中,为字段名称价格设置值,然后选择提交。 几秒钟后,你将在页面左下角看到提交计数:1

示例应用程序的屏幕截图,其中显示了在应用程序的会话中创建并持久化的新咖啡。

为了证明会话缓存在应用程序的所有副本上持久化,请运行以下命令删除 pod 名称为 javaee-cafe-jcache-cluster-<pod id from your running app> 的当前副本:

kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx

pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted

然后,刷新应用程序主页。 你将在在会话中新建咖啡部分看到相同的数据,但页面左上角显示了不同的 pod 名称。

最后,使用以下步骤证明会话数据是否持久化在 Azure Cache for Redis 实例中。 可以使用 Redis 控制台向 Azure Cache for Redis 实例发出命令。

  1. 从 Azure 门户查找 Azure Cache for Redis 实例。

  2. 选择控制台,以打开 Redis 控制台。

  3. 运行以下命令查看会话数据:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. 从网页中搜索 cafe.model.entity.Coffee[id=1, name=Coffee 3, price=30.0],这是在 Azure Cache for Redis 实例中创建和保存的咖啡。

清理资源

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

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

若要删除 Azure Cache for Redis 实例,请找到其资源组名称并运行以下命令:

az group delete --name <AZURE_CACHE_FOR_REDIS_RESOURCE_GROUP_NAME> --yes --no-wait

后续步骤

可以从本指南中使用的参考资料中了解到更多信息:

要了解在 Azure 上运行 WebSphere 产品的选项,请参阅在 Azure 上运行 WebSphere 系列产品的解决方案有哪些?