教程:通过 Azure CLI 创建和使用虚拟机规模集的自定义映像

创建规模集时,需指定部署 VM 实例时要使用的映像。 若要在部署 VM 实例之后减少任务数目,可以使用自定义 VM 映像。 在此自定义 VM 映像中可以完成全部所需的应用程序安装或配置步骤。 在该规模集中创建的任何 VM 实例都使用自定义 VM 映像,并可随时处理应用程序流量。 本教程介绍如何执行下列操作:

  • 创建 Azure Compute Gallery
  • 创建专用映像定义
  • 创建映像版本
  • 从专用映像创建虚拟机规模集
  • 共享图片库

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

  • 本文需要 Azure CLI 版本 2.4.0 或更高版本。

概述

Azure Compute Gallery 简化了整个组织中的自定义映像共享。 自定义映像类似于市场映像,不同的是自定义映像的创建者是自己。 自定义映像可用于启动配置,例如预加载应用程序、应用程序配置和其他 OS 配置。

使用 Azure Compute Gallery,你可以与他人共享自定义 VM 映像。 选择要共享哪些映像,要在哪些区域中共享,以及希望与谁共享它们。

创建并配置源 VM

首先使用 az group create 创建资源组,然后使用 az vm create 创建 VM。 然后,此 VM 将用作映像的源。

以下示例在名为 myResourceGroup 的资源组中创建基于 Linux 的名为 myVM 的 VM。

export RANDOM_ID=$(openssl rand -hex 3)
export MY_RESOURCE_GROUP_NAME="myResourceGroup$RANDOM_ID"
export REGION="chinanorth2"
export MY_VM_NAME="myVM"

az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION

az vm create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $MY_VM_NAME \
  --image debian11 \
  --admin-username azureuser \
  --generate-ssh-keys

提示

az vm create 命令的输出中会显示 VM 的 ID。 请复制它并将它存储在安全的位置,以便稍后在本教程中使用它。

映像库是用于启用映像共享的主要资源。

允许用于库名称的字符为大写或小写字母、数字、点和句点。 库名称不能包含连字符。 库名称在你的订阅范围内必须是唯一的。

使用 az sig create 创建映像库。

在以下示例中:

  • 为图库创建一个名为myGalleryRG的资源组,该资源组位于中国北部 2
  • 该图库名为 myGallery
export MY_GALLERY_RG_NAME="myGalleryRG$RANDOM_ID"
export MY_GALLERY_NAME="myGallery$RANDOM_ID"

az group create --name $MY_GALLERY_RG_NAME --location $REGION
az sig create --resource-group $MY_GALLERY_RG_NAME --gallery-name $MY_GALLERY_NAME

创建镜像定义

映像定义为映像创建一个逻辑分组。 它们用于管理其中创建的映像版本的相关信息。

映像定义名称可以由大写或小写字母、数字、点、短划线和句点构成。

请确保映像定义的类型正确:

  • 状态 - 如果已通用化 VM(使用适用于 Windows 的 Sysprep,或适用于 Linux 的 waagent -deprovision),则应使用 创建通用化映像定义。--os-state generalized 若要在不删除现有用户帐户的情况下使用 VM,请使用 --os-state specialized 创建专用化映像定义。
  • 安全类型 - 默认配置为“受信任启动”来创建新的 Azure VM。 本教程包括后续代码示例,这些代码示例反映了创建映像定义和规模集时的受信任启动配置。 如果使用未启用受信任启动的 VM 创建映像,请确保在创建这两种资源时反映正确的安全类型。 有关受信任启动的详细信息,请参阅 Azure 虚拟机的受信任启动

若要详细了解可为映像定义指定的值,请参阅映像定义

使用 az sig image-definition create 在映像库中创建映像定义。

在以下示例中,映像定义为:

  • 名为 myImageDefinition
  • 针对专用 Linux 操作系统映像进行了配置。 若要使用 Windows OS 创建映像的定义,请使用 --os-type Windows
  • 已配置为可信启动。
export MY_IMAGE_DEF_NAME="myImageDefinition$RANDOM_ID"
MY_PUBLISHER_NAME="myPublisher$RANDOM_ID"

az sig image-definition create \
   --resource-group $MY_GALLERY_RG_NAME \
   --gallery-name $MY_GALLERY_NAME \
   --gallery-image-definition $MY_IMAGE_DEF_NAME \
   --publisher $MY_PUBLISHER_NAME \
   --offer myOffer \
   --sku mySKU \
   --os-type Linux \
   --os-state specialized \
   --features SecurityType=TrustedLaunch

提示

映像定义的 ID 会显示在命令的输出中。 请复制它并将它存储在安全的位置,以便稍后在本教程中使用它。

创建映像版本

使用 az image gallery create-image-version 从 VM 创建映像版本。

