在 Azure Kubernetes 服务 (AKS) 群集上将 Java 企业版 JCache 与 Open Liberty 或 WebSphere Liberty 配合使用

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

在本指南中,你将:

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

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

如果还没有 Azure 订阅,可以在开始前创建一个免费帐户

先决条件

  • 本文需要 Azure CLI 的最新版本。 如果你使用的是 Azure Cloud Shell,则表示已安装最新版本。
  • 如果在本地运行本指南中的命令(而不是 Azure Cloud Shell):
    • 准备安装了 Unix 之类操作系统(如 Ubuntu、macOS、适用于 Linux 的 Windows 子系统)的本地计算机。
    • 安装 Java 标准版实现版本 17 或更高版本(例如 Eclipse Open J9)。
    • 安装 Maven 3.5.0 或更高版本。
    • 安装适用于 OS 的 Docker
  • 请确保已为订阅分配Owner角色或ContributorUser Access Administrator角色。 可以按照“列出用户或组的角色分配”中的步骤来验证分配。

创建基础结构

本部分中的步骤将指导你在 Azure 上创建应用程序基础结构。 完成这些步骤后,你将拥有Azure 容器注册表、Azure Kubernetes 服务群集和用于运行示例应用程序的 Azure 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 \
    --admin-enabled

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

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

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

连接到该 ACR 实例

在将映像推送到 ACR 实例之前,需要登录到 ACR 实例。 运行以下命令,以验证连接:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'loginServer' \
    --output tsv)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

如果已成功登录到 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。 如果使用的是 Azure Cloud Shell,则 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.2.2
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 Redis 缓存支持在 Open Liberty 或 WebSphere Liberty 服务器中运行的 Java 应用程序的持久性 HttpSession 。 按照本部分中的步骤创建 Azure Redis 缓存实例并记下其连接信息。 稍后我们将使用此信息。

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

  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 20230906

如果看到消息显示正处于“拆离的 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

java资源和 Webapp 目录包含示例应用程序的源代码。

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

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

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

重新不和谐目录中,reisi-config.yaml 文件用于配置 Azure Redis 缓存实例的连接。

容器化应用程序

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

  1. 将目录更改为 本地克隆的 java-app-jcache

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

  3. 运行 mvn -Predisson validate 以将 Re森配置文件复制到指定位置。 此步骤将环境变量REDISCACHEHOSTNAMEREDISCACHEKEY的值插入 re比森-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.16.7
    [INFO] [err] [redisson-netty-2-2] 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 will cause 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 will cause 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. 使用以下命令创建包含 Re森迪森配置信息的机密。 使用此机密,应用程序可以连接到创建的 Azure 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 应用程序与三个副本 (replica)部署到 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. 等到列下和3列下READYAVAILABLE看到3/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 名称副本 (replica)显示在页面左上角(javaee-cafe-jcache-cluster-77d54bccd4-5xnzx在本例中)。

Screenshot of Java liberty application successfully deployed on A K S.

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

Screenshot of sample application showing new coffee created and persisted in the session of the application.

若要演示会话缓存在应用程序的所有副本 (replica)中保持,请运行以下命令以删除具有 Pod 名称javaee-cafe-jcache-cluster-<pod id from your running app>的当前副本 (replica):

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

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

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

最后,使用以下步骤演示会话数据保存在 Azure Redis 缓存实例中。 可以使用 Redis 控制台向 Azure Redis 缓存实例发出命令。

  1. 从Azure 门户查找 Azure Redis 缓存实例。

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

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

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

清理资源

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

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

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

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

后续步骤

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