在 Azure Kubernetes Service (AKS) 群集上使用 Open Liberty 或 WebSphere Liberty 部署 Java 应用程序

本文演示了以下内容的操作方法:

  • Open LibertyIBM WebSphere Liberty 运行时上运行 Java、Java EE、Jakarta EE 或 MicroProfile 应用程序。
  • 使用 Open Liberty 或 WebSphere Liberty 容器映像,通过 az acr build 构建应用程序的 Docker 映像。
  • 使用 Open Liberty Operator 或 WebSphere Liberty Operator 将容器化应用程序部署到 Azure Kubernetes 服务 (AKS) 群集。

Open Liberty Operator 简化了在 Kubernetes 群集上运行的应用程序的部署和管理。 利用 Open Liberty Operator 或 WebSphere Liberty Operator,还可以执行更高级的操作,例如收集跟踪和转储。

本文使用适用于 Open Liberty 或 WebSphere Liberty 的 Azure 市场产品/服务来加速 AKS 之旅。 该产品/服务会自动预配多种 Azure 资源,包括:

  • AKS 群集。
  • 应用程序网关入口控制器 (AGIC) 实例。
  • Open Liberty Operator 和 WebSphere Liberty Operator。
  • (可选)包含 Liberty 和应用程序的容器映像。

如果想要有关在 AKS 上运行 Liberty 的手动分步指南,请参阅在 Azure Kubernetes 服务 (AKS) 群集上使用 Open Liberty 或 WebSphere Liberty 手动部署 Java 应用程序

本文旨在帮助你快速进行部署。 在进入生产环境之前,应浏览有关优化 Liberty 的 IBM 文档

如果你有兴趣提供反馈或与开发 WebSphere on Azure 解决方案的工程团队就迁移方案展开密切合作,请填写这份简短的有关 WebSphere 迁移的调查并提供联系人信息。 项目经理、架构师和工程师团队会及时与你联系,以开展密切合作。

先决条件

  • Azure 订阅。 如果没有 Azure 订阅,可在开始前创建一个试用帐户
  • 准备安装了 Unix 之类操作系统(如 Ubuntu、Azure Linux、macOS 或适用于 Linux 的 Windows 子系统)的本地计算机。
  • 安装 Azure CLI 以运行 Azure CLI 命令。
    • 使用 az login 命令登录 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录到 Azure
    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用和管理 Azure CLI 的扩展
    • 运行 az version 查看安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。 本文需要的 Azure CLI 最低版本为 2.61.0。
  • 安装 Java Standard Edition (SE) 实施版本 17(例如 Eclipse Open J9)。
  • 安装 Maven 3.9.8 或更高版本。
  • 确保已安装 Git
  • 确保你已分配有订阅的 Owner 角色或 ContributorUser Access Administrator 角色。 你可以按照列出用户或组的角色分配中的步骤进行验证。

使用门户在 AKS 部署上创建 Liberty

