本文提供了有关如何在 Azure 上手动部署 Open/WebSphere Liberty 的分步指南。
具体而言,本文介绍如何完成以下任务:
- 在 Open Liberty 或 WebSphere Liberty 运行时上运行 Java、Java Enterprise Edition(EE)、Jakarta EE 或 MicroProfile 应用程序。
- 使用 Liberty 容器映像生成应用程序 Docker 映像
az acr build
。 - 使用 Liberty 运算符将容器化应用程序部署到 Azure Kubernetes 服务 (AKS) 群集。
Liberty Operator 简化了 Kubernetes 群集上运行的应用程序的部署和管理。 利用 Open Liberty Operator 或 WebSphere Liberty Operator,还可以执行更高级的操作,例如收集跟踪和转储。
有关使用 Azure 门户上提供的市场解决方案来加速您使用 AKS 的过程的更自动化解决方案,请参阅在 Azure Kubernetes 服务(AKS)群集上使用 Open Liberty/WebSphere Liberty 部署 Java 应用程序。
有关 Open Liberty 的详细信息,请参阅 Open Liberty 项目页。 有关 IBM WebSphere Liberty 的详细信息,请参阅 WebSphere Liberty 产品页。
本文旨在帮助你快速进行部署。 在进入生产环境之前,应探索 Tuning Liberty。
如果你有兴趣提供反馈或与开发 WebSphere on Azure 解决方案的工程团队就迁移方案展开密切合作,请填写这份简短的有关 WebSphere 迁移的调查并提供联系人信息。 项目经理、架构师和工程师团队会及时与你联系,以开展密切合作。
先决条件
- Azure 订阅。 如果还没有 Azure 订阅,可以在开始前创建一个免费帐户。
- Azure CLI 版本 2.71.0+
- Java Standard Edition (SE),版本 17 - 例如 Eclipse Open J9。
- Maven 版本 3.5.0+
- Git
- Azure 订阅中的
Owner
角色或Contributor
和User Access Administrator
角色。 可以使用使用 Azure 门户列出 Azure 角色分配中的步骤来验证分配。
登录 Azure
如果尚未执行此操作,请使用以下步骤登录 Azure 订阅:
打开 Azure CLI 或 PowerShell,然后使用
az login
登录。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录到 Azure。注意
如果多个 Azure 租户与你的 Azure 凭据关联,必须指定要登录到哪个租户。 可以使用
--tenant
选项指定租户,例如az login --tenant contoso.onmicrosoft.com
。通过使用
az version
查找已安装的版本和依赖库。使用
az upgrade
.. 升级到最新版本。
注意
使用 Azure CLI 时,如果系统提示你安装 Azure CLI 扩展,请执行此作。 有关扩展详细信息,请参阅使用和管理 Azure CLI 的扩展。
可以在 PowerShell 中运行大多数 Azure CLI 命令,就像在 Bash 中一样。 仅当使用变量时才存在差异。 在以下各节中,需要时将在不同的选项卡中解决差异。
创建资源组
Azure 资源组是用于部署和管理 Azure 资源的逻辑组。
使用az group create
在eastus2
位置创建一个名为java-liberty-project
的资源组。 此资源组稍后用于创建Azure 容器注册表实例和 AKS 群集。
export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --___location eastus2
创建容器注册表实例
用于 az acr create
创建容器注册表实例。 以下示例创建名为 <your-unique-ACR-name>
的容器注册表实例。 将此占位符替换为在 Azure 中唯一的值。
注意
本文使用适用于 Azure 容器注册表的建议无密码身份验证机制。 在使用 docker login
获取用户名和密码后,仍然可以在 az acr credential show
中使用用户名和密码。 使用用户名和密码比无密码身份验证更不安全。
export REGISTRY_NAME=<your-unique-ACR-name>
az acr create \
--resource-group $RESOURCE_GROUP_NAME \
--name $REGISTRY_NAME \
--sku Basic
很快,你应该会在 JSON 输出中看到以下行:
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "java-liberty-project",
检索容器注册表实例的登录服务器名称。 稍后将应用程序映像部署到 AKS 群集时,需要此值。
export LOGIN_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv)
创建 AKS 群集
用于 az aks create
创建 AKS 群集,如以下示例所示。 此示例创建一个名为一个节点的 AKS 群集 myAKSCluster
,并将容器注册表实例附加到该群集。 该命令需要几分钟才能完成。
export CLUSTER_NAME=myAKSCluster
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--node-vm-size Standard_DS2_V2 \
--generate-ssh-keys \
--enable-managed-identity \
--attach-acr $REGISTRY_NAME
命令完成后,它将返回有关群集的 JSON 格式信息,包括以下输出:
"nodeResourceGroup": "MC_java-liberty-project_myAKSCluster_eastus2",
"privateFqdn": null,
"provisioningState": "Succeeded",
"resourceGroup": "java-liberty-project",
连接到 AKS 群集
使用以下步骤管理 Kubernetes 群集:
使用
az aks install-cli
安装kubectl
(Kubernetes 命令行客户端),如以下示例所示:az aks install-cli
使用
az aks get-credentials
配置kubectl
以连接到 Kubernetes 群集。 此命令下载凭据并将 Kubernetes CLI 配置为使用这些凭据,如以下示例所示:注意
该命令使用 Kubernetes 配置文件的默认位置,即 ~/.kube/config。可以使用 为 Kubernetes 配置文件
--file
指定其他位置。az aks get-credentials \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --overwrite-existing \ --admin
通过使用
kubectl get
返回群集节点列表来验证与群集的连接,如以下示例所示:kubectl get nodes
以下示例输出显示在上一步创建的单个节点。 确保节点的状态为
Ready
:NAME STATUS ROLES AGE VERSION aks-nodepool1-xxxxxxxx-yyyyyyyyyy Ready <none> 76s v1.29.9
创建 Azure SQL 数据库
使用以下步骤为应用创建 Azure SQL 数据库单一数据库:
使用以下命令设置与数据库相关的环境变量。 替换为
<your-unique-sql-server-name>
Azure SQL 数据库服务器的唯一名称。export SQL_SERVER_NAME=<your-unique-sql-server-name> export DB_NAME=demodb
使用以下命令创建单个数据库,并将当前登录用户设置为 Microsoft Entra 管理员。有关详细信息,请参阅 快速入门:创建单一数据库 - Azure SQL 数据库。
export ENTRA_ADMIN_NAME=$(az account show \ --query user.name \ --output tsv) az sql server create \ --resource-group $RESOURCE_GROUP_NAME \ --name $SQL_SERVER_NAME \ --enable-ad-only-auth \ --external-admin-principal-type User \ --external-admin-name $ENTRA_ADMIN_NAME \ --external-admin-sid $(az ad signed-in-user show --query id --output tsv) az sql db create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_NAME \ --server $SQL_SERVER_NAME \ --edition GeneralPurpose \ --compute-model Serverless \ --family Gen5 \ --capacity 2
注意
为安全注意事项创建禁用 SQL 身份验证的 Azure SQL Server。 仅Microsoft Entra ID 用于向服务器进行身份验证。 有关启用 SQL 身份验证的详细信息,请参阅 az sql server create
。
使用服务连接器在 AKS 中创建服务连接
使用以下命令通过服务连接器使用 Microsoft Entra 工作负荷 ID 在 AKS 群集与 SQL 数据库之间创建连接。 有关详细信息,请参阅 使用服务连接器在 AKS 中创建服务连接。
# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
# Install the Service Connector passwordless extension
az extension add \
--name serviceconnector-passwordless \
--upgrade \
--allow-preview true
# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--query id \
--output tsv)
export AZURE_SQL_SERVER_RESOURCE_ID=$(az sql server show \
--resource-group $RESOURCE_GROUP_NAME \
--name $SQL_SERVER_NAME \
--query id \
--output tsv)
# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${USER_ASSIGNED_IDENTITY_NAME}
# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${USER_ASSIGNED_IDENTITY_NAME} \
--query id \
--output tsv)
# Create a service connection between your AKS cluster and your SQL database using Microsoft Entra Workload ID
az aks connection create sql \
--connection akssqlconn \
--client-type java \
--source-id $AKS_CLUSTER_RESOURCE_ID \
--target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \
--workload-identity $UAMI_RESOURCE_ID
排查错误消息
az aks connection create sql
如果命令生成错误消息,请在以下列表中找到错误消息,然后使用说明排查问题:
Dependency pyodbc can't be installed, please install it manually
此错误消息指示
pyodbc
无法安装包,很可能是因为权限问题。 使用以下步骤修复问题:运行以下命令,查找适用于 Azure CLI 的 Python 位置:
az --version
输出应包含
Python ___location
- 例如Python ___location '/opt/az/bin/python3'
。复制
Python ___location
值。使用以下命令在
sudo
模式下安装pyodbc
包。 将<python-___location>
替换为在上一步中复制的 Python 位置。sudo <python-___location> -m pip install pyodbc
libodbc.so:无法打开共享对象文件:没有此类文件或目录
请手动安装 ODBC 17/18 for SQL Server
这些错误指示
odbc
未安装驱动程序。 使用以下步骤修复问题:注意
应使用 Microsoft Entra 工作负荷 ID 来保护对 Azure SQL 数据库的访问,而无需使用 SQL 身份验证。 如果需要使用 SQL 身份验证,请忽略本部分中的步骤,并使用用户名和密码连接到 Azure SQL 数据库。
如果使用 Linux,请打开“安装适用于 SQL Server 的 Microsoft ODBC 驱动程序”(Linux)。 如果使用 MacOS,请打开“安装适用于 SQL Server 的 Microsoft ODBC 驱动程序”(macOS)。
按照说明安装 SQL Server Microsoft ODBC 驱动程序(18 或 17)。
再次用于
az aks connection create sql
创建服务连接,如以下示例所示:az aks connection create sql \ --connection akssqlconn \ --client-type java \ --source-id $AKS_CLUSTER_RESOURCE_ID \ --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \ --workload-identity $UAMI_RESOURCE_ID
获取服务连接器创建的服务帐户和机密
若要使用 Azure SQL 数据库进行身份验证,请使用以下步骤:
按照教程的“ 更新容器 ”部分中的说明获取服务帐户和服务连接器创建的机密 :将 AKS 应用连接到 Azure SQL 数据库。 使用此选项使用提供的 YAML 示例代码片段直接创建部署。
注意
服务连接器创建的机密包含一个
AZURE_SQL_CONNECTIONSTRING
值,该值是 Azure SQL 数据库的无密码连接字符串。 有关详细信息,请参阅将 Azure SQL 数据库与服务连接器集成的用户分配的托管标识部分中的示例值。从示例 Kubernetes 部署 YAML 中的突出显示部分复制
serviceAccountName
和secretRef.name
值,如以下示例所示:serviceAccountName: <service-account-name> containers: - name: raw-linux envFrom: - secretRef: name: <secret-name>
使用以下命令定义环境变量。 请务必将
<service-account-name>
和<secret-name>
替换为在上一步中复制的值:export SERVICE_ACCOUNT_NAME=<service-account-name> export SECRET_NAME=<secret-name>
下一部分中使用这些值将 Liberty 应用程序部署到 AKS 群集。
安装 Open Liberty Operator
在本部分中,将在 AKS 群集上安装 Open Liberty 运算符来托管 Liberty 应用程序。
使用以下命令安装 Open Liberty 运算符 :
注意
本指南将指导您安装 Open Liberty 操作员。 若要使用 WebSphere Liberty Operator,请参阅使用 Kubernetes CLI 安装 WebSphere Liberty Operator。
# Install cert-manager Operator
export CERT_MANAGER_VERSION=v1.11.2
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml
# Install the Open Liberty Operator
export OPERATOR_VERSION=1.4.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
# Remove the downloaded files
rm -rf overlays base
配置并生成应用程序映像
若要在 AKS 群集上部署并运行 Liberty 应用程序,请使用 Open Liberty 映像 或 WebSphere Liberty 容器映像将应用程序容器化为 Docker 映像。
按照本部分中的步骤将示例应用程序部署到 Liberty 运行时。 这些步骤使用 Maven。
签出应用程序
使用以下命令克隆本指南的示例代码。 此示例位于 Azure Kubernetes 服务示例 GitHub 存储库上的 Open Liberty/WebSphere Liberty 中,其中包含一些示例。 本文使用 java-app
示例。
git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
export BASE_DIR=$PWD
git checkout 20250424
如果看到有关处于 detached HEAD
状态的消息,可以放心忽略该消息。 这只标识你签出了一个标签。 克隆存储库将创建以下文件结构:
java-app
├─ src/main/
│ ├─ aks/
│ │ ├─ openlibertyapplication-passwordless-db.yaml
│ ├─ docker/
│ │ ├─ Dockerfile
│ │ ├─ Dockerfile-wlp
│ ├─ liberty/config/
│ │ ├─ server.xml
│ ├─ java/
│ ├─ resources/
│ ├─ webapp/
├─ pom.xml
├─ pom-azure-identity.xml
目录“java”、“resources”和“webapp”包含示例应用程序的源代码 。 代码声明并使用名为 jdbc/JavaEECafeDB
的数据源。
在 aks 目录中,文件 openlibertyapplication-passwordless-db.yaml 用于部署应用程序映像。 在 docker 目录中,有两个文件用于使用 Open Liberty 或 WebSphere Liberty 创建应用程序映像。
在 liberty/config 目录中,server.xml 文件用于配置 Open Liberty 和 WebSphere Liberty 群集的数据库连接。 它定义 azure.sql.connectionstring
用于连接到 Azure SQL 数据库的变量。
pom.xml文件是包含项目的配置信息的 Maven 项目对象模型 (POM) 文件。 pom-azure-identity.xml 文件声明 azure-identity
依赖项,该依赖项用于使用 Microsoft Entra ID 向 Azure 服务进行身份验证。
注意
此示例使用 azure-identity
库通过 Microsoft Entra 身份验证向 Azure SQL 数据库进行身份验证,出于安全考虑建议这样做。 有关在 Liberty 应用程序中使用 SQL 身份验证的详细信息,请参阅与 Java 数据库连接的关系数据库连接(JDBC)。
生成项目
收集必要的属性后,请使用以下命令生成应用程序。 项目的 POM 文件从环境中读取多个变量。 在 Maven 生成中,这些变量用于填充位于 src/main/aks 中的 YAML 文件中的值。 如果需要,可以在 Maven 外部为应用程序执行类似操作。
cd $BASE_DIR/java-app
# The following variables are used for deployment file generation into target/
export LOGIN_SERVER=${LOGIN_SERVER}
export SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}
export SC_SECRET_NAME=${SECRET_NAME}
mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources
为 AKS 部署生成映像
使用 az acr build
生成映像,如以下示例所示:
cd $BASE_DIR/java-app/target
az acr build \
--registry ${REGISTRY_NAME} \
--image javaee-cafe:v1 \
.
该 az acr build
命令将 Dockerfile 中指定的项目上传到容器注册表实例,生成映像,并将其存储在容器注册表实例中。
将应用程序部署到 AKS 群集
使用以下步骤在 AKS 群集上部署 Liberty 应用程序:
使用以下命令应用部署文件:
cd $BASE_DIR/java-app/target # Apply deployment file kubectl apply -f openlibertyapplication-passwordless-db.yaml
使用以下命令确定是否创建
OpenLibertyApplication
实例:kubectl get openlibertyapplication javaee-cafe-cluster --watch
以下输出是典型的。 使用 Ctrl+C 退出。
NAME IMAGE EXPOSED RECONCILED RESOURCESREADY READY WARNING AGE javaee-cafe-cluster <registry-name>.azurecr.io/javaee-cafe:v1 True True True 57s
使用以下命令确定作员创建的部署是否已准备就绪:
kubectl get deployment javaee-cafe-cluster --watch
以下输出是典型的:
NAME READY UP-TO-DATE AVAILABLE AGE javaee-cafe-cluster 0/3 3 0 20s
等到在
3/3
列下方看到READY
,在3
列下方看到AVAILABLE
,然后使用 Ctrl+C 停止kubectl
监视进程。
测试应用程序
在应用程序运行时,Kubernetes 负载均衡器服务会将向 Internet 公开应用程序前端。 此过程可能需要一些时间才能完成。
用于 kubectl get service
在服务可用时获取服务的外部 IP 地址,如以下示例所示:
export APP_URL=http://$(kubectl get service javaee-cafe-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $APP_URL
注意
如果没有从输出中看到有效的 URL,请等待一段时间,然后再次运行该命令。
在 Web 浏览器中打开 URL 并检查应用程序主页。 如果页面加载不正确,请在应用启动时稍后刷新页面。 你应该会看到应用程序副本的 Pod 名称显示在该页面的左上角。 请等待几分钟并刷新该页面,以查看由于 AKS 群集提供的负载均衡而显示的不同的 Pod 名称。
注意
目前,该应用程序不使用 HTTPS。 建议使用自己的证书启用传输层安全性(TLS)。 有关详细信息,请参阅将 TLS 用于 Azure Kubernetes 服务 (AKS) 上的入口控制器。
清理资源
若要避免 Azure 费用,应清除不需要的资源。 不再需要群集时,用于 az group delete
删除资源组、容器服务、容器注册表、数据库和所有相关资源。
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
后续步骤
可以从本指南中使用的以下参考了解详细信息:
- 什么是 Azure Kubernetes 服务 (AKS)?
- 教程:将 AKS 应用连接到 Azure SQL 数据库
- 将Azure SQL 数据库与服务连接器集成
- 使用 Microsoft Entra 身份验证进行连接
- Open Liberty
- Open Liberty 运算符
- Open Liberty Server 配置概述
- Liberty Maven 插件
- 开放自由图像
- WebSphere Liberty 容器映像
若要将 Azure Cache for Redis 整合到 Java 应用中,请参阅快速入门:在 Java 中使用 Azure Cache for Redis 和 Redisson Redis 客户端。
要了解在 Azure 上运行 WebSphere 产品的选项,请参阅在 Azure 上运行 WebSphere 系列产品的解决方案有哪些?