获取有关Azure中虚拟机规模集的常见问题的解答。
有关规模集的热门常见问题解答
使用虚拟机规模集的成本是多少?
你需要为规模集使用的基础资源付费,例如虚拟机、存储和网络资源。 规模集本身不需要额外付费。
可在规模集中包含多少个 VM?
一个规模集可以包含 0 到 1,000 个基于平台映像的虚拟机 (VM),或者 0 到 600 个基于自定义映像的 VM。
规模集是否支持数据磁盘?
是的。 规模集可以定义适用于集中所有 VM 的附加数据磁盘的配置。 有关详细信息,请参阅Azure 虚拟机规模集和附加的数据磁盘。 可用于存储数据的其他选项包括:
- Azure托管磁盘 - Premium v2、Premium、Standard、Ultra
- Azure 文件存储 - 服务器消息块(SMB)或网络文件系统(NFS)共享驱动器
- Azure NetApp 文件
- Azure共享磁盘
- 操作系统驱动器
- 临时驱动器 - 本地,不受Azure 存储支持
- Azure数据服务 - 例如,Azure 表存储或Azure Blob 存储
- 外部数据服务 – 例如,远程数据库
哪些Azure区域支持规模集?
所有区域都支持规模集。
虚拟机规模集支持哪些 Azure 虚拟机库存单位 (SKU)?
所有的虚拟机 SKU 均支持虚拟机规模集。
如何使用自定义映像创建规模集?
创建并捕获虚拟机 (VM) 映像,然后将其用作规模集的源。 有关如何创建和使用自定义 VM 映像的教程,可以使用 Azure CLI 或 Azure PowerShell。
OS 映像升级和重置映像有什么差别?
操作系统映像升级是一个渐进且无中断的过程,随着时间的推移,会更新整个虚拟机规模集的操作系统映像,确保对正在运行的工作负载的影响降至最低。
重置映像是一种更直接、更具破坏性的操作,它仅影响选定的虚拟机实例,暂时停止它并重新安装操作系统。
详细了解操作系统映像升级和重置映像之间的差别。
如果我将规模集容量从 20 减少到 15,会删除哪些 VM?
默认情况下,规模集会在可用性区域和容错域间均匀移除 VM,以最大化可用性。 它会首先删除 ID 最高的 VM。
可以指定 缩小策略 以更改 VM 的删除顺序。
如果将容量从 15 增加到 18,会发生什么情况?
如果将容量增加到 18,则创建 3 个新 VM。 每次,VM 实例 ID 都会从之前的最高值递增(例如 20、21、22)。 VM 会在容错域之间进行均衡。
当规模集中的虚拟机变得不健康时会发生什么情况?
Azure根据运行状况探测信号或应用程序运行状况扩展自动替换不正常的实例。
VM 规模集是否支持托管标识?
是的,虚拟机规模集支持 Azure 托管标识。 这些允许规模集 VM 安全地访问Azure资源,例如密钥保管库,而无需在代码中提供凭据。
在一个规模集中使用多个扩展时,是否可以强制规定执行序列?
是的,可以使用规模集扩展序列化。
规模集是否能与Azure可用性集一起使用?
地区(非区域性)规模集使用放置组,放置组充当具有五个容错域和五个更新域的隐式可用性集。 包含超过 100 台虚拟机的规模集会跨越多个放置组。 有关放置组的详细信息,请参阅使用大型虚拟机规模集。 由 VM 组成的可用性集可以与由 VM 组成的规模集位于相同的虚拟网络中。 常见的配置是将控件节点 VM(经常需要独特的配置)放在可用性集中,将数据节点放在规模集中。
规模集是否适用于Azure的可用性区域?
是的。 有关详细信息,请参阅 规模集可用性区域文档。
自动缩放
Azure自动缩放的最佳做法是什么?
请参阅自动缩放虚拟机的最佳做法。
在哪里可以找到使用主机指标的自动缩放的指标名称?
请参阅 Azure Monitor 支持的指标。
是否有基于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自动缩放常见指标。
有关虚拟机规模集的完整示例,请参阅使用资源管理器模板进行虚拟机规模集的高级自动缩放配置。
此示例使用主机级 CPU 指标和消息计数指标。
如何对虚拟机规模集设置警报规则?
可以通过 PowerShell 或Azure CLI针对虚拟机规模集的指标创建警报。 有关详细信息,请参阅 Azure Monitor PowerShell 快速入门示例和Azure Monitor跨平台 CLI 快速入门示例。
虚拟机规模集的 TargetResourceId 如下所示:
/subscriptions/yoursubscriptionid/resourceGroups/yourresourcegroup/providers/Microsoft.Compute/virtualMachineScaleSets/yourvmssname
可以选择任何 VM 性能计数器作为要对其设置警报的指标。 有关详细信息,请参阅 针对基于 资源管理器 的 Windows VM 的客户操作系统指标和 针对 Linux VM 的客户操作系统指标在 Azure Monitor 自动缩放常见指标 一文中的内容。
如何使用 PowerShell 对虚拟机规模集设置自动扩展?
请参阅自动缩放虚拟机规模集群。 还可以使用 Azure CLI 和 Azure 模板配置自动缩放。
如果我已停止(解除分配)虚拟机,该虚拟机是否会作为自动扩展操作的一部分启动?
否。 需要更多容量时,自动缩放规则会创建新的 VM 实例。 在自动缩放事件期间,已停止(解除分配)的虚拟机不会启动。 但是,可以在缩放事件期间删除它们,就像任何其他 VM 实例一样,具体取决于实例 ID 顺序。
证书
如何安全地将证书传送到 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
避免将自签名证书用于分布式信任。 对于适用于企业生产解决方案的服务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 添加证书。
若要从现有 VM 中删除证书,请使用自定义脚本扩展从证书存储中手动删除证书。
如何在预配期间将现有的 SSH 公钥注入到虚拟机规模集 SSH 层?
如果仅向 VM 提供公钥 SSH 密钥,则无需将公钥放入Azure 密钥保管库。 公钥不是机密的。
可以在创建 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 会保留该证书,除非进行显式修改。
如果证书位于机密存储中,是否可以在不提供密码的情况下将证书推送到虚拟机规模集?
不需要对脚本中的密码进行硬编码。 可以使用运行部署脚本的权限来动态检索密码。 如果您有一个将证书从机密存储中的密钥保管库移动的脚本,机密存储 get certificate 命令也会输出 .pfx 文件的密码。
虚拟机规模集的 virtualMachineProfile.osProfile 的 Secrets 属性是如何运作的? 当必须使用 certificateUrl 属性指定证书的绝对 URI 时,为何需要 sourceVault 值?
Windows远程管理(WinRM)证书引用必须存在于操作系统配置文件的 Secrets 属性中。
指示源保管库的目的是强制实施用户Azure 云服务模型中存在的访问控制列表(ACL)策略。 如果源保管库未指定,无权在密钥保管库中部署或访问机密的用户可以通过计算资源提供程序 (CRP) 实现此目的。 即使是资源不存在,也存在访问控制列表(ACL)。
如果提供错误的源保管库 ID,但提供有效的保管库 URL,轮询操作时系统会报告错误。
如果将机密添加到现有虚拟机规模集,机密会注入到现有 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,则它们的重启将会失败。 发生此失败的原因是计算资源提供程序尝试从密钥保管库检索机密,但不再可用。 若要解决此问题,可以从虚拟机规模集模型中删除证书。
计算资源提供程序不会永久存储客户机密。 为虚拟机规模集中的所有 VM 运行 stop deallocate 时,将清除缓存的机密。 在这种情况下,计算资源提供程序尝试再次从密钥保管库中检索机密。
在横向扩展操作期间不会发生此问题,因为在 Azure Service Fabric(单一结构租户模型)中维护了一个机密的缓存副本。
为什么在使用密钥保管库时必须指定证书版本?
目的是让用户更清楚地了解其 VM 上部署了哪个证书。
如果创建了 VM,并更新了密钥保管库中的机密,则新证书不会下载到 VM。 但是,您的 VM 似乎引用了它,而新 VM 会获取新的秘密。 若要避免此问题,需要引用一个机密版本。
本团队正在开发几个证书,到时将以 .cer 公钥的形式分发给大家使用。 将这些证书部署到虚拟机规模集的建议方法有哪些?
要将 .cer 公钥部署到虚拟机规模集,可以使用 X509ContentType = Pfx 生成仅包含 .cer 文件的 .pfx 文件。 例如,将 .cer 文件作为 x509Certificate2 对象加载到 C# 或 PowerShell 中,然后调用该方法。
有关详细信息,请参阅 X509Certificate.Export 方法 (X509ContentType, String)。
如何以 base64 字符串形式传入证书?
若要模拟以 base64 字符串的形式传入证书,可以在资源管理器模板中提取最新版本的 URL。 在资源管理器模板中包含以下 JSON 属性:
"certificateUrl": "[reference(resourceId(parameters('vaultResourceGroup'), 'Microsoft.KeyVault/vaults/secrets', parameters('vaultName'), parameters('secretName')), '2015-06-01').secretUriWithVersion]"
是否需要在密钥保管库中将证书包装在 JSON 对象中?
在虚拟机规模集和虚拟机中,证书必须包装在 JSON 对象里。
我们还支持内容类型 application/x-pkcs12。
我们目前不支持 .cer 文件。 若要使用 .cer 文件,请将其导出到 .pfx 容器中。
合规性和安全性
虚拟机规模集 (虚拟机扩展集) PCI 合规吗?
虚拟机规模集是一种在CRP之上的简化API层。 这两个组件都是Azure服务树中计算平台的一部分。
从符合性的角度来看,虚拟机规模集是Azure计算平台的基本组成部分。 它们与计算资源提供程序本身共享以下信息:团队、工具、流程、部署方法、安全控制、实时(JIT)编译、监视和警报。 虚拟机规模集 兼容支付卡行业(PCI)标准,因为 CRP 是当前 PCI 数据安全标准(DSS)认证的一部分。
有关详细信息,请参阅 Microsoft 信任中心。
Azure资源的托管身份是否适用于虚拟机规模集?
正在删除
删除实例时,是否遵循在虚拟机规模集实例上设置的锁?
在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
可以在 extensionName 中找到 $vmss 值。
是否有与Azure Monitor日志集成的虚拟机规模集模板示例?
有关与 Azure Monitor 日志集成的虚拟机规模集模板示例,请参阅 Deploy Azure Service Fabric 群集中的第二个示例,并使用 Azure Monitor Logs启用监视。
如何将扩展添加到虚拟机规模集中的所有 VM?
如果更新策略设置为自动,使用新扩展属性重新部署模板可更新所有 VM。
如果更新策略设置为手动,先更新扩展,并手动更新 VM 中的所有实例。
如果更新与现有虚拟机规模集关联的扩展,是否会影响现有的 VM?
更新虚拟机规模集模型中的扩展定义并将 upgradePolicy 设置为 automatic 时,Azure会自动更新所有 VM 上的扩展。 但是,如果 upgradePolicy 设置为 manual扩展,则扩展将标记为与模型不同步。 在这种情况下,只有在您手动触发更新操作后,VM 实例的扩展才会更新。
对现有的计算机进行服务修复或重置映像时,是否会再次运行扩展?
如果对现有 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 自动化的期望状态配置扩展。 如果操作系统是 Windows Server 2012 R2,Azure 会拉取并安装 Windows Management Framework(WMF) 5.0,重新启动系统,然后继续执行配置。
如何运行托管在专用存储帐户中的自定义脚本?
使用存储帐户密钥和名称设置受保护的设置。 有关详细信息,请参阅自定义脚本扩展。
密码
如何重置我虚拟机规模集中的 VM 密码?
您可以执行以下操作:
直接更改虚拟机规模集模型。 此选项仅适用于 API 2017-12-01 和更高版本。
直接在规模集模型中更新管理员凭据(例如,使用Azure资源资源管理器、PowerShell 或Azure CLI)。 规模集完成更新后,所有新创建的 VM 将获得新凭据。 仅当现有虚拟机被重新映像后,它们才会获得新凭据。
使用 VM 访问扩展重置密码。 请确保遵循常见问题解答所述的密码要求。
使用 VM 访问扩展不需要重新制作镜像,因为该扩展不会更新于模型内的密码。 该扩展运行一个脚本以将密码追加到密码或 SSH 密钥文件中。 该扩展不会删除原始 SSH 密钥。 更新扩展后升级实例,从而将更新应用于所有 VM 实例上的用户名和密码。
注意
如果自动升级策略设置为
manual,则需要手动选择和升级单个 VM 实例。 如果设置为Automatic,则扩展会自动升级。 有关详细信息,请参阅 自动扩展升级。对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) 分配给规模集,以便将其应用于集中的所有虚拟机网络接口控制器 (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虚拟网络?
请参阅 将虚拟机规模集部署到现有虚拟网络。
能否将规模集与加速网络结合使用?
是的。 若要使用加速网络,请在规模集的 enableAcceleratedNetworking 设置中设置 true 为 networkInterfaceConfigurations。 例如:
"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 添加到您的规模集网络配置文件的 applicationGatewayBackendAddressPools 部分中的 ipConfigurations 列表中。
是否可以将多个 NIC 或自定义 IP 配置附加到规模集中的 VM?
是的。 使用灵活的业务流程模式时,虚拟机规模集支持每个实例的多个 NIC 和自定义 IP 配置。 这可实现复杂的网络拓扑和服务隔离。
缩放
在哪些情况下我会创建包含少于两个 VM 的虚拟机规模集?
创建包含少于两个 VM 的虚拟机规模集的原因之一为使用虚拟机规模集的弹性属性。 例如,可以部署不包含任何 VM 的虚拟机规模集来定义基础结构,这样就无需支付 VM 运行费。 然后,当您准备好部署虚拟机时,可以将虚拟机规模集的容量增加到满足生产环境实例需求的数量。
可能创建包含少于两个 VM 的虚拟机规模集的另一个原因为,相比于使用离散 VM 的可用性集,不必担心可用性的问题。 虚拟机规模集为你提供了一种使用无差别计算单元的方法,这些计算单元是可互换的。 这种统一性是虚拟机规模集与可用性集的主要区别。 许多无状态工作负载不跟踪单个单元。 如果工作负载下降,可以减少到一个计算单元,如果工作负载上升,可以增加到多个计算单元。
如何更改虚拟机规模集中的虚拟机的数量?
若要更改 Azure 门户中虚拟机规模集内的 VM 数量,请在“虚拟机规模集”Properties 部分,选择“Scaling”窗格,并使用滑块。
如何定义达到特定阈值时触发的自定义警报?
在处理指定阈值的告警时,您可以灵活选择采取的方式。 例如,可以定义自定义的 webhook。 以下 Webhook 示例来自资源管理器模板:
{
"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"
}
}
]
}
]
}
}
修补和运维
是否可以在现有资源组中创建规模集?
可以。
可以将 Scale Set 移动到其他资源组吗?
是的,可以将规模集资源移到新订阅或资源组。
如何将虚拟机规模集更新为新的镜像? 如何管理规模集中虚拟机的修补?
要将虚拟机规模集更新为新映像,或管理修补,请参阅升级虚拟机规模集。
是否可以在不更改映像的情况下,使用重置映像操作来重置 VM? 就是说,我想把 VM 重置为出厂设置,而不是重置为新映像。
可以在不更改映像的情况下,使用重置映像操作来重置 VM。 但是,如果虚拟机规模集使用 version = latest 引用了平台映像,则调用 reimage 时,VM 可以更新为更高版本的操作系统映像。
是否可以将规模集与Azure Monitor日志集成?
是的,可以通过在规模集的虚拟机上安装 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工作区中找到所需的 workspaceId 和 workspaceKey。 在“概述”页面上,选择“设置”磁贴。 选择顶部的“相连的源”选项卡。
注意
如果您的规模集 upgradePolicy 设置为“手动”,则需要通过对所有虚拟机调用升级,将扩展应用到集中的所有虚拟机上。 对于Azure CLI,请使用 az vmss update-instances。
注意
本文最近已更新,现使用术语“Azure Monitor 日志”来代替“Log Analytics”。 日志数据仍存储在Log Analytics工作区中,仍由同一Log Analytics服务收集和分析。 我们正在更新术语,以更好地反映 log 在 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 的每个故障域?
可以通过对以下资源 URI 执行 REST API ListVMInstanceViews 调用 GET:/subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/Microsoft.Compute/virtualMachineScaleSets/<scaleset_name>/virtualMachines?$expand=instanceView&$select=instanceView
注意:如果规模集使用最大分布(platformFaultDomainCount = 1),则不会返回容错域信息,因为使用此配置无法保证使用的容错域数。
是否可将不同的扩展参数传递给虚拟机规模集中的不同 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')