Compartir a través de

VM 应用程序概述

VM 应用程序是Azure计算库中的资源类型,可简化虚拟机(VM)和Virtual Machine Scale Sets的应用程序管理。 将应用程序打包一次,将其存储在库中,并将其部署到组织中的任何 VM。

使用 VM 应用程序,可将应用程序部署与基本 VM 映像分离。 这种分离使你无需重新生成映像、减少维护开销、加速部署周期以及有效地处理关键漏洞和灾难恢复,即可独立更新应用程序。

何时使用 VM 应用程序

需要跨 Azure VM 发布、部署和管理软件时,建议使用 VM 应用程序。 在想要以下情况下考虑 VM 应用程序:

  • 使用一致的配置跨大型 VM 机群部署应用程序。
  • 在不重新生成 VM 映像的情况下频繁更新应用程序。
  • 管理应用程序版本,并在出现问题时回滚。
  • 通过快速发布新版本,并使用 Azure Policy 对设备组进行集中更新来响应零日漏洞。
  • 使用Azure Policy强制实施应用程序存在及其配置。
  • 减少大规模和时间敏感型工作负载(如 AI 推理和游戏)的部署延迟。
  • 通过部署后清点和监控来深入了解已部署的应用程序。
  • 模块化应用程序和脚本,实现可重用性和作效率。
  • 将应用程序管理合并到单个Azure托管的解决方案中。

VM 应用程序的工作原理

VM 应用程序与现有开发工作流和Azure基础结构集成,以提供端到端应用程序生命周期管理。

显示从开发到发布、部署和监视的 VM 应用程序生命周期的关系图。

  • 开发和发布:不同的团队独立开发应用程序、脚本和配置。 每个团队将其包作为Azure VM 应用程序发布到Azure计算库,该库充当个人应用存储库。
  • 部署或更新:使用 Azure 门户、PowerShell、CLI、REST API 或 ARM/Bicep 模板将已发布的应用程序部署到虚拟机(VM)和虚拟机规模集。
  • Enforce:使用Azure Policy在车队中自动注入所需的应用程序。
  • Automate:使用 CI/CD 管道(如 Azure DevOps、GitHub Actions、GitLab 管道、Jenkins 和脚本)自动发布、部署和更新。
  • 监视:查看基础结构中的应用程序清单和状态。 使用Azure Policy和Azure Resource Graph进行车队范围的合规性监视,或在Azure门户、PowerShell、CLI 和活动日志中查看每个资源的详细信息。

关键功能

组织的专用应用商店

  • 在Azure计算库中存储和管理所有应用程序包。
  • 以任何格式打包应用程序、脚本、配置和文件:.zip.msi.exe.tar.gz.deb.rpm.sh或其他。
  • 维护每个应用程序的多个版本并部署 latest 或特定版本。
  • 在不被视为latest的情况下,部署测试版本。

访问控制和共享

  • 控制谁可以使用Azure基于角色的访问控制(RBAC)将应用程序发布到库和访问已发布的应用进行部署。
  • 跨订阅、Microsoft 租户或公开共享图库。

安全性

  • 下载软件包时,请通过Azure管理的基础设施获取,而不是通过外部URL,这样无需让虚拟机直接连接到互联网。
  • 使用分配给 Azure 计算图库的 Managed Identity 安全地发布虚拟机应用程序。
  • 通过使用Azure Policy或脚本快速发布新版本和更新车队来处理关键安全漏洞。
  • 使用Azure Policy在整个基础结构中强制实施特定的应用程序、安全组件或应用程序配置。

灵活的部署选项

  • 部署到单个 VM、灵活或统一的虚拟机规模集。
  • 独立安装、更新或删除应用程序,而无需重新生成 VM 映像。
  • 为每个应用程序定义自定义安装、更新和删除命令。
  • 指定安装多个应用程序的部署顺序。
  • 使用 scriptBehaviorAfterReboot 属性配置重新启动处理。
  • 用于 treatFailureAsDeploymentFailure 在应用程序安装失败时将 VM 部署标记为失败。

故障复原能力和大规模性能

  • 跨Azure区域和可用区自动复制应用程序包,为区域、可用区或内容分发网络(CDN)故障提供弹性。
  • 在每个区域创建最多 10 个副本,以在大规模部署期间分发负载。
  • 每个 VM 最多部署 25 个包,每个 VM 总共 50 GB。
  • 使用块状 Blob 对大型包进行分块上传和后台流式处理。