以下步骤将指导你在 AKS 上创建 Liberty 运行时。 完成这些步骤后,你将拥有一个容器注册表实例和一个用于部署容器化应用程序的 AKS 群集。

  1. 转到 Azure 门户。 在页面顶部的搜索框中,输入 WebSphere Liberty/Open Liberty on Kubernetes。 显示建议时,选择“市场”部分中唯一匹配的建议。

    如果愿意,可以直接转至产品/服务

  2. 选择创建

  3. 在“基本信息”窗格中:

    1. 创建新的资源组。 由于资源组在订阅中必须是唯一的,因此请选择一个唯一名称。 拥有唯一名称的一种简单方法是使用首字母缩写、今天的日期和一些标识符的组合(例如 ejb0913-java-liberty-project-rg)。 保存资源组名称,供后续在本文中使用。
    2. 对于“区域”,请选择“中国东部 2”。
  4. 选择下一步。 在 AKS 窗格中,你可以选择现有的 AKS 群集和容器注册表实例,而不是使部署创建新的 AKS 群集和容器注册表。 通过此选择,你能够利用 sidecar 模式,如 Azure 体系结构中心中所示。 你还可以调整 AKS 节点池中虚拟机的大小和数目的设置。

    在本文中,只需保留此窗格的所有默认设置即可。

  5. 选择下一步。 在“负载均衡”窗格的“连接到 Azure 应用程序网关?”旁边选择“”。 在此部分中,你可以自定义以下部署选项:

    • 对于“虚拟网络”和“子网”,可以选择性地自定义部署要将资源放置到的虚拟网络和子网。 不需要更改其余值,让其保留默认值即可。

    • 对于 TLS/SSL 证书,可以提供来自 Azure 应用程序网关的 TLS/SSL 证书。 将这些值保留为默认值,以使产品/服务生成自签名证书。

      不要通过自签名证书转到生产环境。 有关自签名证书的详细信息,请参阅创建自签名公共证书以对应用程序进行身份验证

    • 你可以选择“启用基于 Cookie 的相关性”,也称为粘滞会话。 本文使用粘滞会话,因此请务必选择此选项。

  6. 选择下一步。 在“操作员和应用程序”窗格中,本文全部使用默认值。 但是,可以自定义以下部署选项:

    • 通过为“IBM 支持的?”选项选择“”,你可以部署 WebSphere Liberty Operator。 保留默认值“否”将部署 Open Liberty Operator。
    • 通过为“部署应用程序?”选项选择“”,你可以为你选择的操作程序部署应用程序。 保留默认值“否”不会部署任何应用程序。
  7. 选择“查看 + 创建”以验证选择的选项。 在“查看 + 创建”窗格中,在验证通过后看到“创建”可用时,选择“创建”。

    部署最长可能需要花费 20 分钟。 在等待部署完成的过程中,可以按照 创建 Azure SQL 数据库实例部分中的步骤进行操作。 完成该部分后,请返回此处并继续。

从部署中捕获选择的信息

如果你已离开“部署正在进行”窗格,后续步骤将演示如何返回该页面。 如果你仍在显示了“部署已完成”的窗格中操作,请转到新建的资源组并跳到第三步。

  1. 在任何门户页面的一角,选择菜单按钮,然后选择“资源组”。

  2. 在包含文本“筛选任何字段”的框中,输入之前创建的资源组的前几个字符。 如果遵循了建议的约定,请输入缩写,然后选择相应的资源组。

  3. 在资源组的资源列表中,选择“类型”值为“容器注册表”的资源。

  4. 在导航窗格中的“设置”下,选择“访问密钥”。

  5. 保存“注册表名称”和“登录服务器”的值。 可以使用每个字段旁边的复制按钮,将值复制到剪贴板。

    注意

    本文使用 az acr build 命令生成 Docker 映像并将其推送到容器注册表,而无需使用容器注册表的 usernamepassword。 仍然可以将用户名和密码用于 docker logindocker push。 使用用户名和密码的安全性低于无密码身份验证。

  6. 返回到资源将部署到的资源组。

  7. 在“设置”部分,选择“部署”。

  8. 选择列表中最底部的部署。 “部署名称”与产品/服务的发布者 ID 匹配。 它包含字符串 ibm

  9. 在导航窗格中,选择“输出”。

  10. 使用与上述值相同的复制方法,保存以下输出的值:

    • cmdToConnectToCluster

    • appDeploymentTemplateYaml(如果部署不包含应用程序)。 也就是说,你在部署市场产品/服务时为“部署应用程序?”选择了“”。 本文选择了“否”。 但是,如果选择“是”,请保留 appDeploymentYaml 的值,其中包括应用程序部署。

      appDeploymentTemplateYamlappDeploymentYaml 的值粘贴到 Bash shell 中,然后运行命令。

      此命令的输出是应用程序部署 YAML。 使用关键字 secretName 查找入口 TLS 机密,例如 - secretName: secret785e2c。 保存 secretName 的值。

运行以下命令以设置在前面的步骤中捕获的环境变量。 稍后本文将使用这些环境变量。

export RESOURCE_GROUP_NAME=<your-resource-group-name>
export REGISTRY_NAME=<your-registry-nam-of-container-registry>
export LOGIN_SERVER=<your-login-server-of-container-registry>
export INGRESS_TLS_SECRET=<your-ingress-tls-secret-name>

