对在 Azure 中部署云服务(经典)时的分配失败进行故障排除

重要

从 2024 年 9 月 1 日开始,已弃用所有客户的云服务(经典版)。 从 2024 年 10 月开始,Microsoft 将停止并关闭任何正在运行的现有部署,数据将永久性丢失。 新部署应使用基于 Azure 资源管理器的新型部署模型 Azure 云服务(外延支持)

总结

将实例部署到云服务或者添加新的 Web 角色或辅助角色实例时,Azure 会分配计算资源。 在执行这些操作时,甚至在达到 Azure 订阅限制之前,有时可能会收到错误。 本文说明一些常见分配故障的原因,并建议可能的补救方法。 规划服务的部署时,本信息可能也有用。

如果本文未解决 Azure 问题,请访问 Microsoft Q & A 和 Stack Overflow 上的 Azure 论坛。 可以在这些论坛上发布问题。 还可提交 Azure 支持请求。 若要提交支持请求,请在 Azure 支持页上提交。

背景 - 分配的工作原理

Azure 数据中心的服务器分区成群集。 会在多个群集中尝试新的云服务分配请求。 将第一个实例部署到云服务时(不管是部署到过渡环境还是生产环境),都会将该云服务固定到某个群集。 云服务的任何进一步部署都会发生在同一个群集。 在本文中,此状态称为“固定到群集”。下图演示了在多个群集中尝试的正常分配的情况。 第二个关系图说明了固定到群集 2 的分配情况,因为这是托管现有的云服务 CS_1 的位置。

分配图

发生分配故障的原因

当分配请求固定到某个群集时,由于可用的资源池仅限于某个群集,很可能找不到可用的资源。 此外,如果分配请求固定到群集,但群集不支持所请求的资源类型,则即使群集具有免费资源,请求也会失败。 接下来的关系图说明由于唯一候选群集没有可用的资源,导致已固定的分配失败的情况。 图 4 说明由于唯一候选群集不支持所请求的虚拟机 (VM) 大小(虽然群集有可用的资源),导致已固定的分配失败的情况。

固定分配故障

云服务分配失败疑难解答

错误消息

在 Azure 门户中,导航到你的云服务,并在侧栏中选择“操作日志(经典)”来查看日志。

查看这些异常的进一步解决方案:

异常类型 错误消息 解决方案
FabricInternalServerError 操作失败,错误代码为“InternalError”,错误消息为“服务器遇到了内部错误。 请重试请求。” FabricInternalServerError 故障排除
ServiceAllocationFailure 操作失败,错误代码为“InternalError”,错误消息为“服务器遇到了内部错误。 请重试请求。” ServiceAllocationFailure 故障排除
LocationNotFoundForRoleSize 操作“{Operation ID}”失败:“请求的 VM 层当前不可用于此订阅的区域 ({Region ID}) 中。 请尝试其他层或部署到其他位置。” LocationNotFoundForRoleSize 故障排除
ConstrainedAllocationFailed Azure 操作“{Operation ID}”失败,代码为 Compute.ConstrainedAllocationFailed。 详细信息:分配失败;无法满足请求中的约束。 请求的新服务部署绑定至地缘组,或以虚拟网络为目标,或此托管服务下已经有部署。 上述任一情况都会将新的部署局限于特定的 Azure 资源。 请稍后重试,或尝试减少 VM 大小或角色实例数目。 或者,可能的话,移除约束,或尝试部署到其他区域。 ConstrainedAllocationFailed 故障排除
OverconstrainedAllocationRequest 由于部署请求约束,无法预配此部署所需的 VM 大小(或 VM 大小的组合)。 可能的话,请尝试放宽约束(例如虚拟网络绑定)、部署到不具有其他部署的托管服务及不同的地缘组(或不具有地缘组的托管服务),或尝试部署到不同的区域。 OverconstrainedAllocationRequest 故障排除

示例错误消息:

“Azure 操作‘{operation id}’失败,代码为 Compute.ConstrainedAllocationFailed。 详细信息:分配失败;无法满足请求中的约束。 请求的新服务部署绑定至地缘组,或以虚拟网络为目标,或此托管服务下已经有部署。 上述任一情况都会将新的部署局限于特定的 Azure 资源。 请稍后重试,或尝试减少 VM 大小或角色实例数目。 或者,可能的话,删除先前提到的约束,或尝试部署到不同的区域。”

常见问题

以下是造成分配请求被固定到单个群集的常见分配案例。

  • 部署到过渡槽 - 如果某个云服务在任一槽中存在部署,则会将整个云服务固定到特定的群集。 这意味着,如果生产槽中已存在部署,则只能将新的过渡部署分配到与生产槽相同的群集中。 如果群集已接近容量,则请求可能失败。
  • 缩放 - 将新实例添加到现有云服务时,必须在同一群集中进行分配。 通常可分配小型缩放请求,但情况并非总是如此。 如果群集已接近容量限制,则请求可能失败。
  • 相关性组 - 该区域任何群集中的结构可以将新的部署分配到空的云服务,除非云服务已固定到某个相关性组。 部署尝试在同一群集上使用同一相关性组。 如果群集已接近容量限制,则请求可能失败。
  • 相关性组虚拟网络 - 旧式虚拟网络已绑定到相关性组而不是区域,而这些虚拟网络中的云服务则会固定到相关性组群集。 固定的群集中会发生对此类型的虚拟网络的部署尝试。 如果群集已接近容量限制,则请求可能失败。

解决方案

  1. 重新部署到新的云服务 - 这种解决方案很可能是最成功的,因为它允许平台从该区域的所有群集中进行选择。

    • 将工作负荷部署到新的云服务
    • 更新 CNAME 或 A 记录,以将流量指向新的云服务
    • 一旦零流量流向旧站点,就可以删除旧的云服务。 此解决方案应该不会导致停机。
  2. 删除生产槽和暂存槽 - 此解决方案会保留现有的域名系统 (DNS) 名称,但会导致应用程序停机。

    • 请删除现有云服务的生产槽位和过渡槽位,使云服务为空,然后
    • 在现有云服务中创建新部署。 此解决方案会重新尝试区域中所有群集的分配。 确保云服务未绑定到相关性组。
  3. 保留 IP - 此解决方案会保留现有 IP 地址,但会导致应用程序停机。

    • 请使用 PowerShell 为现有部署创建 ReservedIP

      New-AzureReservedIP -ReservedIPName {new reserved IP name} -Location {location} -ServiceName {existing service name}
      
    • 按照 #2,确保在服务的 CSCFG 中指定新的 ReservedIP。

  4. 删除新部署的地缘组 - 不再建议使用地缘组。 按照 #1 的步骤部署新的云服务。 确保云服务不在相关性组中。

  5. 转换为区域虚拟网络 - 请参阅如何从相关性组迁移到区域虚拟网络(虚拟网络)