管理和符合性

  • 使用Azure Policy审核并在整个车队中强制实施应用程序状态和配置。
  • 使用Azure门户、Azure Policy和Azure Resource Graph监视应用程序清单和状态。
  • 在整个基础设施中监视和应用挂起的更新。

成本

使用 VM 应用程序包不会产生额外的费用,但以下资源需要付费:

  • 存储每个包和任何副本的存储成本。
  • 从源区域复制到复制区域的第一个版本的网络出口费用。 后续副本将在区域内进行处理,因此不会产生额外费用。

有关网络流出量的详细信息,请参阅带宽定价

将应用程序发布为Azure VM 应用程序

若要部署 VM 应用程序,首先需要将应用程序发布到Azure计算库。 发布Azure VM 应用程序

  1. 首先,创建 VM 应用程序资源 ,该资源是包含有关应用程序的元数据的逻辑资源。
  2. 然后在包含应用程序包的 VM 应用程序资源中创建 VM 应用程序版本资源 ,以及如何安装、更新、删除和复制 VM 应用程序的说明。

发布Azure VM 应用程序所需的Azure资源

资源 ARM 资源类型 说明
Azure 计算画廊 Microsoft.Compute/galleries 画廊是用于管理和共享应用程序包的存储库。 用户可以共享库资源,所有子资源将自动共享。 每个订阅中的图库名称必须是唯一的。 例如,你可能有一个库用来存储所有操作系统映像,另一个库用来存储所有 VM 应用程序。
VM 应用程序 Microsoft.Compute/galleries/applications VM 应用程序的定义。 此逻辑资源存储其所有版本的通用元数据,包括名称、说明、支持的 OS 类型和生命周期结束信息。 将其视为包含单个应用程序的所有版本的容器。 例如,可能有一个名为 Apache Tomcat 的 VM 应用程序,其中包含版本 9.0.0、9.0.1 和 10.0.0。
VM 应用程序版本 Microsoft.Compute/galleries/applications/versions 包含应用程序包和版本特定配置的可部署资源。 每个版本都指向存储帐户中的应用程序二进制文件或脚本,并定义安装、更新和删除命令。 可以将版本复制到多个Azure区域,以提高部署可靠性和降低延迟。 将应用程序部署到 VM 之前,必须将版本复制到 VM 的区域。
存储帐户 Microsoft.Storage/storageAccounts 应用程序包首先上传到存储帐户。 然后,Azure 计算画廊使用 SAS URL 从这个存储帐户下载应用程序包,并将它存储在 VM 应用程序版本中。 Azure 计算库还会根据 VM 应用程序版本定义跨区域和区域副本复制此包。 在 Azure 计算库中创建 VM 应用程序版本后,可以删除存储帐户中的应用程序包。

VM 应用程序资源中的属性

VM 应用程序资源定义以下属性:

资产 说明 可更新的 局限性
姓名 应用程序的名称 是的 最大长度为 117 个字符。 允许的字符为大写或小写字母、数字、连字符 (-)、句点 (.)、下划线 (_)。 名称不能以句点 (.) 结尾。
位置 资源的位置
supportedOSType 定义支持的 OS 类型 “Linux”或“Windows”
endOfLifeDate 可选。 应用程序的未来生命周期结束日期。 日期仅供参考,不会强制执行。 是的
描述 可选。 VM 应用程序的说明 是的
eula 可选。 参考最终用户许可协议 (EULA) 是的
privacyStatementUri 可选。 参考应用程序的隐私声明。 是的
releaseNoteUri 可选。 参考应用程序的发行说明。 是的

VM 应用程序版本资源中的属性

VM 应用程序版本 是 VM 应用程序资源中的可部署资源。 版本是用以下属性定义的:

资产 说明 可更新的 局限性
位置 VM 应用程序版本的源位置。 有效的 Azure 区域
source/mediaLink 链接到存储帐户中的应用程序包文件 部分。 有效且现有的存储 URL。 只能更改 SASURL 中的 SASToken。
source/defaultConfigurationLink 可选。 指向 VM 应用程序的配置文件的链接。 可以在部署时重写。 部分地 有效且现有的存储 URL。 只能更改 SASURL 中的 SASToken。
manageActions/install 以字符串形式安装脚本,以正确安装应用程序 字符串格式的给定操作系统的有效命令。
manageActions/remove 以字符串形式移除脚本,以正确移除应用程序 字符串格式的给定操作系统的有效命令
manageActions/update 可选。 以字符串形式更新脚本,以将 VM 应用程序正确更新到较新的版本。 字符串格式的给定操作系统的有效命令
targetRegions/name 要复制到的目标区域的名称。 提高区域故障的复原能力并产生延迟。 是的 有效的 Azure 区域
targetRegions/regionalReplicaCount 可选。 在该区域中创建的副本数量。 改进负载处理并产生延迟。 默认值为 1。 是的 介于 1 和 3 之间(含限值)的整数
replicaCount 可选。 定义每个区域的副本数。 如果未定义 regionalReplicaCount,则生效。 在区域或群集发生故障时提升复原能力,同时在大规模场景下会产生延迟。 是的 介于 1 和 3 之间(含限值)的整数。
endOfLifeDate 可选。 应用程序版本的未来生命周期结束日期。 此属性仅供客户参考,不会强制实施。 是的 有效的未来日期
excludeFromLatest 可选。 当在 applicationProfile 中使用“latest”关键字时,请排除用作应用程序最新版本的版本。 是的 默认值为 false。
storageAccountType 可选。 要在每个区域中用于存储应用程序包的存储帐户的类型。 默认为 Standard_LRS。
safetyProfile/allowDeletionOfReplicatedLocations 可选。 指示是否允许从复制区域删除此库映像版本。 是的
settings/packageFileName 可选。 将包下载到 VM 时要使用的包文件名。 字符限制为 4,096 个字符。
settings/configFileName 可选。 将配置下载到 VM 时要使用的配置文件名称。 字符限制为 4,096 个字符。
settings/scriptBehaviorAfterReboot 可选。 重启 VM 后安装、更新或删除库应用程序时要执行的操作。

部署 Azure VM 应用程序

将 VM 应用程序版本发布到 Azure Compute Gallery 后,可以跨 Azure 虚拟机 (VM) 和 Azure 虚拟机规模集部署版本。 通过引用Azure虚拟机和Virtual Machine Scale Sets的 applicationProfile 中的 VM 应用程序的 ARM ID 来完成此部署。

VM 和 Virtual Machine Scale Sets 的 applicationProfile 中的属性

Azure VM 中的 applicationProfile,Virtual Machine Scale Sets定义以下属性:

资产 说明 局限性
galleryApplications 要部署的 Gallery 应用程序
包裹参考编号 对要部署的应用程序版本的引用 有效的应用程序版本引用
configurationReference 可选。 包含此部署的配置的存储 Blob 的完整 URL。 这会替代之前为 defaultConfiguration 提供的任何值。 有效的存储 Blob 引用
顺序 可选。 部署应用程序的顺序。 如果未设置,应用程序将在所有已排序应用程序安装后最后安装。 有效的整数
treatFailureAsDeploymentFailure 可选。 将应用程序失败标记为 VM 部署失败以处理故障 真或假

Order 字段可用于指定应用程序之间的依赖关系。 排序规则如下:

案例 安装时的含义 失败时的含义
未指定顺序 先安装有序应用程序,再安装无序应用程序。 对于无顺序的应用程序,其安装顺序无法保证。 其他应用程序(无论是有序还是无序)安装失败不会影响无序应用程序的安装。
重复顺序值 与遵循相同顺序的其他应用程序不同,按任意顺序安装应用程序。 相同顺序的所有应用程序将在低顺序的应用程序之后、高顺序的应用程序之前安装。 如果之前顺序更低的应用程序安装失败,则不安装此顺序的任何应用程序。 如果此顺序的任何应用程序安装失败,则不安装顺序更高的应用程序。
提高顺序 应用程序将在低顺序的应用程序之后、高顺序的应用程序之前安装。 如果前面的低顺序应用程序安装失败,则不会安装此应用程序。 如果此应用程序安装失败,则不安装顺序更高的应用程序。

VM 应用程序的技术详细信息

