适用于:在 Windows Server 上运行的 AKS
本文演示如何:
- 在 Open Liberty 或 WebSphere Liberty 运行时运行 Java、Java EE、Jakarta EE 或 MicroProfile 应用程序。
- 使用 Open Liberty 容器映像构建应用程序 Docker 映像。
- 使用 Open Liberty Operator 将容器化应用程序部署到 Windows Server 上的 AKS 中的本地 AKS 群集。
Open Liberty Operator 简化了在 Kubernetes 群集上运行的应用程序的部署和管理。 利用 Open Liberty Operator,还可以执行更高级的操作,例如收集跟踪和转储。
有关 Open Liberty 的详细信息,请参阅 Open Liberty 项目页。 有关 IBM WebSphere Liberty 的详细信息,请参阅 WebSphere Liberty 产品页。
本文分为两个部分:
第 1 部分重点介绍如何在 Azure 中部署必要的项目。 此部署包括资源组和Azure 容器注册表。 若要执行这些任务,可以使用 Azure Cloud Shell (最简单),其中包括最新版本的 Azure CLI,也可以使用安装了以下工具的本地系统:
- 已安装类似于 Unix 的操作系统(例如 Ubuntu、macOS、适用于 Linux 的 Windows 子系统)。
- 按照前面的指南安装 Azure CLI。
- 安装 Java SE 实现(例如 AdoptOpenJDK OpenJDK 8 LTS/OpenJ9)。
- 安装 Maven 3.5.0 或更高版本。
- 安装适用于你的操作系统的 Docker。
第 2 部分重点介绍如何将应用程序从Azure 容器注册表向下部署到 AKS Arc 环境。 对于本部分,无法使用 Azure Cloud Shell。 对于 AKS Arc 环境,需要以下项:
- 至少有一个 Linux 工作器节点已启动并正在运行的 AKS 群集。
- 指向 AKS 群集的已配置本地
kubectl
环境。 可以使用 Get-AksHciCredential PowerShell 命令通过kubectl
访问群集。 - 已在系统上安装 Git 命令行工具。 在 Windows 系统上,可以使用 Git Bash 作为主控制台,并在 Git Bash 控制台中根据需要调用 PowerShell 和 Azure。
在 Azure 中创建资源组
Azure 资源组是在其中部署和管理 Azure 资源的逻辑组。
使用 az group create 命令时,可以在 eastus 位置创建名为“java-liberty-project”的资源组。 此资源组稍后用于创建Azure 容器注册表实例:
RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus
在 Azure 中创建容器注册表实例
使用 az acr create 命令创建Azure 容器注册表实例。 以下示例创建名为 youruniquecontainerregistryname 的容器注册表实例。 请确保 youruniquecontainerregistryname 在 Azure 中是唯一的:
REGISTRY_NAME=youruniquecontainerregistryname
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 中的容器注册表实例
必须先登录到容器注册表实例,然后才能将映像推送到该实例。 运行以下命令以验证连接。 记下登录详细信息。 稍后在连接到 AKS 时使用这些项:
LOGIN_SERVER=$(az acr show -n $REGISTRY_NAME --query 'loginServer' -o tsv)
USER_NAME=$(az acr credential show -n $REGISTRY_NAME --query 'username' -o tsv)
PASSWORD=$(az acr credential show -n $REGISTRY_NAME --query 'passwords[0].value' -o tsv)
echo $LOGIN_SERVER
echo $USER_NAME
echo $PASSWORD
docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD
如果已成功登录到容器注册表实例,则应在命令输出的末尾看到 “ 登录成功”。
在 Azure 中生成应用程序映像
若要在 AKS 群集上部署并运行 Liberty 应用程序,必须先使用 Open Liberty 容器映像 或 WebSphere Liberty 容器映像将应用程序容器化为 Docker 映像:
- 克隆本指南的示例代码。 该示例位于 GitHub 上。
- 将目录更改为本地克隆的
javaee-app-simple-cluster
。 - 运行
mvn clean package
来打包应用程序。 - 运行
mvn liberty:dev
来测试该应用程序。 如果命令成功,应会看到 defaultServer 服务器已准备好在命令输出中运行更智能的行星 。 使用 CTRL-C 停止应用程序。 - 运行以下命令之一来生成应用程序映像并将其推送到容器注册表实例:
如果您希望将 Open Liberty 用作轻量级的开源 Java 运行时,请使用 Open Liberty 的基础映像进行构建:
# Build and tag application image. This causes the Container Registry instance to pull the necessary Open Liberty base images. az acr build -t javaee-cafe-simple:1.0.0 -r $REGISTRY_NAME .
如果希望使用 Open Liberty 的商业版本,请使用 WebSphere Liberty 基础映像进行生成:
# Build and tag application image. This causes the Container Registry instance to pull the necessary WebSphere Liberty base images. az acr build -t javaee-cafe-simple:1.0.0 -r $REGISTRY_NAME --file=Dockerfile-wlp .
连接至你的 AKS 群集
若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 在 Windows 上安装后,可以从命令提示符、PowerShell 控制台和 Git Bash 运行 kubectl
。
作为先决条件,你需要将本地 kubectl
环境配置为指向你的 AKS 群集。 可以使用 Get-AksHciCredential PowerShell 命令通过 kubectl
访问群集:
Get-AksHciCredential -name AksHciClusterName
注意
上述命令使用 Kubernetes 配置文件的默认位置,即 %USERPROFILE%.kube。 可以使用参数为 Kubernetes 配置文件 -outputLocation
指定其他位置。
返回控制台,若要验证与群集的连接,请使用 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_NAMESPACE=default
WATCH_NAMESPACE='""'
# Install Custom Resource Definitions (CRDs) for OpenLibertyApplication
kubectl apply -f https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-crd.yaml
# Install cluster-level role-based access
curl -L https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-cluster-rbac.yaml \
| sed -e "s/OPEN_LIBERTY_OPERATOR_NAMESPACE/${OPERATOR_NAMESPACE}/" \
| kubectl apply -f -
# Install the operator
curl -L https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-operator.yaml \
| sed -e "s/OPEN_LIBERTY_WATCH_NAMESPACE/${WATCH_NAMESPACE}/" \
| kubectl apply -n ${OPERATOR_NAMESPACE} -f -
在 AKS 群集上部署应用程序
按照以下步骤在 AKS 群集上部署 Liberty 应用程序。 必须从 以前的会话中检索登录详细信息:
如果之前使用了 Azure Cloud Shell,并且现在使用单独的控制台连接到 AKS,则必须再次指定凭据:
LOGIN_SERVER=YourLoginServerFromEarlier USER_NAME=YourUsernameFromEarlier PASSWORD=YourPwdFromEarlier
创建拉取机密,以便对 AKS 群集进行身份验证,以便从容器注册表实例拉取映像:
kubectl create secret docker-registry acr-secret \ --docker-server=${LOGIN_SERVER} \ --docker-username=${USER_NAME} \ --docker-password=${PASSWORD}
同样,如果之前使用了 Azure Cloud Shell,并且现在使用单独的工具或会话连接到 AKS,则必须克隆本指南的示例代码。 该示例位于 GitHub 上。
在本地克隆中验证当前工作目录是否为 javaee-app-simple-cluster 。
运行以下命令,将 Liberty 应用程序与三个副本部署到 AKS 群集。 命令输出也以内联方式显示:
# Create OpenLibertyApplication "javaee-app-simple-cluster" cat openlibertyapplication.yaml | sed -e "s/\${Container_Registry_URL}/${LOGIN_SERVER}/g" | sed -e "s/\${REPLICAS}/3/g" | kubectl apply -f - openlibertyapplication.openliberty.io/javaee-app-simple-cluster created # Check if OpenLibertyApplication instance is created kubectl get openlibertyapplication javaee-app-simple-cluster NAME IMAGE EXPOSED RECONCILED AGE javaee-app-simple-cluster youruniquecontainerregistryname.azurecr.io/javaee-cafe-simple:1.0.0 True 59s # Check if deployment created by Operator is ready kubectl get deployment javaee-app-simple-cluster --watch NAME READY UP-TO-DATE AVAILABLE AGE javaee-app-simple-cluster 0/3 3 0 20s
等待,直到在 READY 列中看到 3/3,在 AVAILABLE 列中看到 3。 然后,可以使用 CTRL-C 停止
kubectl
监视过程。
测试应用程序
在应用程序运行时,Kubernetes 负载均衡器服务会将向 Internet 公开应用程序前端。 此进程可能需要一段时间才能完成。
若要监视进度,请将 kubectl get service 命令与 --watch
参数配合使用。
kubectl get service javaee-app-simple-cluster --watch
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
javaee-app-simple-cluster LoadBalancer 10.109.118.3 192.168.0.152 80:30580/TCP 68s
在 EXTERNAL-IP 地址从 pending 更改为实际公共 IP 地址后,请使用 CTRL-C 来停止 kubectl
监视进程。
打开 Web 浏览器,转到服务的外部 IP 地址(本示例中为 192.168.0.152 ),以查看应用程序主页。 你应该会看到应用程序副本的 Pod 名称显示在该页面的左上角。 等待几分钟,然后刷新页面,以查看由于 AKS 群集提供的负载均衡而显示的其他 Pod 名称。
注意
目前,该应用程序不使用 HTTPS。 应 使用自己的证书启用 TLS。
清理资源
若要避免 Azure 费用,应清除不需要的资源。 不再需要群集时,请使用 az group delete 命令删除资源组、容器注册表和相关 Azure 资源:
RESOURCE_GROUP_NAME=java-liberty-project
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
若要清理 AKS 上部署的资源,请从本地控制台运行以下命令:
kubectl delete -f https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-crd.yaml
kubectl delete -f https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-operator.yaml
kubectl delete -f openlibertyapplication.yaml
后续步骤
有关详细信息,请参阅本指南中使用的参考: