Azure 虚拟机规模集的常见问题解答

获取有关 Azure 虚拟机规模集常见问题的解答。

有关规模集的热门常见问题解答

可在规模集中包含多少个 VM?

一个规模集可以包含 0 到 1,000 个基于平台映像的虚拟机 (VM),或者 0 到 600 个基于自定义映像的 VM。

规模集是否支持数据磁盘?

是的。 规模集可以定义适用于集中所有 VM 的附加数据磁盘的配置。 有关详细信息,请参阅 Azure scale sets and attached data disks(Azure 规模集和附加的数据磁盘)。 可用于存储数据的其他选项包括:

  • Azure 文件存储(SMB 共享驱动器)
  • Azure 共享磁盘
  • 操作系统驱动器
  • 临时驱动器(本地,不是以 Azure 存储为基础)
  • Azure 数据服务(例如,Azure 表存储或 Azure Blob 存储)
  • 外部数据服务(例如远程数据库)

哪些 Azure 区域支持规模集?

所有区域都支持规模集。

如何使用自定义映像创建规模集?

创建并捕获 VM 映像,然后将其用作规模集的源。 有关如何创建和使用自定义 VM 映像的教程,可以使用 Azure CLIAzure PowerShell

如果我将规模集容量从 20 减少到 15,会删除哪些 VM?

默认情况下,系统会跨可用性区域(如果规模集合部署在区域配置中)和故障域从规模集中均匀地删除虚拟机,以最大限度提高可用性。 首先删除 ID 最大的 VM。

可以通过为规模集指定横向缩减策略来更改虚拟机删除顺序。

如果将容量从 15 增加到 18,会发生什么情况?

如果将容量增加到 18,则创建 3 个新 VM。 每增加容量一次,VM 实例 ID 就会从以前的最高值(例如 20、21、22)递增。 VM 会在容错域之间进行均衡。

在一个规模集中使用多个扩展时,是否可以强制规定执行序列?

是的,可以使用规模集扩展序列化

规模集是否适用于 Azure 可用性集?

地区(非区域性)规模集使用放置组,放置组充当具有五个容错域和五个更新域的隐式可用性集。 VM 多于 100 个的规模集跨多个放置组。 有关放置组的详细信息,请参阅使用大型虚拟机规模集。 由 VM 组成的可用性集可以与由 VM 组成的规模集位于相同的虚拟网络中。 常见的配置是将控件节点 VM(经常需要独特的配置)放在可用性集中,将数据节点放在规模集中。

规模集是否可以与 Azure 可用性区域配合使用?

是的。 有关详细信息,请参阅规模集区域文档

自动缩放

Azure 自动缩放的最佳做法是什么?

在哪里可以找到使用基于主机的指标执行自动缩放时的相关指标名称?

基于 Azure 服务总线主题和队列长度的自动缩放是否有任何示例可供参考?

是的。 有关这些示例,请参阅 Azure Monitor 自动缩放常用指标

对于服务总线队列,请使用以下 JSON:

"metricName": "MessageCount",
"metricNamespace": "",
"metricResourceUri": "/subscriptions/s1/resourceGroups/rg1/providers/Microsoft.ServiceBus/namespaces/mySB/queues/myqueue"

对于存储队列,请使用以下 JSON:

"metricName": "ApproximateMessageCount",
"metricNamespace": "",
"metricResourceUri": "/subscriptions/s1/resourceGroups/rg1/providers/Microsoft.ClassicStorage/storageAccounts/mystorage/services/queue/queues/mystoragequeue"

将示例值替换为资源的统一资源标识符 (URI)。

应该使用基于主机的指标还是使用诊断扩展来执行自动缩放?

可以在 VM 上创建自动缩放设置,以使用主机级指标或基于来宾操作系统的指标。

关于受支持的指标列表,请参阅 Azure Monitor 自动缩放常用指标

关于虚拟机规模集的完整示例,请参阅使用虚拟机规模集的 Resource Manager 模板的高级自动缩放配置

此示例使用主机级 CPU 指标和消息计数指标。

如何对虚拟机规模集设置警报规则?

通过 PowerShell 或 Azure CLI,可以为虚拟机规模集创建指标警报。 有关详细信息,请参阅 Azure Monitor PowerShell 快速入门示例Azure Monitor 跨平台 CLI 快速入门示例

虚拟机规模集的 TargetResourceId 如下所示:

/subscriptions/yoursubscriptionid/resourceGroups/yourresourcegroup/providers/Microsoft.Compute/virtualMachineScaleSets/yourvmssname

可以选择任何 VM 性能计数器作为要对其设置警报的指标。 有关详细信息,请参阅 Azure Monitor 自动缩放常用指标中的基于 Resource Manager 的 Windows VM 的来宾操作系统指标Linux VM 的来宾操作系统指标

如何使用 PowerShell 对虚拟机规模集设置自动缩放?

请参阅自动缩放虚拟机规模集。 还可以使用 Azure CLIAzure 模板配置自动缩放。

如果我已停止(解除分配)VM,该 VM 是否作为自动缩放操作的一部分启动?

否。 如果自动缩放规则要求将其他 VM 实例作为规模集的一部分,则会创建新的 VM 实例。 停止(解除分配)的 VM 实例不会作为自动缩放事件的一部分启动。 但是,那些已停止(解除分配)的 VM 可以作为可缩小实例数的自动缩放事件的一部分删除,这与基于 VM 实例 ID 的顺序可以删除任何 VM 实例的方式相同。

证书

如何安全地将证书传送到 VM?

为了将证书安全地传送到 VM,可以将客户证书从客户的密钥保管库直接安装到 Windows 证书存储中。

使用以下值 JSON:

"secrets": [
    {
        "sourceVault": {
            "id": "/subscriptions/{subscriptionid}/resourceGroups/myrg1/providers/Microsoft.KeyVault/vaults/mykeyvault1"
        },
        "vaultCertificates": [
            {
                "certificateUrl": "https://mykeyvault1.vault.azure.cn/secrets/{secretname}/{secret-version}",
                "certificateStore": "certificateStoreName"
            }
        ]
    }
]

该代码支持 Windows 和 Linux。

有关详细信息,请参阅创建或更新虚拟机规模集

如何使用为 Azure Service Fabric 群集预配的自签名证书?

在 Azure shell 中,对于最新的示例,请使用以下 Azure CLI 语句,该语句将打印到 stdout:

az sf cluster create -h

自签名证书不能用于证书颁发机构提供的分布式信任,也不应用于托管企业生产解决方案的任何 Service Fabric 群集。 有关其他安全指南,请参阅 Azure Service Fabric 安全性最佳做法Service Fabric 群集安全性方案

对于使用资源管理器模板中的 Linux 虚拟机规模集进行 SSH 身份验证,是否可以指定使用的 SSH 密钥对?

是的。 用于 osProfile 的 REST API 类似于标准 VM REST API。

在模板中包括 osProfile

"osProfile": {
    "computerName": "[variables('vmName')]",
    "adminUsername": "[parameters('adminUserName')]",
    "linuxConfiguration": {
        "disablePasswordAuthentication": "true",
        "ssh": {
            "publicKeys": [
                {
                    "path": "[variables('sshKeyPath')]",
                    "keyData": "[parameters('sshKeyData')]"
                }
            ]
        }
    }
}

此 JSON 块用于此 Azure 快速入门模板

有关详细信息,请参阅创建或更新虚拟机规模集

如何删除已弃用的证书?

若要删除已弃用的证书,请从保管库证书列表中删除旧证书。 在列表中留下想要在计算机上保留的所有证书。 这不会删除所有虚拟机中的证书。 也不会向虚拟机规模集中创建的新 VM 添加证书。

若要从现有 VM 中删除证书,请使用自定义脚本扩展从证书存储中手动删除证书。

如何在预配期间将现有的 SSH 公钥注入到虚拟机规模集 SSH 层?

如果仅向 VM 提供 SSH 公钥,则不需要将公钥放在 Azure Key Vault 中。 公钥不是机密的。

可以在创建 Linux VM 时以明文形式提供 SSH 公钥:

"linuxConfiguration": {
    "ssh": {
        "publicKeys": [
            {
                "path": "path",
                "keyData": "publickey"
            }
        ]
    }
}
linuxConfiguration 元素名称 必需 类型 说明
ssh 集合 指定 Linux 操作系统的 SSH 密钥配置。
path 字符串 指定 SSH 密钥或证书应放置到的 Linux 文件路径。
keyData 字符串 指定 base64 编码的 SSH 公钥。

