在 Azure Compute Gallery 中存储和共享映像

适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集 ✔️ 统一规模集

映像是完整 VM(包括任何附加的数据磁盘)的副本或者只是 OS 磁盘的副本,具体取决于映像的创建方式。 从映像创建 VM 时,将使用该映像中的 VHD 副本来为新 VM 创建磁盘。 映像保留在存储中,可反复用来创建新的 VM。

如果有大量的映像需要维护,并想要使其在整个公司中可用,可将 Azure Compute Gallery 用作存储库。

使用库存储映像时,会创建多个资源类型:

资源 说明
映像源 这是可用于在库中创建“映像版本”的资源。 映像源可以是现有的 Azure VM(可以是通用或专用的)、托管映像、快照、VHD 或其他库中的映像版本。
与 Azure 市场一样,库是用于管理和共享映像和其他资源的存储库,但你可以控制谁有权访问该库。
映像定义 映像定义在库中创建,携带有关该映像以及使用该映像创建 VM 的任何要求的信息。 这包括了该映像是 Windows 还是 Linux 映像、发行说明以及最低和最高内存要求。 它是某种映像类型的定义。
映像版本 使用库时,将使用映像版本来创建 VM。 可根据环境的需要创建多个映像版本。 与托管映像一样,在使用映像版本创建 VM 时,将使用映像版本来创建 VM 的新磁盘。 可以多次使用映像版本。

演示如何在库中创建多个映像版本的示意图

映像定义

映像定义是映像版本的逻辑分组。 映像定义包含有关创建映像原因的信息,也包含映像元数据,例如映像适用的 OS、支持的功能,以及有关使用映像的其他信息。 映像定义就像围绕创建特定映像计划所有详细信息。 不要从映像定义部署 VM,而要从基于该定义创建的映像版本部署 VM。

每个映像定义有三个可以组合使用的参数:发布者、产品/服务和 SKU 。 这些参数用于查找特定的映像定义。 可以拥有共享一个或两个但不是全部三个值的映像定义。 例如,以下是三个映像定义及其值:

映像定义 发布者 产品 Sku
myImage1 Contoso 财务 后端
myImage2 Contoso 财务 前端
myImage3 测试 财务 前端

所有这三个映像都有唯一的一组值。 格式类似于当前在 Azure PowerShell 中为 Azure 市场映像指定发布者、套餐和 SKU,以获取最新市场映像版本的方式。 每个映像定义需要包含一组唯一的这些值。

以下参数确定了它们可包含哪些类型的映像版本:

  • 操作系统状态 - 可将 OS 状态设置为通用化或专用化。 此字段为必需字段。
  • 操作系统 - 可以是 Windows 或 Linux。 此字段为必需字段。
  • Hyper-V 代 - 指定映像是从第 1 代还是第 2 代 Hyper-V VHD 创建的。 默认值是“第 1 代”。

映像定义包含映像的元数据,通过它可对支持相同功能、计划、OS 状态、OS 类型等内容的映像进行分组。 下面是可在映像定义上设置的其他参数,以便你可以更轻松地跟踪资源:

  • 说明 - 使用说明可以更详细地解释该映像定义为何存在。 例如,你可能对预安装了应用程序的前端服务器具有映像定义。

  • EULA - 可用于指向特定于映像定义的最终用户许可协议。

  • 隐私声明和发行说明 - 将发行说明和隐私声明存储在 Azure 存储中,并提供在映像定义中用于访问它们的 URI。

  • 生命周期结束日期 - 为映像定义中的所有映像版本建立默认日期,在此日期之后不应使用该映像。 生命周期终止日期是信息性的;用户仍然可以从过期的映像和版本创建 VM。

  • 标记 - 可以在创建映像定义时添加标记。 有关标记的详细信息,请参阅使用标记来组织资源

  • 最小和最大 vCPU 与内存建议量 - 如果映像附带 vCPU 和内存建议量,则你可以将该信息附加到映像定义。

  • 不允许的磁盘类型 - 可以提供有关 VM 所需存储的信息。 例如,如果映像不适合标准 HDD 磁盘,请将其添加到禁止列表。

  • 市场映像的购买计划信息 -PurchasePlanPublisher-PurchasePlanName-PurchasePlanProduct。 若要详细了解购买计划信息,请参阅在 Azure 市场中查找映像在创建映像时提供 Azure 市场购买计划信息

  • 体系结构

  • 功能允许你根据库的类型指定映像上支持的其他功能和 SecurityType:

    功能 接受的值 定义 受以下版本支持:
    IsHibernateSupported True、False 创建支持休眠的 VM。 专用、直接共享、社区
    IsAcceleratedNetworkSupported True、False 创建启用了加速网络的 VM。 在映像定义上设置为 True 时,如果 VM 不支持加速网络,则不支持捕获这些 VM。 专用、直接共享、社区
    DiskControllerType ["SCSI", "NVMe"], ["SCSI"] 将此项设置为使用 SCSI 或 NVMe 磁盘类型。 只能在标记为支持 NVMe 的映像定义中捕获 NVMe VM 和磁盘。 专用、直接共享、社区

    使用 features 参数指定 SecurityType 时,它会限制在 VM 上启用的安全功能。 某些类型受到限制,具体取决于存储它们的库类型:

    SecurityType 定义 受以下版本支持:
    ConfidentialVMSupported 它是不包含 VMGS Blob 的通用 Gen2 映像。 可以从此映像类型创建 Gen2 VM 或机密 VM 专用、直接共享、社区
    机密 VM 只能从此映像类型创建机密 VM 私有
    TrustedLaunchSupported 它是不包含 VMGS Blob 的通用 Gen2 映像。 可以从此映像类型创建 Gen2 VM 或 TrustedLaunch VM。 专用、直接共享、社区
    TrustedLaunch 只能从此映像类型创建 TrustedLaunch VM 私有
    TrustedLaunchAndConfidentialVmSupported 它是不包含 VMGS Blob 的通用 Gen2 映像。 可以从此映像类型创建 Gen2 VM、TrustedLaunch VM 或 ConfidentialVM。 专用、直接共享、社区

    有关详细信息,请查看介绍如何添加映像定义功能和 SecurityType 的 CLI 示例或查看 PowerShell 示例

映像版本

映像版本用于创建 VM。 可根据环境的需要创建多个映像版本。 使用映像版本创建 VM 时,将使用该映像版本来创建该 VM 的新磁盘。 可以多次使用映像版本。

映像版本的属性如下所示:

  • 版本号。 它用作映像版本的名称。 它始终采用以下格式:MajorVersion.MinorVersion.Patch。 如果指定在创建 VM 时使用最新版本,则依次根据版本最高的 MajorVersion、MinorVersion 和 Patch 选择最新映像。
  • 源。 源可以是 VM、托管磁盘、快照、托管映像,也可以是其他映像版本。
  • 生命周期结束日期。 指示映像版本的生命周期终止日期。 生命周期终止日期是信息性的;用户仍然可以从过期的版本创建 VM。

通用和专用映像

Azure Compute Gallery 支持两种操作系统状态。 通常情况下,映像要求用于创建映像的 VM 在获取映像之前已通用化。 通用化是从 VM 中删除计算机和用户特定信息的过程。 对于 Linux,可以使用 waagent -deprovision-deprovision+user 参数。 对于 Windows,使用 Sysprep 工具。

专用 VM 尚未通过进程移除计算机特定信息和帐户。 此外,根据专用映像创建的 VM 不具有与其关联的 osProfile。 这意味着,除了某些优点外,专用化映像还存在一些限制。

  • 从专用映像创建的 VM 和规模集可以更快地启动并运行。 由于它们是根据已经过首次启动的源创建的,因此根据这些映像创建的 VM 启动速度会更快。
  • 可用于登录到 VM 的帐户也可用于通过使用该 VM 创建的专用映像创建的任何 VM。
  • VM 具有用于创建映像的 VM 的计算机名。 应更改计算机名以避免冲突。
  • osProfile 是使用 secrets 将某些敏感信息传递给 VM 的方式。 在使用 KeyVault、WinRM,以及在 osProfile 中使用 secrets 的其他功能时,这可能会导致出现问题。 在某些情况下,可以使用托管服务标识 (MSI) 解决这些限制。