VM 应用程序的注意事项和当前限制

  • 每个区域最多 10 个副本:创建 VM 应用程序版本时,每个区域的页面 Blob 和块 Blob 副本的最大数量是 10。

  • 每个区域最多 300 个版本:创建 VM 应用程序版本时,每个区域最多可以有 300 个应用程序版本。

  • 失败安装手动重试:目前,重试失败安装的唯一方法是从配置文件中删除应用程序,然后将其添加回。

  • 每个 VM 最多 25 个应用程序:最多可以将 25 个应用程序部署到单个虚拟机。

  • 2 GB 应用程序大小:应用程序版本 mediaLink 的最大文件大小为 2 GB。 最大文件大小 defaultConfigurationLink 为 1 GB。

  • 需要 VM 代理:VM 代理必须存在于 VM 中,并且必须能够收到目标状态。

  • 每个 VM 的应用程序单一版本:只能将给定应用程序的一个版本部署到 VM。

  • 当前不支持移动操作:目前不支持将具有关联 VM 应用程序的虚拟机跨资源组进行移动。

注意

对于 Azure Compute Gallery 和 VM 应用程序,可以在复制后删除存储 SAS。 但是,任何后续的更新操作都需要有效的 SAS。

在 VM 中下载目录

应用程序包和配置文件的下载位置如下:

  • Linux:/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<application name>/<application version>
  • Windows:C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<application name>\<application version>

假设应用程序包和配置文件位于当前目录中,则应写入安装/更新/删除命令。

已部署 VM 应用程序的文件命名

将应用程序文件下载到 VM 时,Azure使用 VM 应用程序名称作为文件名,而无需任何文件扩展名。 例如,如果 VM 应用程序名称为“TestPythonApp”,则 VM 应用程序中上传的 python.exe 文件将下载为 TestPythonApp。 Azure无法保留原始文件名和文件扩展名。

同样,如果配置文件通过 defaultConfigurationLink 中的 publishingProfile 或通过 configurationReference 中的 applicationProfile 传递,Azure 使用 <vm application name>-config 下载该文件。例如,如果配置文件名称为“config.json”,并且 VM 应用程序名称为 "TestPythonApp",那么下载的文件名为 TestPythonApp-config。

VM 应用程序提供packageFileName属性configFileNamepublishingProfile\settings来替代默认文件名,并允许客户设置自定义文件名。 例如,如果 packageFileName="pythonApp.exe"configFileName="pythonConfig.json,则Azure下载具有相应名称的文件。

或者,在执行 installScript前包括用于重命名文件的命令。

VM 应用程序使用的命令解释器

默认的命令解释器是:

  • Linux:/bin/bash
  • Windows:cmd.exe

只要它安装在计算机上,通过调用可执行文件并将命令传递给它,就可以使用不同的解释器,如 Chocolatey 或 PowerShell。 例如,若要让命令在 Windows 上的 PowerShell 中运行,而不是在 cmd 中运行,可以传递 powershell.exe -Command '<powershell commmand>'

如何处理 VM 应用程序更新

当更新在 VM 或虚拟机规模集上的应用程序版本时,将使用在部署期间提供的更新命令。 如果更新后的版本没有更新命令,则删除当前版本并安装新版本。

应编写更新命令,并期望它可以从任何较旧版本的 VM 应用程序进行更新。

将 VM 应用程序失败视为部署失败

默认情况下,如果应用程序无法安装、更新或删除,VM 应用程序扩展仍将其状态报告为 成功。 当扩展本身或底层基础结构出现问题,而不是应用程序脚本时,该扩展仅会自行报告故障。

若要更改此行为,请在 VM 的 applicationProfile 中将应用程序的 treatFailureAsDeploymentFailure 属性设置为 true。 启用此设置时,任何应用程序安装、更新或删除失败都会导致 VMAppExtension 预配状态报告失败。 此失败还会导致 VM 预配状态报告为失败。

错误信息

下面是发布和部署 VM 应用程序时可能会遇到的错误消息。

消息 说明
当前 VM 应用程序版本 {name} 已于 {date} 弃用。 你尝试部署已弃用的 VM 应用程序版本。 尝试使用 latest,而不是指定特定的版本。
当前 VM 应用程序版本 {name} 支持操作系统 {OS},而当前 OSDisk 的操作系统为 {OS}。 你尝试将 Linux 应用程序部署到 Windows 实例,或者反之。
已超过了 VM 应用程序的最大数量(最大值=5,当前值={count})。 使用较少的应用程序并重试请求。 目前,我们仅支持每个 VM 或虚拟机规模集最多五个 VM 应用程序。
指定了多个具有相同 packageReferenceId 的 VMApplication。 多次指定了相同的应用程序。
订阅无权访问此映像。 订阅无权访问此应用程序版本。
参数中的存储帐户不存在。 此订阅没有应用程序。
平台映像 {image} 不可用。 确认存储配置文件中的所有字段均正确。 有关存储配置文件的详细信息,请参阅 https://aka.ms/storageprofile 应用程序不存在。
库映像 {image} 在 {region} 区域不可用。 请联系映像所有者以将其复制到此区域,或者更改你请求的区域。 图库应用程序版本存在,但未复制到此区域。
SAS 对于源 uri {uri} 无效。 尝试从存储中获取有关 url(即 mediaLink 或 defaultConfigurationLink)的信息时收到 Forbidden 错误。
源 uri {uri} 引用的 Blob 不存在。 为 mediaLink 或 defaultConfigurationLink 属性提供的 Blob 不存在。
由于以下错误,无法访问图库应用版本的 URL {url}:找不到远程名称。 确保 blob 存在,并且它是可公开访问的,或者是具有读取权限的 SAS URL。 最可能的情况是未提供具有读取权限的 SAS uri。
由于以下错误,无法访问图库应用程序版本的 URL {url}:{error description}。 确保 blob 存在,并且它是可公开访问的,或者是具有读取权限的 SAS URL。 提供的存储 blob 存在问题。 错误描述提供更多信息。
{Application} 上不允许使用操作 {operationName},因为该操作已被标记为删除。 只能重试删除操作(或等待正在进行的操作完成)。 尝试更新当前正在删除的应用程序。
参数“galleryApplicationVersion.properties.publishingProfile.replicaCount”的值 {value} 超出范围。 此值必须介于 1 到 3 之间(均含)。 VM Application 版本只允许 1 到 3 个副本。
不允许更改属性“galleryApplicationVersion.properties.publishingProfile.manageActions.install”。 (或更新、删除) 无法更改现有 VmApplication 上的任何管理操作。 必须创建新的 VmApplication 版本。
不允许更改属性“galleryApplicationVersion.properties.publishingProfile.settings.packageFileName”。 (或 configFileName) 无法更改任何设置,例如包文件名或配置文件名。 必须创建新的 VmApplication 版本。
源 URI {uri} 引用的 blob 太大:大小 = {size}。 允许的最大 blob 大小为“1 GB”。 mediaLink 或 defaultConfigurationLink 引用的 blob 的最大大小当前为 1 GB。
源 uri {uri} 引用的 blob 为空。 引用了一个空 blob。
不支持将 {type} blob 类型用于 {operation} 操作。 仅支持页 blob 和块 blob。 VmApplications 仅支持页 blob 和块 blob。
SAS 对于源 uri {uri} 无效。 为 mediaLink 或 defaultConfigurationLink 提供的 SAS uri 不是有效的 SAS uri。
无法在目标区域指定 {region},因为订阅缺少必需的功能 {featureName}。 使用所需的功能注册订阅,或者从目标区域列表中删除区域。 若要在某些受限区域使用 VmApplication,必须为该订阅注册功能标志。
库映像版本发布配置文件区域 {regions} 必须包含映像版本的位置 {location}。 要复制的区域列表必须包含应用程序版本所在的位置。
目标发布区域中不允许出现重复区域。 发布区域不得有重复项。
图库应用版本资源目前不支持加密。 VM 应用程序不支持目标区域的加密属性
实体名称与请求 URL 中的名称不匹配。 请求 URL 中指定的库应用程序版本与请求正文中指定的版本不匹配。
库应用程序版本名称无效。 应用程序版本名称应遵循 Major(int32)。 Minor(int32)。 Patch(int32) 格式,其中 int 介于 0 到 2,147,483,647 之间(均含)。 例如,1.0.0、2018.12.1 等。 画廊应用程序版本必须遵循指定的格式。

后续步骤

了解如何做

查看