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

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

  • Open LibertyIBM WebSphere Liberty 运行时上运行 Java、Java EE、Jakarta EE 或 MicroProfile 应用程序。
  • 使用 Open Liberty 或 WebSphere Liberty 容器映像构建应用程序的 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.31.0。
  • 安装 Java Standard Edition (SE) 实施版本 17 或更高版本(例如 Eclipse Open J9)。
  • 安装 Maven 3.5.0 或更高版本。
  • 安装适用于 OS 的 Docker
  • 确保已安装 Git
  • 确保你已分配有订阅的 Owner 角色或 ContributorUser Access Administrator 角色。 你可以按照列出用户或组的角色分配中的步骤进行验证。

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

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

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

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

  2. 选择创建

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

    1. 创建新的资源组。 由于资源组在订阅中必须是唯一的,因此请选择一个唯一名称。 拥有唯一名称的一种简单方法是使用首字母缩写、今天的日期和一些标识符的组合(例如 ejb0913-java-liberty-project-rg)。

    2. 对于“区域”,请选择“中国东部 2”。

    3. 在 shell 中为群集和数据库的资源组名称创建环境变量:

      export RESOURCE_GROUP_NAME=<your-resource-group-name>
      

  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. 保存“登录服务器”、“注册表名称”、“用户名”和“密码”的值。 可以使用每个字段旁边的复制按钮,将值复制到剪贴板。

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

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

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

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

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

    • cmdToConnectToCluster
    • appDeploymentTemplateYaml(如果部署不包含应用程序)。 也就是说,你在部署市场产品/服务时为“部署应用程序?”选择了“”。
    • appDeploymentYaml(如果部署包含应用程序)。 也就是说,你为“部署应用程序?”选择了“”。

    appDeploymentTemplateYamlappDeploymentYaml 的值粘贴到 Bash shell中,追加 | grep secretName,然后运行命令。

    此命令的输出是入口 TLS 机密名称,例如 - secretName: secret785e2c。 保存 secretName 的值。

本文后面会用到这些值。 输出中列出了其他几个有用的命令。

创建 Azure SQL 数据库实例

若要创建用于应用的 Azure SQL 数据库单一数据库,请按照快速入门:在 Azure SQL 数据库中创建单一数据库中的步骤操作。 请仔细注意以下差异:

  • 在“基本信息”步骤中,记下“资源组”、“数据库名称”、“<server-name>.database.chinacloudapi.cn”、“服务器管理员登录名”和“密码”的值。 本文将数据库资源组值称为 <db-resource-group>

  • 在“网络”步骤中,将“连接方法”设置为“公用终结点”,将“允许 Azure 服务和资源访问此服务器”设置为“是”,将“当前客户端 IP 地址”设置为“是”

    屏幕截图:Azure 门户,其中显示了“创建 SQL 数据库”页的“网络”选项卡,突出显示了连接方法和防火墙规则设置。

注意

你为此数据库选择的无服务器计算层通过在处于非活动状态期间使数据库进入睡眠状态来节省资金。 如果当应用启动时数据库处于睡眠状态,则示例应用将失败。

若要强制数据库唤醒,可以使用查询编辑器运行查询。 请按照查询数据库中的步骤进行操作。 下面是一个示例查询:SELECT * FROM COFFEE;

然后,使用以下命令在 shell 中为数据库的资源组名称创建环境变量:

export DB_RESOURCE_GROUP_NAME=<db-resource-group>

创建数据库和 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 20240220

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

下面是应用程序的文件结构:

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ db-secret.yaml
│  │  ├─ openlibertyapplication-agic.yaml
│  │  ├─ openlibertyapplication.yaml
│  │  ├─ webspherelibertyapplication-agic.yaml
│  │  ├─ webspherelibertyapplication.yaml
│  ├─ docker/
│  │  ├─ Dockerfile
│  │  ├─ Dockerfile-wlp
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ pom.xml

目录“java”、“resources”和“webapp”包含示例应用程序的源代码 。 代码声明并使用名为 jdbc/JavaEECafeDB 的数据源。

