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

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

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

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

创建并配置源 VM

首先使用 New-AzResourceGroup 创建资源组,然后使用 New-AzVM 创建 VM。 然后,此 VM 将用作映像的源。 以下示例在名为 myResourceGroup 的资源组中创建名为 myVM 的 VM:

New-AzResourceGroup -Name 'myResourceGroup' -Location 'chinanorth2'

New-AzVm `
   -ResourceGroupName 'myResourceGroup' `
   -Name 'myVM' `
   -Location 'China North 2' `
   -VirtualNetworkName 'myVnet' `
   -SubnetName 'mySubnet' `
   -SecurityGroupName 'myNetworkSecurityGroup' `
   -PublicIpAddressName 'myPublicIpAddress' `
   -OpenPorts 80,3389

存储 VM 变量

可以使用 Get-AzVM 查看资源组中可用的 VM 列表。 了解 VM 名称和资源组后,可以再次使用 Get-AzVM 来获取 VM 对象并将其存储在变量中,供稍后使用。 此示例从“myResourceGroup”资源组获取名为 myVM 的 VM,并将其分配给变量 $vm。

$sourceVM = Get-AzVM `
   -Name myVM `
   -ResourceGroupName myResourceGroup

映像库是用于启用映像共享的主要资源。 允许用于库名称的字符为大写或小写字母、数字、点和句点。 库名称不能包含短划线。 库名称在你的订阅中必须唯一。

使用 New-AzGallery 创建映像库。 以下示例在“myGalleryRG”资源组中创建名为“myGallery”的库 。

$resourceGroup = New-AzResourceGroup `
   -Name 'myGalleryRG' `
   -Location 'chinanorth2'

$gallery = New-AzGallery `
   -GalleryName 'myGallery' `
   -ResourceGroupName $resourceGroup.ResourceGroupName `
   -Location $resourceGroup.Location `
   -Description 'Azure Compute Gallery for my organization'	

创建映像定义

映像定义为映像创建一个逻辑分组。 它们用于管理有关映像版本的信息,这些版本是在其中创建的。 映像定义名称可能包含大写或小写字母、数字、点、短划线和句点。 若要详细了解可以为映像定义指定的值,请参阅映像定义

使用 New-AzGalleryImageDefinition 创建映像定义。 在此示例中,库映像名为 myGalleryImage,它是为专用化映像创建的。

$galleryImage = New-AzGalleryImageDefinition `
   -GalleryName $gallery.Name `
   -ResourceGroupName $resourceGroup.ResourceGroupName `
   -Location $gallery.Location `
   -Name 'myImageDefinition' `
   -OsState specialized `
   -OsType Windows `
   -Publisher 'myPublisher' `
   -Offer 'myOffer' `
   -Sku 'mySKU'

创建映像版本

使用 New-AzGalleryImageVersion 从 VM 创建映像版本。

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

在此示例中,映像版本为 1.0.0,该版本被复制到“中国北部 2”和“中国北部”数据中心。 选择复制的目标区域时,需要将源区域包含为复制目标。

若要从 VM 创建映像版本,请对 -Source 使用 $vm.Id.ToString()

$region1 = @{Name='China North 2';ReplicaCount=1}
$region2 = @{Name='China North';ReplicaCount=2}
$targetRegions = @($region1,$region2)

New-AzGalleryImageVersion `
   -GalleryImageDefinitionName $galleryImage.Name`
   -GalleryImageVersionName '1.0.0' `
   -GalleryName $gallery.Name `
   -ResourceGroupName $resourceGroup.ResourceGroupName `
   -Location $resourceGroup.Location `
   -TargetRegion $targetRegions  `
   -Source $sourceVM.Id.ToString() `
   -PublishingProfileEndOfLifeDate '2023-12-01'

可能需要一段时间才能将映像复制到所有目标区域。

从映像创建规模集

现在,请使用 New-AzVmss 来创建规模集,前者使用 -ImageName 参数来定义在上一步创建的自定义 VM 映像。 若要将流量分配到单独的 VM 实例,则还要创建负载均衡器。 负载均衡器包含的规则可在 TCP 端口 80 上分配流量,并允许 TCP 端口 3389 上的远程桌面流量,以及 TCP 端口 5985 上的 PowerShell 远程流量。 出现提示时,请针对规模集中的 VM 实例提供自己的所需管理凭据:

重要

从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 若要详细了解此更改以及你应采取哪些操作,请访问针对 VMSS PowerShell/CLI 客户的中断性变更 - Microsoft 社区中心

# Define variables for the scale set
$resourceGroupName = "myScaleSet"
$scaleSetName = "myScaleSet"
$location = "China North 2"

# Create a resource group
New-AzResourceGroup -ResourceGroupName $resourceGroupName -Location $location

# Create a configuration 
$vmssConfig = New-AzVmssConfig `
   -Location $location `
   -OrchestrationMode Flexible `
   -SkuCapacity 2 `
   -SkuName "Standard_D2s_v3"

# Reference the image version
Set-AzVmssStorageProfile $vmssConfig `
  -OsDiskCreateOption "FromImage" `
  -ImageReferenceId $galleryImage.Id

# Create the scale set 
New-AzVmss `
  -ResourceGroupName $resourceGroupName `
  -Name $scaleSetName `
  -VirtualMachineScaleSet $vmssConfig

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

我们建议你在映像库级别共享访问权限。 使用电子邮件地址和 Get-AzADUser cmdlet 获取用户的对象 ID,然后使用 New-AzRoleAssignment 为用户授予对库的访问权限。 请将此示例中的示例电子邮件地址 alinne_montes@contoso.com 替换为你自己的信息。

# Get the object ID for the user
$user = Get-AzADUser -StartsWith alinne_montes@contoso.com
# Grant access to the user for our gallery
New-AzRoleAssignment `
   -ObjectId $user.Id `
   -RoleDefinitionName Reader `
   -ResourceName $gallery.Name `
   -ResourceType Microsoft.Compute/galleries `
   -ResourceGroupName $resourceGroup.ResourceGroupName

清理资源

不再需要时,可以使用 Remove-AzResourceGroup cmdlet 删除资源组和所有相关资源:

# Delete the gallery 
Remove-AzResourceGroup -Name myGalleryRG

# Delete the scale set resource group
Remove-AzResourceGroup -Name myResoureceGroup

后续步骤

本教程介绍了如何通过 Azure PowerShell 创建和使用规模集的自定义 VM 映像:

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

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