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

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

在本指南中,你将:

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

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

先决条件

  • 在 bash 环境中使用 Azure Cloud Shell

    Launch Cloud Shell in a new window

  • 如果需要,请安装 Azure CLI 来运行 CLI 参考命令。

    • 如果使用的是本地安装,请通过 Azure CLI 使用 az login 命令登录。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录
    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展
    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade
  • 本文需要 Azure CLI 的最新版本。 如果你使用的是 Azure Cloud Shell,则表示已安装最新版本。
  • 如果在本指南中在本地运行命令, (而不是 Azure Cloud Shell) :
    • 准备安装了 Unix 之类操作系统(如 Ubuntu、macOS、适用于 Linux 的 Windows 子系统)的本地计算机。
    • 安装 Java SE 实现(例如 AdoptOpenJDK OpenJDK 8 LTS/OpenJ9)。
    • 安装 Maven 3.5.0 或更高版本。
    • 安装适用于 OS 的 Docker
  • 请确保已为订阅分配角色OwnerContributorUser Access Administrator角色。 可以按照 用户或组的列表角色分配中的步骤验证分配。

创建基础结构

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

创建资源组

Azure 资源组是一个逻辑组,用于部署和管理 Azure 资源。

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

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 -n $REGISTRY_NAME --query 'loginServer' -o tsv)
export USER_NAME=$(az acr credential show -n $REGISTRY_NAME --query 'username' -o tsv)
export PASSWORD=$(az acr credential show -n $REGISTRY_NAME --query 'passwords[0].value' -o tsv)

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

如果已成功登录到 ACR 实例,则应在命令输出结束时看到 Login Succeeded

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

创建 AKS 群集

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

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 Open Liberty Operator
mkdir -p overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/0.8.0/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/0.8.0/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/0.8.0/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/0.8.0/kustomize/base/kustomization.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/0.8.0/kustomize/base/open-liberty-crd.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/0.8.0/kustomize/base/open-liberty-operator.yaml -q -P ./base
kubectl apply -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 示例

  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 存储库中。 存储库中有一些示例。 本文针对 git 标记 20220429的示例编写。 我们将使用 javaee-app-jcache。 下面是应用程序的文件结构。

javaee-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 群集配置会话缓存。

re森德目录中,re与 config.yaml 文件用于配置Azure Cache for Redis实例的连接。

容器化应用程序

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

  1. 将目录更改为本地克隆的 javaee-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. 使用以下命令检索属性 artifactId 的值,并在 versionpom.xml 文件中定义。

    artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)
    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 .
      
    • 如果希望使用 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 --file=Dockerfile-wlp .
      

部署应用程序

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

  1. 验证当前工作目录是否为本地克隆中的 javaee-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. 等到列下READY3列下AVAILABLE看到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),以查看应用程序主页。 本例) ,应会看到页面 javaee-cafe-jcache-cluster-77d54bccd4-5xnzx 左上角显示的应用程序副本的 Pod 名称 (。

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.

若要演示会话缓存在应用程序的所有副本中保留,请运行以下命令以删除具有 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. 在网页中搜索 café.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

后续步骤

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