创建 Azure SQL 数据库实例

在本节中,将创建一个 Azure SQL 数据库单一数据库,以便与应用一起使用。

首先,设置与数据库相关的环境变量。 将 <your-unique-sql-server-name> 替换为 Azure SQL 数据库服务器的唯一名称。

export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb

在终端中运行以下命令,以在 Azure SQL 数据库中创建单一数据库,并将当前登录用户设置为 Microsoft Entra 管理员。有关详细信息,请参阅快速入门:创建单一数据库 - Azure SQL 数据库

export ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)

az sql server create \
    --name $SQL_SERVER_NAME \
    --resource-group $RESOURCE_GROUP_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 \
    --server $SQL_SERVER_NAME \
    --name $DB_NAME \
    --edition GeneralPurpose \
    --compute-model Serverless \
    --family Gen5 \
    --capacity 2

然后,将本地 IP 地址添加到 Azure SQL 数据库服务器防火墙规则,以允许本地计算机稍后连接到数据库进行本地测试。

export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)
az sql server firewall-rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name AllowLocalIP \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS

注意

本文禁用 SQL 身份验证,以说明安全最佳做法。 Microsoft Entra ID 用于对与服务器的连接进行身份验证。 如果需要启用 SQL 身份验证,请参阅 az sql server create

使用服务连接器在 AKS 中创建服务连接

在本部分中,你将结合使用服务连接器和 Microsoft Entra Workload ID,在 AKS 群集与 Azure SQL 数据库之间创建服务连接。 通过此连接,AKS 群集无需使用 SQL 身份验证即可访问 Azure SQL 数据库。

首先,向之前部署的应用程序网关授予应用“Azure Service Connector Resource Provider”权限。 需要此步骤才能在 AKS 群集与 Azure SQL 数据库之间成功创建服务连接。

  1. 转到 Azure 门户,导航到之前创建的资源组。
  2. 在资源组的资源列表中,选择“类型”值为“应用程序网关”的资源。
  3. 选择“访问控制(IAM)”。 然后展开“添加”,并选择“添加角色分配”
  4. 在“角色”选项卡上,选择“特权管理员角色”。 然后选择“参与者”。 选择下一步
  5. 在“成员”选项卡上,选择“选择成员”。 然后,搜索“Azure Service Connector Resource Provider”应用。 选择该应用,然后选择“选择”。 选择下一步
  6. 选择“查看 + 分配”。 等待几秒钟,让角色分配完成。

然后运行以下命令,使用 Microsoft Entra Workload 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

注意

建议使用 Microsoft Entra Workload ID 来保护对 Azure SQL 数据库的访问,而无需使用 SQL 身份验证。 如果需要使用 SQL 身份验证,请忽略本部分之前的步骤,并使用用户名和密码连接到 Azure SQL 数据库。

设置数据库和 AKS 群集后,可以继续准备 AKS 以托管 Open Liberty 应用程序。

配置和部署示例应用程序

按照本部分中的步骤将示例应用程序部署到 Liberty 运行时。 这些步骤使用 Maven。

签出应用程序

克隆要在本文中使用的示例代码。 该示例位于 GitHub 上。

存储库中有一些示例。 本文使用 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 20241107

如果看到有关处于“拆离的 HEAD”状态的消息,可以放心地将其忽略。 该消息仅表示你签出了一个标签。

下面是应用程序的文件结构,其中包含重要文件和目录:

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ openlibertyapplication-agic-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-agic-passwordless-db.yaml 用于将应用程序映像与 AGIC 和无密码连接部署到 Azure SQL 数据库。 本文假定用户使用此文件。

在 docker 目录中,有两个文件用于使用 Open Liberty 或 WebSphere Liberty 创建应用程序映像。

在目录 liberty/config 中,server.xml 文件用于配置 Open Liberty 和 WebSphere Liberty 群集的数据库连接。 它定义了用于连接到 Azure SQL 数据库的变量 azure.sql.connectionstring