注意

通用化和专用 VM 映像包含一个操作系统磁盘和所有附加磁盘(如果有)。

正在更新资源

创建后,可以对库资源进行一些更改。 限制如下:

Azure Compute Gallery:

  • 说明

映像定义:

  • 建议的 vCPU 数
  • 建议的内存
  • 说明
  • 生命周期终结日期
  • ReleaseNotes

映像版本:

  • 区域副本计数
  • 目标区域数
  • 从最新版本中排除
  • 生命周期终结日期

共享

在 Azure Compute Gallery 中共享映像当前有一种主要方法:

共享对象: 人员 Service Principal 特定订阅(或)租户中的所有用户 与 Azure 中的所有用户公开共享
RBAC 共享

创建 ACG 映像所需的 RBAC 权限:

ACG 映像可由来自各种源(包括虚拟机、磁盘/快照和 VHD)的用户创建。 本部分概述了创建 Azure Compute Gallery 映像所需的各种用户权限。 如果没有必要权限,标识将无法创建 ACG 映像。

源类型 所需权限
虚拟机 写入
磁盘/快照 写入
VHD 写入 (listKeys)
托管映像 读取
库映像 读取

有关 Azure 内置角色授予 RBAC 权限的其他信息,请参阅我们的文档

浅表复制

创建映像版本时,可以将复制模式设置为浅表进行开发和测试。 浅层复制会跳过复制映像,因此映像版本会以更快的速度准备就绪。 但是,这也意味着无法从该映像版本部署大量 VM。 这类似于旧托管映像的工作方式。

如果具有不经常部署的大型映像(最大 32TB),则浅层复制也会非常有用。 由于源映像未复制,因此可以使用更大的磁盘。 但是,它们也不能同时用于部署大量 VM。

若要为浅层复制设置映像,请在 Azure CLI 中使用 --replication-mode Shallow

SDK 支持

以下 SDK 支持创建 Azure Compute Galleries:

模板

可使用模板创建 Azure Compute Gallery 资源。 有多个快速启动模板可供使用:

常见问题

若要在 Azure 门户上列出不同订阅中你有权访问的所有 Azure Compute Gallery 资源,请执行以下步骤:

  1. 打开 Azure 门户
  2. 向下滚动页面然后选择“所有资源”。
  3. 选择要列出其中的所有资源的所有订阅。
  4. 查找类型为“Azure Compute Gallery”的资源。

若要列出不同订阅中你有权访问的所有 Azure Compute Gallery 资源,请在 Azure CLI 中使用以下命令:

   az account list -otsv --query "[].id" | xargs -n 1 az sig list --subscription

是的。 根据映像的类型,可能存在 3 种场景。

应用场景 1:如果你有托管映像,则可以从该映像创建映像定义和映像版本。 有关详细信息,请参阅创建映像定义和映像版本

应用场景 2:如果你有非托管的映像,可以从该映像创建托管映像,然后从该托管映像创建映像定义和映像版本。

应用场景 3:如果本地文件系统中包含 VHD,则需要将 VHD 上传到托管映像,然后可以从该映像创建映像定义和映像版本。

  • 如果 VHD 适用于 Windows VM,请参阅上传 VHD
  • 如果 VHD 适用于 Linux VM,请参阅上传 VHD

是否可以从专用化磁盘创建映像版本?

是的,可以从专用化映像创建 VM。

不可以,无法将库映像资源移动到其他订阅中。 可以将库中的映像版本复制到其他区域,也可以从其他库复制映像

是否可以跨云(例如由世纪互联运营的 Microsoft Azure、Azure 德国或 Azure 政府云)复制映像版本?

否,无法跨云复制映像版本。

是否可以跨订阅复制映像版本?

不可以。但可以跨订阅中的区域复制映像版本,并通过 RBAC 在其他订阅中使用该版本。

是否可以跨 Microsoft Entra 租户共享映像版本?

是的,可以使用 RBAC 跨租户共享给个人。 但若要大规模共享,请参阅使用 PowerShellCLI“跨 Azure 租户共享库映像”。

跨目标区域复制映像版本需要多长时间?