有关示例,请参阅 vm-sshkey GitHub 快速入门模板

添加同一个密钥保管库中的多个证书后,运行“Update-AzVmss”时为什么会收到一条错误消息?

如果尝试重新添加同一保管库,而不是使用现有源保管库的新保管库证书,可能会看到此消息。 如果要添加其他机密,Add-AzVmssSecret 命令将无法正常运行。

若要添加同一密钥保管库中的更多机密,请更新以下列表:$vmss.properties.osProfile.secrets[0].vaultCertificates

对于预期的输入结构,请参阅创建或更新虚拟机集

在密钥保管库中的虚拟机规模集对象中找到该机密。 然后,将证书引用(URL 以及机密存储名称)添加到与保管库关联的列表中。

注意

目前,不能通过使用虚拟机规模集 API 删除 VM 中的证书。

新的 VM 不具有旧证书。 但是,具有证书的 VM 和已部署的 VM 具有旧证书。

如果证书位于机密存储中,是否可以在不提供密码的情况下将证书推送到虚拟机规模集?

不需要对脚本中的密码进行硬编码。 可以使用运行部署脚本的权限来动态检索密码。 如果某个脚本可移动机密存储密钥保管库的证书,机密存储 get certificate 命令也会输出 pfx 文件的密码。

虚拟机规模集的 virtualMachineProfile.osProfile 的 Secrets 属性的工作原理是什么? 使用 certificateUrl 属性指定证书的绝对 URI 时,为什么需要 sourceVault 值?

Windows 远程管理 (WinRM) 证书引用必须在操作系统配置文件的 Secrets 属性中存在。

指示源保管库的目的在于强制实施访问控制列表 (ACL) 策略,该策略存在于用户的 Azure 云服务模型中。 如果源保管库未指定,无权在密钥保管库中部署或访问机密的用户可以通过计算资源提供程序 (CRP) 实现此目的。 即使是不存在的资源,它们也有 ACL。

如果提供错误的源保管库 ID,但提供有效的保管库 URL,轮询操作时系统会报告错误。

如果将机密添加到现有虚拟机规模集,机密会注入到现有 VM 中,还是仅注入到新 VM 中?

证书将添加到所有 VM,包括现有的 VM。 如果虚拟机规模集的 upgradePolicy 属性设置为 manual,对 VM 执行手动更新时,证书会添加到该 VM。

在 Linux VM 上,证书放在哪个位置?

若要了解如何部署 Linux VM 的证书,请参阅将证书从客户管理的 Key Vault 部署到 VM

如何将新的保管库证书添加到新的证书对象?

要将保管库证书添加到现有机密,请参阅下面的 PowerShell 示例。 仅使用一个机密对象。

$newVaultCertificate = New-AzVmssVaultCertificateConfig -CertificateStore MY -CertificateUrl https://sansunallapps1.vault.azure.cn:443/secrets/dg-private-enc/55fa0332edc44a84ad655298905f1809

$vmss.VirtualMachineProfile.OsProfile.Secrets[0].VaultCertificates.Add($newVaultCertificate)

Update-AzVmss -VirtualMachineScaleSet $vmss -ResourceGroup $rg -Name $vmssName

如果重置 VM 的映像,证书会发生什么情况?

如果重置 VM 的映像,则会删除证书。 重置映像会删除整个操作系统磁盘。

从密钥保管库中删除证书会发生什么情况?

如果从密钥保管库中删除机密,然后对所有 VM 运行 stop deallocate,则再次启动这些 VM 时,将发生失败。 失败发生的原因是 CRP 需要从密钥保管库检索机密,但它无法进行检索。 在这种情况下,可以从虚拟机规模集模型中删除证书。

CRP 组件不会持久保留客户机密。 如果对虚拟机规模集中的所有虚拟机运行 stop deallocate,会删除缓存。 在这种情况下,从密钥保管库中检索机密。

扩大时不会遇到此问题,因为(单 Fabric 租户模型中的)Azure Service Fabric 中存在机密的缓存副本。

使用 Key Vault 时,为什么需要指定证书版本?

目的是让用户更清楚地了解其 VM 上部署了哪个证书。