允许用于映像版本的字符为数字和句点。 数字必须在 32 位整数范围内。 格式:MajorVersion.MinorVersion.Patch

在以下示例中:

  • 映像版本为 1.0.0
  • 我们在 “中国北部 3 ”区域创建一个副本,在 “中国北部 2 ”区域中创建一个副本。 复制区域必须包含源 VM 所在的区域。
  • --virtual-machine 是之前创建的 VM 的 ID。
export MY_VM_ID=$(az vm show --name $MY_VM_NAME --resource-group $MY_RESOURCE_GROUP_NAME --query "id" --output tsv)

az sig image-version create \
   --resource-group $MY_GALLERY_RG_NAME \
   --gallery-name $MY_GALLERY_NAME \
   --gallery-image-definition $MY_IMAGE_DEF_NAME \
   --gallery-image-version 1.0.0 \
   --target-regions "chinanorth3=1" "chinanorth2=1" \
   --virtual-machine $MY_VM_ID

注意

需要等待映像版本的生成和复制完全完成,然后才能使用同一个映像来创建另一个映像版本。

创建映像版本时,还可以通过添加 --storage-account-type premium_lrs 将映像存储在高级存储中,或者通过添加 --storage-account-type standard_zrs 将映像存储在 区域冗余存储 中。

从映像创建规模集

请使用 az vmss create 创建规模集。 如果使用专用源 VM,请添加 --specialized 参数来指示它是专用映像。

当你使用 --image 的映像定义 ID 创建规模集实例时,创建的规模集将使用该映像的可用最新版本。 如果需要映像的特定版本,请确保在定义 时包含映像版本--image ID。

  • 最新映像示例/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Compute/galleries/myGallery/images/myImage

  • 特定映像示例/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.Compute/galleries/myGallery/images/myImage/versions/1.0.0

在以下示例中,规模集为:

  • 名为 myScaleSet
  • 使用最新版本的 myImageDefinition 镜像。
  • 已配置为可信启动。
export MY_IMAGE_DEF_ID=$(az sig image-definition show --resource-group $MY_GALLERY_RG_NAME --gallery-name $MY_GALLERY_NAME --gallery-image-definition $MY_IMAGE_DEF_NAME --query "id" --output tsv)
export MY_SCALE_SET_RG_NAME="myResourceGroup$RANDOM_ID"
export MY_SCALE_SET_NAME="myScaleSet$RANDOM_ID"

az group create --name $MY_SCALE_SET_RG_NAME --location chinanorth2

az vmss create \
   --resource-group $MY_SCALE_SET_RG_NAME \
   --name $MY_SCALE_SET_NAME \
   --orchestration-mode flexible \
   --image $MY_IMAGE_DEF_ID \
   --specialized \
   --security-type TrustedLaunch

创建和配置所有的规模集资源和 VM 需要几分钟时间。

可以使用 Azure 基于角色的访问控制 (Azure RBAC) 跨订阅共享映像,并且可以在库、映像定义或映像版本级别共享它们。 任何对映像版本具有读取权限的用户,即使跨订阅,也能够使用映像版本部署 VM。

我们建议您在图库级别与其他用户共享。

下面的示例:

  • 使用 az sig show 获取映像库的对象 ID。
  • 使用 az role assignment create 授予对库的访问权限。
    • 使用对象 ID 作为分配的范围。
    • 使用已登录用户的 ID 作为被分派人进行演示。 在测试或生产代码中使用此代码时,请确保更新被分派人以反映你希望谁能够访问此映像。 有关如何使用 Azure RBAC 共享资源的详细信息,请参阅使用 Azure CLI 添加或删除 Azure 角色分配。 ,连同一个电子邮件地址,使用 az role assignment create 为用户授予对共享映像库的访问权限。
export MY_GALLERY_ID=$(az sig show --resource-group $MY_GALLERY_RG_NAME --gallery-name $MY_GALLERY_NAME --query "id" --output tsv)
export CALLER_ID=$(az ad signed-in-user show --query id -o tsv)

az role assignment create \
   --role "Reader" \
   --assignee $CALLER_ID \
   --scope $MY_GALLERY_ID

清理资源

若要删除规模集和其他资源,请使用 az group delete 删除资源组及其所有资源。 --no-wait 参数会将控制权返回给提示符,而无需等待操作完成。 --yes 参数将确认是否希望删除资源,而不会有额外提示。

后续步骤

在本教程中,你已了解如何使用 Azure CLI 为虚拟机规模集创建和使用自定义虚拟机映像:

  • 创建 Azure Compute Gallery
  • 创建专用映像定义
  • 创建映像版本
  • 从专用映像创建规模集
  • 分享图片库

请继续学习下一教程,了解如何将应用程序部署到规模集。