pom.xml 文件是包含项目的配置信息的 Maven 项目对象模型 (POM) 文件。 pom-azure-identity.xml 文件声明对 azure-identity 的依赖关系。 此文件用于使用 Microsoft Entra ID 向 Azure 服务进行身份验证。

注意

此示例使用 azure-identity 库通过 Microsoft Entra 身份验证向 Azure SQL 数据库进行身份验证。 如果需要在 Liberty 应用程序中使用 SQL 身份验证,请参阅与 JDBC 的关系数据库连接

生成项目

收集必要的属性后,请生成应用程序。 项目的 POM 文件从环境中读取多个变量。 在 Maven 生成中,这些变量用于填充位于 src/main/aks 中的 YAML 文件中的值。 如果需要,可以在 Maven 外部为应用程序执行类似操作。

cd $BASE_DIR/java-app
# The following variables are used for deployment file generation into the target.
export LOGIN_SERVER=${LOGIN_SERVER}
export SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}
export SC_SECRET_NAME=${SECRET_NAME}
export INGRESS_TLS_SECRET=${INGRESS_TLS_SECRET}

mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources

在本地测试项目

在部署到 Azure 之前,在本地运行和测试项目。 为方便起见,本文使用 liberty-maven-plugin。 若要了解有关 liberty-maven-plugin 的详细信息,请参阅 Open Liberty 文章使用 Maven 构建 Web 应用程序

注意

如果选择了“无服务器”数据库部署,请验证 SQL 数据库是否已进入暂停模式。 执行此操作的一种方法是登录数据库查询编辑器,如快速入门:使用 Azure 门户查询编辑器(预览版)查询 Azure SQL 数据库中所述。

  1. 使用 liberty:run 启动应用程序。

    cd $BASE_DIR/java-app
    
    # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by configuration variable `azure.sql.connectionstring` in server.xml
    export AZURE_SQL_CONNECTIONSTRING="jdbc:sqlserver://$SQL_SERVER_NAME.database.chinacloudapi.cn:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault"
    mvn liberty:run
    
  2. 验证应用程序是否按预期方式工作。 你应该会在命令输出中看到类似于 [INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 18.235 seconds. 的消息。 在浏览器中转到 http://localhost:9080/,验证应用程序是否可访问,所有功能是否正常运作。

  3. Ctrl+C 可停止。 如果系统要求终止批处理作业,请按 Y

完成后,请删除允许本地 IP 地址使用以下命令访问 Azure SQL 数据库的防火墙规则:

az sql server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name AllowLocalIP

为 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 应用程序:

  1. 连接到 AKS 群集。

    cmdToConnectToCluster 值粘贴到 shell 中,然后运行命令。

  2. 通过运行以下命令应用部署文件:

    cd $BASE_DIR/java-app/target
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication-agic-passwordless-db.yaml
    
  3. 使用以下命令并等待所有 Pod 成功重启:

    kubectl get pods --watch
    

    如下所示的输出指示所有 Pod 正在运行:

    NAME                                       READY   STATUS    RESTARTS   AGE
    javaee-cafe-cluster-agic-67cdc95bc-2j2gr   1/1     Running   0          29s
    javaee-cafe-cluster-agic-67cdc95bc-fgtt8   1/1     Running   0          29s
    javaee-cafe-cluster-agic-67cdc95bc-h47qm   1/1     Running   0          29s
    

测试应用程序

运行 Pod 时,可以使用应用程序网关实例的公共 IP 地址测试应用程序。

运行以下命令,以获取并显示应用程序网关实例的公共 IP 地址,该地址由 AGIC 创建的入口资源公开:

export APP_URL=https://$(kubectl get ingress | grep javaee-cafe-cluster-agic-ingress | cut -d " " -f14)/
echo $APP_URL

复制 URL 并在浏览器中打开,以查看应用程序主页。 如果网页未正确呈现或返回 502 Bad Gateway 错误,则表明应用仍在后台启动。 请等待几分钟,并重试。

Java Liberty 应用程序已成功部署在 AKS 上的屏幕截图。

清理资源

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

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

后续步骤

可以通过以下参考资料了解更多信息: