通过 Azure Application Services 部署到 Azure Arc,第 3 部分:部署多云 Azure App Service Web 应用





5.00/5 (2投票s)
在本文中,我们将学习如何将用 Java 编写的 Azure 应用服务 Web 应用部署到另一个云服务中托管的 Arc 托管 Kubernetes 集群。
本文将详细介绍如何将用 Java 编写的 Azure 应用服务 Web 应用部署到另一个云服务中托管的 Arc 托管 Kubernetes 集群的步骤。
本文演示了如何:
- 预配应用服务 Kubernetes 环境
- 将 Java Web 应用部署到 Google Cloud 上支持 Arc 的集群
最后,它演示了我们的 Azure 应用正在 Google Cloud 上运行,同时由 Azure 进行管理。
这些说明针对 Windows 上的 PowerShell,但只需少量额外工作即可在 Bash 中重新创建。它们也被分解以帮助理解过程。但是,在生产中,它们可以编译成一个更简洁的脚本。
必备组件
此演示使用
- Azure CLI
- Java 11
- Maven
- Azure 订阅(提供免费试用)
如果您不熟悉 Azure 中的 Java 和 Web 应用,我们建议您阅读 Azure 应用服务文档。
本系列的第一篇文章提醒我们如何将 Azure Arc 连接到 Google Cloud 上的 Kubernetes。在开始之前,让我们进行一些检查,以确保一切都保持原样。请记住要考虑您可能进行的任何命名更改。
首先,确认您的 Azure 订阅中存在名为 arc-rg
的资源组。
(请注意,在预览版中,Azure Arc 的资源组必须位于西欧或美国东部。)
然后确认 Kubernetes 提供商的注册
az provider show -n Microsoft.Kubernetes --query registrationState -tsv
az provider show --namespace Microsoft.KubernetesConfiguration --query registrationState -o tsv
接下来,确认连接的 Azure Arc 资源 k8s-gke
存在于资源组中。
此外,确认您有 kubeconfig
条目来验证 GKE 集群。
检查 azure-arc
是否为 Active
kubectl get namespace
接下来,验证是否已部署 Azure Arc Kubernetes 代理
kubectl get pods -n azure-arc
它们都应显示为正在运行。
然后使用以下命令验证连接。
az connectedk8s show --resource-group arc-rg --name k8s-gke
这应该将 provisioningState
属性显示为 Succeeded
。
最后,检查连接的 Kubernetes 集群是否是 Azure 门户中的资源组。
步骤 1:预配应用服务 Kubernetes 环境
您可以随意使用任何 SQL Server 名称以适合您的偏好。(您还需要设置您的 Azure 订阅 ID。)但是,为了简单起见,本文使用以下名称
k8s-gke
– Azure Arc 资源arc-rg
– Azure Arc 的 Azure 资源组arc-app-service
– Kubernetes 应用服务扩展arc-ns
– 应用命名空间arc-app-custom-location
– 自定义位置
登录 Azure
对于部署管道,使用具有有限权限角色分配的服务主体将 Kubernetes 集群连接到 Azure Arc 会很有帮助。您可以在此处找到相关说明。
对于此演示,我们登录到我们的 Azure 帐户
az login
az account set -s "<SUBSCRIPTION_ID>"
添加或更新自定义位置的先决条件
az provider register --namespace Microsoft.ExtendedLocation --wait
az extension add --upgrade -n customlocation
在集群上启用功能
az connectedk8s enable-features -n k8s-gke -g arc-rg --features custom-locations
这也为我们启用了集群连接功能。
在已连接 Azure Arc 的集群中安装应用服务扩展
az k8s-extension create -g "arc-rg" --name "arc-app-service"
--cluster-type connectedClusters -c "k8s-gke" `
--extension-type 'Microsoft.Web.Appservice' --release-train stable --auto-upgrade-minor-version true `
--scope cluster --release-namespace "arc-ns" `
--configuration-settings "Microsoft.CustomLocation.ServiceAccount=default" `
--configuration-settings "appsNamespace=arc-ns" `
--configuration-settings "clusterName=arc-app-service" `
--configuration-settings "keda.enabled=true" `
--configuration-settings "buildService.storageClassName=standard" `
--configuration-settings "buildService.storageAccessMode=ReadWriteOnce" `
--configuration-settings "customConfigMap=arc-ns/kube-environment-config"
如果要在生产中启用 Log Analytics,我们现在必须按照此处所示的附加配置添加它。我们以后将无法执行此操作。
持久存储有两个参数需要适当考虑。您可以在官方 Kubernetes 文档中了解有关 Kubernetes 持久卷的更多信息,包括所有主要云服务提供商提供的存储资源的可用访问模式的详细分类。在此演示中,我们在 Google Cloud Engine (GCE) 中托管集群,GCE 提供 GCEPersistentDisk
。这支持以下 Kubernetes 的 PersistentVolume
(PV) 类型
ReadWriteOnce
ReadOnlyMany
AppService
扩展支持
ReadWriteOnce
ReadWriteMany
假设我们没有显式将 AppService
扩展设置为 ReadWriteOnce
。在这种情况下,它默认为 ReadWriteMany
。PersistentVolumeClaim
(PVC)、AppService
扩展的存储请求与 GCE 中可用的 PV 之间将存在不匹配。
我们还必须为 GCP 上的持久存储配置正确的类名。
该命令可能需要几分钟。如果在该过程中遇到任何错误,请查看故障排除文档。
命令完成后,导航到 Azure 门户中的 Kubernetes Azure Arc 资源,然后单击侧边栏中的扩展。您应该会看到 arc-app-service 扩展显示为已安装。
创建自定义位置
我们必须设置一个自定义位置才能将 Azure Functions 部署到支持 Arc 的 Kubernetes 集群。我们在第一篇文章中了解了这些内容。
获取应用服务扩展的 id
属性
$extensionId=(az k8s-extension show --name arc-app-service --cluster-type connectedClusters -c k8s-gke -g arc-rg --query id -o tsv)
获取已连接 Azure Arc 的集群的 id
属性
$connectedClusterId=(az connectedk8s show -n k8s-gke -g arc-rg --query id -o tsv)
使用这些值创建自定义位置
az customlocation create `
--resource-group arc-rg `
--name arc-app-custom-location `
--host-resource-id $connectedClusterId `
--namespace arc-ns `
--cluster-extension-ids $extensionId
完成后,使用以下命令进行验证
az customlocation show --resource-group arc-rg --name arc-app-custom-location --query privisioingState -o tsv
输出应显示“Succeeded”。如果不是,请等待一分钟并再次运行命令。
创建应用服务 Kubernetes 环境
获取自定义位置 id
属性
$customLocationId=$(az customlocation show `
--resource-group arc-rg `
--name arc-app-custom-location `
--query id `
--output tsv)
使用此 id
创建应用服务 Kubernetes 环境
az appservice kube create `
--resource-group arc-rg `
--name k8s-gke `
--custom-location $customLocationId
检查预配状态是否设置为 Succeeded
az appservice kube show --resource-group arc-rg --name k8s-gke
步骤 2:在 Azure 中创建 Web 应用
使用 Azure 门户创建具有以下设置的新 Web 应用
- 资源组:arc-rg
- 名称:azure-arc-demo-java-app
- 发布:代码
- 运行时堆栈:Java 11
- Java Web 服务器堆栈:Tomcat 9.0
与我们通常在 Azure 中创建应用唯一不同的是区域。您必须选择自定义位置而不是常规区域名称。
步骤 3:部署 Azure Java Web 应用
我们将修改 Maven Hello World
Java Web 应用以显示主机的 IP 地址,并证明它正在 Google Cloud 中运行。
创建 Java 应用
对于此步骤,您可以从本演示的 GitHub 存储库克隆已完成的代码,或自行完成步骤
mvn archetype:generate "-DgroupId=example.demo" "-DartifactId=helloworld" "-DarchetypeArtifactId=maven-archetype-webapp" "-Dversion=1.0-SNAPSHOT"
然后更改页面以输出主机的 IP 地址
<p>
<% try (java.util.Scanner s=new java.util.Scanner(new java.net.URL("https://api.ipify.org").openStream())) {
out.println(s.useDelimiter(" \\A").next()); } catch (Exception ex) { ex.printStackTrace(); } %>
</p>
部署到 Azure
注意:通常,Java Azure Web 应用的下一步是配置 Maven 插件进行部署。但是,在撰写本文时,Maven 无法像标准区域中的 Java 应用那样识别自定义位置中的 Java 应用。因此,我们不会使用 Maven 部署。我们将改用 Azure CLI。
下一步是将我们的 Web 应用打包成 Web 应用程序资源 (WAR) 文件
cd helloworld
mvn clean package
现在我们可以将其部署到我们在 Azure 中新创建的 Java Web 应用
az webapp deploy --name azure-arc-demo-java-app --resource-group arc-rg --src-path .\target\helloworld.war
摘要
我们已在 Azure 中预配了托管在 Google Cloud 中的应用服务 Kubernetes 环境,并成功部署了 Java Azure Web 应用。
当我们访问已部署应用的 URL 时,它会调用 ipify.org 来检索其主机的 IP 地址,然后将其呈现在页面输出中
当我们对该 IP 地址执行 whois
查询时,我们看到以下内容
这明确证明我们的 Java Azure Web 应用正在 Google Cloud 中运行!
在连接我们的 Google Cloud Kubernetes 集群并将其配置为托管 Azure 应用服务所需的初始步骤之后,创建和部署新应用与使用 Azure 原生应用相同,无论我们是从管道还是本地计算机部署它们。
要了解如何使用 Azure Arc 预览版在本地、边缘和云环境中管理、治理和保护您的 Kubernetes 集群,请查看Azure 网络研讨会系列“使用 Azure Arc 预览版随时随地管理 Kubernetes”。