在 Azure Kubernetes 服务 (AKS) 群集上手动部署具有 Open Liberty 或 WebSphere Liberty 的 Java 应用程序

本文提供在 Azure 上运行 Open/WebSphere Liberty 的分步手动指南。

具体而言,本文介绍如何完成以下任务:

  • 在 Open Liberty 或 WebSphere Liberty 运行时运行 Java、Java EE、Jakarta EE 或 MicroProfile 应用程序。
  • 使用 Liberty 容器映像生成应用程序 Docker 映像。
  • 使用 Liberty 运算符将容器化应用程序部署到 Azure Kubernetes 服务 (AKS) 群集。

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

有关加速 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 订阅,可以在开始前创建一个免费帐户
  • 准备安装了 Windows、macOS 或 Linux 的本地计算机。
  • 安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI
  • 出现提示时,请在首次使用时安装 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 角色。 可以使用Azure 门户按照列出 Azure 角色分配中的步骤来验证分配。

注意

还可以从 Azure Cloud Shell 运行本文中的命令。 此方法预安装了所有必备工具,但 Docker 除外。

登录 Azure

如果尚未这样做,请使用 az login 命令登录到 Azure 订阅,并按照屏幕上的说明进行操作。

az login

注意

可以在 PowerShell 中运行大多数 Azure CLI 命令,与 Bash 中的命令相同。 仅当使用变量时才存在差异。 在以下部分中,需要在不同的选项卡中解决差异。

如果有多个 Azure 租户与 Azure 凭据相关联,则必须指定要登录的租户。 可以使用此选项 --tenant 执行此操作。 例如 az login --tenant contoso.onmicrosoft.com

创建资源组

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",

连接到该 ACR 实例

需要先登录到 ACR 实例,然后才能将映像推送到该实例。 运行以下命令验证连接:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

如果成功登录到 ACR 实例,则应在命令输出末尾看到 Login Succeeded

创建 AKS 群集

使用 az aks create 命令创建 AKS 群集。 以下示例创建一个具有一个节点的名为 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

数分钟后,命令完成并返回有关群集的 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 \
    --admin

注意

以上命令使用 Kubernetes 配置文件的默认位置,即 ~/.kube/config。 可以使用 为 Kubernetes 配置文件 --file指定其他位置。

若要验证与群集的连接,请使用 kubectl get 命令返回群集节点列表。

kubectl get nodes

以下示例输出显示在上一步创建的单个节点。 请确保节点的状态为 Ready

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.23.8

创建 Azure SQL 数据库

在本部分中,将创建一个Azure SQL 数据库单一数据库,用于应用。

按照快速入门中的 Azure CLI 或 PowerShell 步骤在 Azure SQL 数据库 中创建单一数据库:创建Azure SQL 数据库单一数据库。 浏览文章时,请使用以下说明,然后在创建和配置数据库服务器后返回到本文档。

  1. 到达快速入门的“设置参数值”部分时,请复制并保存标记Variable block的代码示例中所有变量的值,包括locationresourceGroupdatabaseserverloginpassword。 本文将数据库resourceGroup<db-resource-group>称为 .

  2. 创建数据库服务器后,转到Azure 门户中新建的服务器。 在“网络”窗格中的“连接”选项卡下,将最低 TLS 版本设置为 TLS 1.0

    配置 SQL 数据库网络 TLS 1.0 的屏幕截图。

  3. 在“网络”窗格中的“公共访问”选项卡下,选择“允许 Azure 服务和资源访问此服务器”。

    防火墙规则的屏幕截图 - 允许 Azure 资源访问。

  4. 如果要在本地测试应用程序,请确保客户端 IPv4 地址位于防火墙规则的 允许列表中

    防火墙规则的屏幕截图 - 允许客户端访问。

  5. 保存网络更改。

  6. 使用以下命令为数据库的资源组名称创建环境变量:

    export DB_RESOURCE_GROUP_NAME=<db-resource-group>
    

创建数据库和 AKS 群集后,可以准备 AKS 来托管 Liberty。

安装 Open Liberty Operator

创建并连接到群集后,请安装 Open Liberty Operator。

运行以下命令安装 Open Liberty 运算符

# 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

配置并生成应用程序映像

若要在 AKS 群集上部署并运行 Liberty 应用程序,请使用 Open Liberty 容器映像WebSphere Liberty 容器映像将应用程序容器化为 Docker 映像。

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

签出应用程序

克隆本指南的示例代码。 该示例位于 GitHub 上。 存储库中有一些示例。 本文使用 java-app。 下面是应用程序的文件结构。

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20230830

如果看到消息显示正处于“拆离的 HEAD”状态,可以放心地忽略此消息。 这只标识你签出了一个标签。

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

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

aks 目录中,有两个部署文件。 db-secret.xml 用于创建包含数据库连接凭据的 Kubernetes Secret。 openlibertyapplication.yaml 文件用于部署应用程序映像。 在 docker 目录中,有两个文件用于使用 Open Liberty 或 WebSphere Liberty 创建应用程序映像。

在目录 自由/配置中, server.xml 用于配置 Open Liberty 和 WebSphere Liberty 群集的数据库连接。

生成项目

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

cd <path-to-your-repo>/java-app

# The following variables are used for deployment file generation into target/
export LOGIN_SERVER=${LOGIN_SERVER}
export REGISTRY_NAME=${REGISTRY_NAME}
export USER_NAME=${USER_NAME}
export PASSWORD=${PASSWORD}
export DB_SERVER_NAME=<Server name>.database.windows.net
export DB_NAME=<Database name>
export DB_USER=<Server admin login>@<Server name>
export DB_PASSWORD=<Server admin password>

mvn clean install

(可选)在本地测试项目

现在可以在部署到 Azure 之前,在本地运行和测试项目。 为方便起见,请使用 liberty-maven-plugin. 如需详细了解 liberty-maven-plugin,请参阅使用 Maven 构建 Web 应用程序。 对于应用程序,可以使用任何其他机制(如本地 IDE)执行类似操作。 还可以考虑使用用于容器开发的 liberty:devc 选项。 可以在 Liberty 文档中详细了解 liberty:devc

注意

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

  1. 使用 liberty:run 启动应用程序。 liberty:run 使用上一步中定义的环境变量。

    cd <path-to-your-repo>/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 buildx build 命令来生成映像,如以下示例所示:

cd <path-to-your-repo>/java-app/target

# If you are running with Open Liberty
docker buildx --platform linux/amd64 build -t javaee-cafe:v1 --pull --file=Dockerfile .

# If you are running with WebSphere Liberty
docker buildx --platform linux/amd64 build -t javaee-cafe:v1 --pull --file=Dockerfile-wlp .

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

现在,可以在部署到 Azure 前使用以下步骤在本地测试 Docker 映像。

  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 可停止。

向 ACR 上传映像

接下来,将生成的映像上传到在前面的步骤中创建的 ACR。

如果尚未执行此操作,请使用以下命令登录到容器注册表:

docker login -u ${USER_NAME} -p ${PASSWORD} ${LOGIN_SERVER}

使用以下命令标记和推送容器映像:

docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker push ${LOGIN_SERVER}/javaee-cafe:v1

将应用程序部署到 AKS 群集

使用以下步骤在 AKS 群集上部署 Liberty 应用程序:

  1. 将 ACR 实例附加到 AKS 群集,以便 AKS 群集经过身份验证,以便从 ACR 实例拉取映像,如以下示例所示:

    az aks update \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --attach-acr $REGISTRY_NAME
    
  2. 通过运行以下命令应用数据库机密和部署文件:

    cd <path-to-your-repo>/java-app/target
    
    # Apply database secret
    kubectl apply -f db-secret.yaml
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication.yaml
    
  3. OpenLibertyApplication通过运行以下命令确定是否创建实例:

    kubectl get openlibertyapplication javaee-cafe-cluster
    

    应会看到与如下示例类似的输出:

    NAME                        IMAGE                                                   EXPOSED   RECONCILED   AGE
    javaee-cafe-cluster         youruniqueacrname.azurecr.io/javaee-cafe:1.0.25         True         59s
    
  4. 运行以下命令,确定操作员创建的部署是否已准备就绪:

    kubectl get deployment javaee-cafe-cluster --watch
    

    应会看到与如下示例类似的输出:

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-cluster         0/3     3            0           20s
    
  5. 等到列下和3列下AVAILABLEREADY看到3/3,然后使用 Ctrl+C 停止kubectl监视过程。

测试应用程序

在应用程序运行时,Kubernetes 负载均衡器服务会将向 Internet 公开应用程序前端。 此进程可能需要一段时间才能完成。

若要监视进度,请使用带参数的 --watch kubectl get service 命令,如以下示例所示:

kubectl get service javaee-cafe-cluster --watch

应会看到与如下示例类似的输出:

NAME                        TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-cluster         LoadBalancer   10.0.251.169   52.152.189.57   80:31732/TCP     68s

当 EXTERNAL-IP 地址从挂起更改为实际公共 IP 地址后,使用 Ctrl+C 停止kubectl监视过程。

如果在执行本部分中的步骤与前面的步骤之间经过了一段时间,请确保数据库处于活动状态(如有必要)。 请参阅有关数据库暂停的上一条说明。

打开 Web 浏览器访问服务的外部 IP 地址(上面示例中的 52.152.189.57),以查看应用程序主页。 如果页面未正确加载,这是因为应用正在启动。 可以等待一段时间,稍后刷新页面。 你应该会看到应用程序副本的 Pod 名称显示在该页面的左上角。 请等待几分钟并刷新该页面,以查看由于 AKS 群集提供的负载均衡而显示的不同的 Pod 名称。

Java liberty 应用程序已成功部署到 AKS 上。

注意

目前,应用程序不使用 HTTPS。 建议使用自己的证书启用 TLS。 有关详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 上将 TLS 与入口控制器配合使用。

清理资源

若要避免 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

后续步骤

可以从本指南中使用的参考资料中了解到更多信息:

若要将 Azure Redis 缓存合并到 Java 应用中,请参阅 将 Java 中的 Azure Redis 缓存与 Reis Redis 客户端配合使用。

若要浏览在 Azure 上运行 WebSphere 产品的选项,请参阅 在 Azure 上运行 WebSphere 产品系列的解决方案是什么?