如果创建了 VM,并更新了密钥保管库中的机密,则新证书不会下载到 VM。 但是,VM 看上去像是引用了该证书,并且新 VM 会获取新机密。 若要避免此问题,需要引用一个机密版本。

本团队正在开发几个证书,到时将以 .cer 公钥的形式分发给大家使用。 将这些证书部署到虚拟机规模集的建议方法有哪些?

要将 .cer 公钥部署到虚拟机规模集,可以生成仅包含 .cer 文件的 .pfx 文件。 为此,请使用 X509ContentType = Pfx。 例如,将 .cer 文件作为 x509Certificate2 对象加载到 C# 或 PowerShell 中,然后调用该方法。

有关详细信息,请参阅 X509Certificate.Export 方法 (X509ContentType, String)

如何以 base64 字符串形式传入证书?

若要模拟以 base64 字符串形式传入证书,可以在 Resource Manager 模板中提取最新版本的 URL。 在 Resource Manager 模板中包含以下 JSON 属性:

"certificateUrl": "[reference(resourceId(parameters('vaultResourceGroup'), 'Microsoft.KeyVault/vaults/secrets', parameters('vaultName'), parameters('secretName')), '2015-06-01').secretUriWithVersion]"

是否需要在密钥保管库中将证书包装在 JSON 对象中?

在虚拟机规模集和 VM 中,必须在 JSON 对象中包装证书。

我们还支持 application/x-pkcs12 内容类型。

我们目前不支持 .cer 文件。 要使用.cer 文件,请将其导出到.pfx 容器中。

合规性和安全性

虚拟机规模集是否符合 PCI 规范?

虚拟机规模集是 CRP 之上的一个精简 API 层。 这两个组件是 Azure 服务树中的计算平台的一部分。

从合规性角度看,虚拟机规模集是 Azure 计算平台的基础部分。 它们与 CRP 本身共享以下内容:团队、工具、进程、部署方法、安全控制、实时 (JIT) 编译、监视和警报。 虚拟机规模集符合支付卡行业 (PCI) 规范,因为 CRP 属于当前 PCI 数据安全标准 (DSS) 证明的一部分。

有关详细信息,请参阅 Microsoft Trust Center(Microsoft 信任中心)。

是否可以将 Azure 资源的托管标识用于虚拟机规模集?

是的。 有关详细信息,请参阅托管标识概述。 可以在适用于 LinuxWindows 的 Azure 快速入门模板中查看一些示例 MSI 模板。

正在删除

删除实例时,是否遵守我在虚拟机规模集实例上设置的锁?

在 Azure 门户中,可以删除单个实例,也可以通过选择多个实例进行批量删除。 如果尝试删除带有锁的单个实例,则遵守此锁,并且你将无法删除该实例。 但是,如果批量选择多个实例,并且这些实例中的任何一个实例都带有锁,则不遵守锁。 所有选定的实例都将被删除。

在 Azure CLI 中,只能删除单个实例。 如果尝试删除带有锁的单个实例,则遵守此锁,并且你将无法删除该实例。

扩展

如何删除虚拟机规模集扩展?

若要删除虚拟机规模集扩展,请使用以下 PowerShell 示例:

$vmss = Get-AzVmss -ResourceGroupName "resource_group_name" -VMScaleSetName "vmssName"

$vmss=Remove-AzVmssExtension -VirtualMachineScaleSet $vmss -Name "extensionName"

Update-AzVmss -ResourceGroupName "resource_group_name" -VMScaleSetName "vmssName" -VirtualMacineScaleSet $vmss

可以在 $vmss 中找到 extensionName 值。

与 Azure Monitor 日志集成的虚拟机规模集模板是否有任何示例可供参考?

有关与 Azure Monitor 日志集成的虚拟机规模集模板示例,请参阅部署 Azure Service Fabric 群集,并通过使用 Azure Monitor 日志来启用监视中的第二个示例。

如何将扩展添加到虚拟机规模集中的所有 VM?

如果更新策略设置为自动,使用新扩展属性重新部署模板可更新所有 VM。

如果更新策略设置为手动,先更新扩展,并手动更新 VM 中的所有实例。

如果更新与现有虚拟机规模集关联的扩展,是否会影响现有的 VM?

如果更新虚拟机规模集模型中的扩展定义,且将 upgradePolicy 属性设置为 automatic,则会更新 VM。 如果 upgradePolicy 属性设置为 manual,扩展会标记为不匹配模型。

对现有的计算机进行服务修复或重置映像时,是否会再次运行扩展?

如果对现有 VM 执行服务修复,这种行为类似于重新启动,因此不会重新运行扩展。 如果对 VM 重置映像,该过程类似于将操作系统驱动器替换为源映像。 在这种情况下,将重新运行最新模型中的任何专用设置(如扩展)。

如何将虚拟机规模集加入到 Active Directory 域?

若要将虚拟机规模集加入到 Active Directory 域,可以定义扩展。

若要定义扩展,请使用 JsonADDomainExtension 属性:

"extensionProfile": {
    "extensions": [
        {
            "name": "joindomain",
            "properties": {
                "publisher": "Microsoft.Compute",
                "type": "JsonADDomainExtension",
                "typeHandlerVersion": "1.3",
                "settings": {
                    "Name": "[parameters('domainName')]",
                    "OUPath": "[variables('ouPath')]",
                    "User": "[variables('domainAndUsername')]",
                    "Restart": "true",
                    "Options": "[variables('domainJoinOptions')]"
                },
                "protectedsettings": {
                    "Password": "[parameters('domainJoinPassword')]"
                }
            }
        }
    ]
}

虚拟机规模集扩展尝试安装需要重新启动的内容。 应采取何种操作?

可以使用 Azure 自动化 Desired State Configuration 扩展。 如果操作系统为 Windows Server 2012 R2,Azure 将拉入 Windows Management Framework (WMF) 5.0 安装程序,重新启动,然后继续使用该配置。

如何允许一个在专用存储帐户中托管的自定义脚本?

使用存储帐户密钥和名称设置受保护的设置。 有关详细信息,请参阅自定义脚本扩展

密码

如何对虚拟机规模集中的 VM 重置密码?

可以执行以下操作:

  • 直接更改虚拟机规模集模型。 此选项仅适用于 API 2017-12-01 和更高版本。

    直接在规模集模型中更新管理凭据(例如,使用 Azure 资源浏览器、PowerShell 或 Azure CLI)。 规模集完成更新后,所有新的 VM 将获得全新凭据。 现有 VM 只有被重置映像时才获得新凭据。

  • 使用 VM 访问扩展重置密码。 请确保遵循常见问题解答所述的密码要求。

    使用 VM 访问扩展不需要重置映像,因为该扩展不会更新模型中的密码。 该扩展运行一个脚本以将密码追加到密码或 SSH 密钥文件中。 该扩展不会删除原始 SSH 密钥。 更新扩展后升级实例,从而将更新应用于所有 VM 实例上的用户名和密码。

    注意

    如果将自动升级策略设置为 manual,请手动选择实例对单个 VM 实例执行升级操作。 如果将自动升级设置为 Auto,扩展将自动升级。

    对于 Windows 虚拟机规模集,请使用以下 PowerShell 示例:

    $vmssName = "myvmss"
    $vmssResourceGroup = "myvmssrg"
    $publicConfig = @{"UserName" = "newuser"}
    $privateConfig = @{"Password" = "********"}
    
    $extName = "VMAccessAgent"
    $publisher = "Microsoft.Compute"
    $vmss = Get-AzVmss -ResourceGroupName $vmssResourceGroup -VMScaleSetName $vmssName
    $vmss = Add-AzVmssExtension -VirtualMachineScaleSet $vmss -Name $extName -Publisher $publisher -Setting $publicConfig -ProtectedSetting $privateConfig -Type $extName -TypeHandlerVersion "2.0" -AutoUpgradeMinorVersion $true
    Update-AzVmss -ResourceGroupName $vmssResourceGroup -Name $vmssName -VirtualMachineScaleSet $vmss
    

    对于 Linux 虚拟机规模集,请使用以下 Azure CLI 示例:

    az vmss extension set \
      --resource-group myResouceGroup \ 
      --vmss-name myScaleSet \
      --publisher Microsoft.OSTCExtensions \
      --name VMAccessForLinux \
      --version 1.5 \
      --protected-settings "{'username': 'newUser', 'password': 'newPassword'}"
    

网络

是否可以将网络安全组 (NSG) 分配给规模集,以便将其应用于集中的所有 VM NIC?

