教程:通过 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 创建一个映像库。

如下示例中:

  • 为位于中国北部 2 的库 myGalleryRG 创建一个资源组。
  • 该库名为 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
  • 我们在中国北部区域创建一个副本,并在中国北部 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 "chinanorth=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 创建和使用规模集的自定义 VM 映像:

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

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