aks 目录中有五个部署文件:

  • db-secret.xml:使用此文件创建包含数据库连接凭据的 Kubernetes 机密
  • openlibertyapplication-agic.yaml:使用此文件部署带 AGIC 的 Open Liberty 应用程序。 本文假定用户使用此文件。
  • openlibertyapplication.yaml:如果想要部署不带 AGIC 的 Open Liberty 应用程序,请使用此文件。
  • webspherelibertyapplication-agic.yaml:如果你在本文前面部分部署了 WebSphere Liberty Operator,请使用此文件部署带 AGIC 的 WebSphere Liberty 应用程序。
  • webspherelibertyapplication.yaml:如果你在本文前面部分部署了 WebSphere Liberty Operator,请使用此文件部署不带 AGIC 的 WebSphere Liberty 应用程序。

docker 目录中,有两个文件用于创建应用程序映像:

  • Dockerfile:在本文中,使用此文件构建带有 Open Liberty 的应用程序映像。
  • Dockerfile-wlp:如果你在本文前面部分部署了 WebSphere Liberty Operator,请使用此文件构建带有 WebSphere Liberty 的应用程序映像。

liberty/config 目录中,可以使用 server.xml 文件来配置 Open Liberty 和 WebSphere Liberty 群集的数据库连接。

生成项目

获得必要的属性后,便可生成应用程序。 项目的 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=<Azure-Container-Registry-Login-Server-URL>
export REGISTRY_NAME=<Azure-Container-Registry-name>
export USER_NAME=<Azure-Container-Registry-username>
export PASSWORD='<Azure-Container-Registry-password>'
export DB_SERVER_NAME=<server-name>.database.chinacloudapi.cn
export DB_NAME=<database-name>
export DB_USER=<server-admin-login>@<server-name>
export DB_PASSWORD='<server-admin-password>'
export INGRESS_TLS_SECRET=<ingress-TLS-secret-name>

mvn clean install

(可选)在本地测试项目

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

对于你的应用程序,可以使用任何其他机制(例如本地开发环境)执行类似操作。 还可以考虑使用用于容器开发的 liberty:devc 选项。 可以在 Open Liberty 文档中详细了解 liberty:devc

  1. 使用 liberty:run 启动应用程序。 liberty:run 还会使用先前定义的环境变量。

    cd $BASE_DIR/java-app
    mvn liberty:run
    
  2. 如果测试成功,命令输出中会显示类似于 [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds 的消息。 在浏览器中转到 http://localhost:9080/,验证应用程序是否可访问,所有功能是否正常运作。

  3. 选择 Ctrl+C 可停止。

为 AKS 部署生成映像

现在可以运行 docker build 命令来生成映像:

cd $BASE_DIR/java-app/target

docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile .

(可选)在本地测试 Docker 映像

在将 Docker 映像部署到 Azure 前,使用以下步骤在本地对其进行测试:

  1. 使用以下命令运行映像。 此命令会使用先前定义的环境变量。

    docker run -it --rm -p 9080:9080 \
       -e DB_SERVER_NAME=${DB_SERVER_NAME} \
       -e DB_NAME=${DB_NAME} \
       -e DB_USER=${DB_USER} \
       -e DB_PASSWORD=${DB_PASSWORD} \
       javaee-cafe:v1
    
  2. 容器启动后,在浏览器中转到 http://localhost:9080/ 以访问应用程序。

  3. 选择 Ctrl+C 可停止。

将映像上传到 Azure 容器注册表

将生成的映像上传到在产品/服务中创建的容器注册表实例:

docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker login -u ${USER_NAME} -p ${PASSWORD} ${LOGIN_SERVER}
docker push ${LOGIN_SERVER}/javaee-cafe:v1

部署并测试应用程序

使用以下步骤部署并测试应用程序:

  1. 连接到 AKS 群集。

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

  2. 应用数据库机密:

    cd $BASE_DIR/java-app/target
    kubectl apply -f db-secret.yaml
    

    输出为 secret/db-secret-sql created

  3. 应用部署文件:

    kubectl apply -f openlibertyapplication-agic.yaml
    
  4. 使用以下命令并等待所有 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
    
  5. 验证结果:

    1. 获取随应用程序一起部署的入口资源的地址:

      kubectl get ingress
      

      从输出复制 ADDRESS 值。 此值是已部署的应用程序网关实例的前端公共 IP 地址。

    2. 转到 https://<ADDRESS> 以测试应用程序。 为方便起见,此 shell 命令将创建一个环境变量,你可直接将该变量的值粘贴到浏览器中:

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

      如果网页未正确呈现或返回 502 Bad Gateway 错误,则表明应用仍在后台启动。 请等待几分钟,并重试。

清理资源

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

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

后续步骤

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