在 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 Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
- 本文需要 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
角色或Contributor
User 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 缓存实例并记下其连接信息。 稍后我们将使用此信息。
按照快速入门中的 步骤操作:在 Java 中使用 Azure Redis 缓存,但不包括 了解 Java 示例。
复制 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 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 容器映像。
将目录更改为 本地克隆的 java-app-jcache 。
运行
mvn clean package
来打包应用程序。运行
mvn -Predisson validate
以将 Re森配置文件复制到指定位置。 此步骤将环境变量REDISCACHEHOSTNAME
REDISCACHEKEY
的值插入 re比森-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.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
你可以访问
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 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 群集上部署容器化示例应用程序。
验证当前工作目录是否为 本地克隆中的 java-app-jcache/target 。
使用以下命令创建包含 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
使用以下命令将 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
等到列下和
3
列下READY
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
),以查看应用程序主页。 如果页面未正确加载,这是因为应用正在启动。 可以等待一段时间,稍后刷新页面。 应会看到应用程序的 pod 名称副本 (replica)显示在页面左上角(javaee-cafe-jcache-cluster-77d54bccd4-5xnzx
在本例中)。
在会话中的“新建咖啡”窗体中,为字段“名称”和“价格”设置值,然后选择“提交”。 几秒钟后,你将看到 “提交计数:1 ”显示在页面左下角。
若要演示会话缓存在应用程序的所有副本 (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 缓存实例发出命令。
从Azure 门户查找 Azure Redis 缓存实例。
选择 控制台 以打开 Redis 控制台。
运行以下命令以查看会话数据:
scan 0 count 1000 match '*' hgetall "com.ibm.ws.session.attr.default_host%2F"
从网页中搜索 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
后续步骤
可以从本指南中使用的参考资料中了解到更多信息:
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