在 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 命令。
- 通过使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录到 Azure。
- 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用和管理 Azure CLI 的扩展。
- 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
- 安装 Java SE 实现版本 17 或更高版本 - 例如,Microsoft 版 OpenJDK。
- 安装 Maven 3.5.0 或更高版本。
- 安装适用于 OS 的 Docker。
- 确保已安装 Git。
- 确保你已获分配了订阅的
Owner
角色或Contributor
和User 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 实例,并记下其连接信息。 稍后将使用此信息。
按照快速入门:在 Java 中使用 Azure Cache for Redis 中的步骤操作,但不包括了解 Java 示例。
注意
在“创建用于 Redis 的 Azure 缓存”部分的步骤 6 中,为“身份验证”选项选择“访问密钥身份验证”。 需要此选项,此示例应用程序才能使用 Redisson 客户端库连接到用于 Redis 的 Azure 缓存实例。 有关详细信息,请参阅 Redisson 配置。
为 Azure Cache for Redis 实例复制主机名和主访问密钥,然后运行以下命令以添加环境变量:
export REDISCACHEHOSTNAME=<YOUR_HOST_NAME> export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
构建应用程序
按照本节中的步骤生成和容器化示例应用程序。 这些步骤使用 Maven、liberty-maven-plugin
和 az 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
目录 java、resources 和 webapp 包含示例应用程序的源代码。
在 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 容器映像。
验证本地克隆中的当前工作目录是否为 java-app-jcache。
运行
mvn clean package
来打包应用程序。运行
mvn -Predisson validate
以将 Redisson 配置文件复制到指定位置。 此步骤将环境变量REDISCACHEHOSTNAME
和REDISCACHEKEY
的值插入到 redisson-config.yaml 文件中,该文件由 server.xml 文件引用。运行
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
你可以访问
http://localhost:9080/
查看正在应用程序的运行情况,但 Redis 运行的证明是上一步中列出的输出。使用 Ctrl+C 停止应用程序。
使用以下命令检索在 pom.xml 文件中定义的属性
artifactId
和version
的值。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)
运行
cd target
以将目录更改为示例的构建。运行以下某个命令来生成应用程序映像并将其推送到 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 群集上部署容器化示例应用程序。
验证本地克隆中的当前工作目录是否为 java-app-jcache/target。
使用以下命令创建包含 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
使用以下命令将具有三个副本的 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
等到在
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
)。
在表单在会话中新建咖啡中,为字段名称和价格设置值,然后选择提交。 几秒钟后,你将在页面左下角看到提交计数: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 实例发出命令。
从 Azure 门户查找 Azure Cache for Redis 实例。
选择控制台,以打开 Redis 控制台。
运行以下命令查看会话数据:
scan 0 count 1000 match '*' hgetall "com.ibm.ws.session.attr.default_host%2F"
从网页中搜索 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 系列产品的解决方案有哪些?