是的。 可以通过在网络配置文件的 networkInterfaceConfigurations 部分中引用,将 NSG 直接应用于规模集。 下面是一个示例:

"networkProfile": {
    "networkInterfaceConfigurations": [
        {
            "name": "nic1",
            "properties": {
                "primary": "true",
                "ipConfigurations": [
                    {
                        "name": "ip1",
                        "properties": {
                            "subnet": {
                                "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/virtualNetworks/', variables('vnetName'), '/subnets/subnet1')]"
                            },
                            "loadBalancerInboundNatPools": [
                                {
                                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/inboundNatPools/natPool1')]"
                                }
                            ],
                            "loadBalancerBackendAddressPools": [
                                {
                                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/loadBalancers/', variables('lbName'), '/backendAddressPools/addressPool1')]"
                                }
                            ]
                        }
                    }
                ],
                "networkSecurityGroup": {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('nsgName'))]"
                }
            }
        }
    ]
}

如何实现针对同一订阅和同一区域中的虚拟机规模集执行虚拟 IP (VIP) 交换?

如果有两个包含 Azure 负载均衡器的虚拟机规模集,并且它们位于同一订阅和区域中,可以解除分配它们的公共 IP 地址,并将公共 IP 地址分配给其他资源。 有关相信信息,请参阅 VIP 交换:Azure 资源管理器中的蓝绿部署。 但这确实意味着延迟,因为要在网络级别解除分配或分配资源。 更快的做法是将 Azure 应用程序网关与两个后端池和传递规则结合使用。 也可以使用支持快速切换暂存槽和生产槽的 Azure 应用服务托管应用程序。

如何为静态专用 IP 地址分配指定专用 IP 地址范围?

IP 地址是从指定的子网中选择的。

虚拟机规模集 IP 地址的分配方法始终为动态,但这并不意味着可以更改这些 IP 地址。 在这种情况下,动态仅意味不在 PUT 请求中指定 IP 地址。 通过使用子网设置静态集。

如何将虚拟机规模集部署到现有的 Azure 虚拟网络?

能否将规模集与加速网络结合使用?

是的。 若要使用加速网络,请在规模集的 networkInterfaceConfigurations 设置中设置 enableAcceleratedNetworkingtrue。 例如:

"networkProfile": {
    "networkInterfaceConfigurations": [
        {
            "name": "niconfig1",
            "properties": {
                "primary": true,
                "enableAcceleratedNetworking" : true,
                "ipConfigurations": [
                ]
            }
        }
    ]
}

如何配置规模集使用的 DNS 服务器?

若要创建具有自定义 DNS 配置的虚拟机规模集,请将 dnsSettings JSON 数据包添加到规模集的 networkInterfaceConfigurations 部分中。 下面是一个示例:

    "dnsSettings":{
        "dnsServers":["10.0.0.6", "10.0.0.5"]
    }

如何将规模集配置为向每个 VM 分配公共 IP 地址?

要创建向每个 VM 分配公共 IP 地址的虚拟机规模集,请确保 Microsoft.Compute/virtualMachineScaleSets 资源的 API 版本为 2017-03-30,并将 publicipaddressconfiguration JSON 数据包添加到规模集的 ipConfigurations 部分中。 下面是一个示例:

    "publicipaddressconfiguration": {
        "name": "pub1",
        "properties": {
        "idleTimeoutInMinutes": 15
        }
    }

能否配置与多个应用程序网关配合使用的规模集?

是的。 可将多个应用程序网关后端地址池的资源 ID 添加到规模集网络配置文件的 ipConfigurations 部分的 applicationGatewayBackendAddressPools 列表中。

缩放

在哪些情况下我会创建包含少于两个 VM 的虚拟机规模集?

创建包含少于两个 VM 的虚拟机规模集的原因之一为使用虚拟机规模集的弹性属性。 例如,可以部署不包含任何 VM 的虚拟机规模集来定义基础结构,这样就无需支付 VM 运行费。 然后,在准备好部署 VM 后,可以将虚拟机规模集的容量提高到生产实例计数。

可能创建包含少于两个 VM 的虚拟机规模集的另一个原因为,相比于使用离散 VM 的可用性集,不必担心可用性的问题。 此外,可以借助虚拟机规模集来使用可替代的无差别计算单元。 这种一致性是虚拟机规模集相比可用性集存在的一项重要优势。 许多无状态工作负载不跟踪单个单元。 如果工作负载下降,可以减少到一个计算单元,如果工作负载上升,可以增加到多个计算单元。

如何更改虚拟机规模集中的 VM 数目?

若要在 Azure 门户中更改虚拟机规模集中的 VM 数,请从“虚拟机规模集属性”部分,选择“缩放”窗格,并使用滚动条。

如何定义达到特定阈值时触发的自定义警报?

可以在一定程度上灵活处理指定阈值的警报。 例如,可以定义自定义的 webhook。 以下 webhook 示例取自 Resource Manager 模板:

{
    "type": "Microsoft.Insights/autoscaleSettings",
    "apiVersion": "[variables('insightsApi')]",
    "name": "autoscale",
    "location": "[parameters('resourceLocation')]",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachineScaleSets/', parameters('vmSSName'))]"
    ],
    "properties": {
        "name": "autoscale",
        "targetResourceUri": "[concat('/subscriptions/',subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Compute/virtualMachineScaleSets/', parameters('vmSSName'))]",
        "enabled": true,
        "notifications": [
            {
                "operation": "Scale",
                "email": {
                    "sendToSubscriptionAdministrator": true,
                    "sendToSubscriptionCoAdministrators": true,
                    "customEmails": [
                        "youremail@address.com"
                    ]
                },
                "webhooks": [
                    {
                        "serviceUri": "<service uri>",
                        "properties": {
                            "key1": "custommetric",
                            "key2": "scalevmss"
                        }
                    }
                ]
            }
        ]
    }
}

修补和操作

能否在现有资源组中创建规模集?

可以。

能否将规模集移到其他资源组?

是的,可以将规模集资源移到新订阅或资源组。

如何将虚拟机规模集更新为新映像? 如何管理修补?

若要将虚拟机规模集更新为新映像,或管理修补,请参阅升级虚拟机规模集

是否可以在不更改映像的情况下,使用重置映像操作来重置 VM? (也就是说,将 VM 重置为出厂设置而不是重置为新映像)

可以在不更改映像的情况下,使用重置映像操作来重置 VM。 但是,如果虚拟机规模集使用 version = latest 引用了平台映像,则调用 reimage 时,VM 可以更新为更高版本的操作系统映像。

是否可以将规模集与 Azure Monitor 日志集成?

可以,可在规模集 VM 上安装 Azure Monitor 扩展。 下面是使用 Azure CLI 的示例:

az vmss extension set --name MicrosoftMonitoringAgent --publisher Microsoft.EnterpriseCloud.Monitoring --resource-group Team-03 --vmss-name nt01 --settings "{'workspaceId': '<your workspace ID here>'}" --protected-settings "{'workspaceKey': '<your workspace key here'}"

可在 Azure 门户的 Log Analytics 工作区中查找所需的 workspaceIdworkspaceKey。 在“概述”页面上,选择“设置”磁贴。 选择顶部的“相连的源”选项卡。

注意

如果规模集 upgradePolicy 设置为“手动”,则需要通过对 VM 调用升级将扩展应用到集中的所有 VM。 在 Azure CLI 中,这是 az vmss update-instances

注意

本文最近已更新,从使用术语“Log Analytics”改为使用术语“Azure Monitor 日志”。 日志数据仍然存储在 Log Analytics 工作区中,并仍然由同一 Log Analytics 服务收集并分析。 我们正在更新术语,以便更好地反映 Azure Monitor 中的日志的角色。 有关详细信息,请参阅 Azure Monitor 术语更改

故障排除

如何启用启动诊断?

若要启用启动诊断,首先,创建存储帐户。 然后,将此 JSON 块放在虚拟机规模集 virtualMachineProfile 中,并更新虚拟机规模集:

"diagnosticsProfile": {
    "bootDiagnostics": {
        "enabled": true,
        "storageUri": "http://yourstorageaccount.blob.core.chinacloudapi.cn"
    }
}

创建新 VM 时,VM 的 InstanceView 属性显示屏幕截图的详细信息。 下面是一个示例:

"bootDiagnostics": {
    "consoleScreenshotBlobUri": "https://o0sz3nhtbmkg6geswarm5.blob.core.chinacloudapi.cn/bootdiagnostics-swarmagen-4157d838-8335-4f78-bf0e-b616a99bc8bd/swarm-agent-9574AE92vmss-0_2.4157d838-8335-4f78-bf0e-b616a99bc8bd.screenshot.bmp",
    "serialConsoleLogBlobUri": "https://o0sz3nhtbmkg6geswarm5.blob.core.chinacloudapi.cn/bootdiagnostics-swarmagen-4157d838-8335-4f78-bf0e-b616a99bc8bd/swarm-agent-9574AE92vmss-0_2.4157d838-8335-4f78-bf0e-b616a99bc8bd.serialconsole.log"
}

如何排查其他问题?

虚拟机属性

如何在不发出多个调用的情况下获取每个 VM 的属性信息? 例如,对于虚拟机规模集中的 100 个 VM,如何获取每个 VM 的的容错域?

可以通过针对以下资源 URI 执行 REST API GET 来调用 ListVMInstanceViews

/subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/Microsoft.Compute/virtualMachineScaleSets/<scaleset_name>/virtualMachines?$expand=instanceView&$select=instanceView

请注意,当规模集使用最大分布 (platformFaultDomainCount = 1) 时,不会返回容错域,因为无法保证会将多少个容错域与此设置一起使用。

是否可将不同的扩展参数传递给虚拟机规模集中的不同 VM?

不可以。 但是,扩展可以根据它们运行所在的 VM 的唯一属性(例如计算机名)运行。 扩展还可以在 http://169.254.169.254 上查询实例元数据来获取更多关于 VM 的信息。

为什么虚拟机规模集 VM 计算机名和 VM ID 之间存在差值(例如,0、1、3)?

间隔是因为虚拟机规模集的 overprovision 属性设置为 true 的默认值。 如果 overprovision 设置为 true,创建的 VM 数量会超过请求数量。 然后,将删除多余的 VM。 在这种情况下,虽然部署可靠性得到提高,但代价是无法遵守连续命名和连续网络地址转换 (NAT) 规则。

你可将此属性设置为 false。 对于小型虚拟机规模集,不会显著影响部署可靠性。

删除虚拟机规模集中的 VM 与解除分配 VM 有什么区别? 如何在这两种做法之间做出选择?

主要区别在于, deallocate 不会删除虚拟硬盘 (VHD)。 运行 stop deallocate 会产生存储费用。 采用其中一种做法可能是由于以下原因之一:

  • 不再想要支付计算费用,但要保留 VM 的磁盘状态。
  • 想要更快速地启动一组 VM,而不是扩大虚拟机规模集。
    • 出于这种方案,可能创建了自己的自动缩放引擎,并希望以更快的速度完成端到端缩放。
  • 虚拟机规模集未均匀分布在容错域或更新域。 这可能是由于有选择地删除了 VM,或者因为过度预配后,VM 被删除。 在虚拟机规模集上先运行 stop deallocate,并运行 start,可将 VM 均匀地分布到容错域或更新域。

如何创建虚拟机规模集实例的快照?

从虚拟机规模集实例创建快照。 下面是一个示例:

$rgname = "myResourceGroup"
$vmssname = "myVMScaleSet"
$Id = 0
$location = "China North 2"

$vmss1 = Get-AzVmssVM -ResourceGroupName $rgname -VMScaleSetName $vmssname -InstanceId $Id
$snapshotconfig = New-AzSnapshotConfig -Location $location -AccountType Standard_LRS -OsType Windows -CreateOption Copy -SourceUri $vmss1.StorageProfile.OsDisk.ManagedDisk.id
New-AzSnapshot -ResourceGroupName $rgname -SnapshotName 'mySnapshot' -Snapshot $snapshotconfig

从快照创建托管磁盘。 下面是一个示例:

$snapshotName = "mySnapshot"
$snapshot = Get-AzSnapshot -ResourceGroupName $rgname -SnapshotName $snapshotName
$diskConfig = New-AzDiskConfig -AccountType Premium_LRS -Location $location -CreateOption Copy -SourceResourceId $snapshot.Id
$osDisk = New-AzDisk -Disk $diskConfig -ResourceGroupName $rgname -DiskName ($snapshotName + '_Disk')