映像版本复制时间完全取决于映像的大小以及它要复制到的区域数。 但作为最佳做法,我们建议使用较小的映像,并在相互靠近的源与目标区域之间进行复制,以实现最佳效果。 可以使用 -ReplicationStatus 标志检查复制状态。

源区域与目标区域之间的区别是什么?

源区域是创建映像版本的区域,而目标区域是存储映像版本副本的区域。 每个映像版本只能有一个源区域。 此外,在创建映像版本时,请确保将源区域位置传递为目标区域之一。

创建映像版本时如何指定源区域?

创建映像版本时,可在 CLI 中使用 --location 实参,或者在 PowerShell 中使用 -Location 形参来指定源区域。 请确保要用作基本映像来创建映像版本的托管映像位置与要创建映像版本的位置相同。 此外,在创建映像版本时,请确保将源区域位置传递为目标区域之一。

如何指定要在每个区域中创建的映像版本副本数?

可通过两种方式指定要在每个区域中创建的映像版本副本数:

  1. 区域副本计数:指定要在每个区域创建的副本数。
  2. 通用副本计数,即未指定区域副本计数时默认的每区域计数。

若要指定区域副本计数,请传递位置以及要在该区域中创建的副本数:"China East=2"。

如果未为每个位置指定区域副本计数,则默认副本数将是指定的通用副本计数。

若要在 Azure CLI 中指定通用副本计数,请在 az sig image-version create 命令中使用 --replica-count 实参。

是的,有可能。 但作为最佳做法,我们建议将资源组、库、映像定义和映像版本保留在同一位置。

使用 Azure Compute Gallery 不会产生费用,不过,存储映像版本会产生存储费用,将映像版本从源区域复制到目标区域会产生网络传出费用。

创建映像时应该使用哪种 API 版本?

若要处理像库、映像定义和映像版本,建议使用 API 版本 2018-06-01。 区域冗余存储 (ZRS) 需要版本 2019-03-01 或更高版本。

应该使用哪种 API 版本来通过映像版本创建 VM 或虚拟机规模集?

若要使用映像版本部署 VM 和虚拟机规模集,我们建议使用 API 2018-04-01 或更高版本。

可以,可以将规模集映像参考从托管映像更新为 Azure Compute Gallery 映像,前提是这些映像之间的 OS 类型、Hyper-V 代次和数据磁盘布局均匹配。

如何更新代码以使用新属性,同时确保在创建 VM 映像期间准确授予权限?

对于“虚拟机 ID”字段,请使用 GallerySource(GalleryImageVersionStorageProfile.GallerySource.VirtualMachineID) 下的 VirtualMachineId 字段。 新属性需要 api-version 2023-07-03 或 .NET SDK 版本 1.4.0(或更高版本)

StorageProfile = new GalleryImageVersionStorageProfile()
            {
                GallerySource = new GalleryArtifactVersionFullSource()
                {
                    VirtualMachineId = new ResourceIdentifier(virtualMachineId),
                }
            },

对于“VHD 作为源”,请使用 OSDiskImage 或数据磁盘映像 (GalleryImageVersionStorageProfile.OSDiskImage.GallerySource.StorageAccountId) 中 GallerySource 下的 StorageAccountID 字段。 新属性需要 api-version 2022-03-03

StorageProfile = new GalleryImageVersionStorageProfile()
            {
                OSDiskImage = new GalleryOSDiskImage()
                {
                    GallerySource = new GalleryDiskImageSource()
                    {
                        StorageAccountId = new ResourceIdentifier(storageAccountId),
                        Uri = new Uri(blobUri),
                    }
                }
            },

由于其永久性磁盘,根据 Azure Compute Gallery 映像创建的 VM 不受影响。 但 VMSS 横向扩展操作将会失败,因为它们依赖于源映像 ID 引用,删除 Azure Compute Gallery 映像后,将会丢失该引用。

疑难解答

如果对库资源执行任何操作时遇到问题,请参阅故障排除指南中的常见错误列表。

此外,还可以在 Q&A 中发布问题并使用 azure-virtual-machines-images 来标记问题。

后续步骤

了解如何使用 Azure Compute Gallery 部署映像。