由于配置问题,Azure Batch 节点停滞在不可用状态

Azure Batch 可能会出于多种原因将 Batch 节点的状态设置为“不可用”。 无法将任务计划到处于“不可用”状态的节点,但仍会产生费用。 在大多数情况下,Batch 服务会尝试恢复节点。 但是,如果 不可用 状态是由配置问题引起的,则无法恢复节点。 本文讨论导致节点不可用的一些常见配置问题,并提供解决方案。

问题 1:虚拟网络配置问题

本部分讨论经典简化节点通信模式中的虚拟网络(VNet)配置问题。

经典节点通信

经典节点通信模式是与 VNet 子网关联的池的原始通信方式。 此功能将在 2026 年替换为简化的通信节点模式。

在与 VNet 子网关联的池中,所有节点都处于 “不可用 ”状态。 但是节点上没有 错误代码

显示节点状态的屏幕截图。

上述症状表示 Batch 服务无法与节点通信。 在大多数情况下,它是由 VNet 配置问题引起的。 以下各节介绍了两个最常见的原因。

原因 1:缺少所需的网络安全组 (NSG) 规则

如果在子网中配置了 NSG,则必须将此 NSG 配置为至少具有入站和出站安全规则(如以下屏幕截图所示),以便 Batch 服务可以与节点通信。 如果 NSG 拒绝与指定子网中的节点的通信,Batch 服务会将节点的状态设置为 “不可用”。

  • 入站安全规则

    入站安全规则的屏幕截图。

  • 出站安全规则

    出站安全规则的屏幕截图。

解决方案 1:将 NSG 配置为具有所需的入站和出站安全规则

若要解决此问题,请将 NSG 配置为具有所需的入站和出站安全规则,如虚拟机配置池的网络安全组中 建议的:指定子网级规则

若要执行配置,请执行以下步骤:

  1. 从Azure 门户导航到池。

  2. 检查池属性以获取 VNet 和子网名称。

    网络配置的屏幕截图。

  3. 导航到 VNet。 在 VNet 页上,选择“设置>子网”。 在子网列表中,选择预期的子网。 在子网窗格中,找到 NSG。

    子网信息的屏幕截图。

  4. 导航到 NSG。 检查 NSG 页上的配置。

    NSG 配置的屏幕截图。

  5. 将此 NSG 配置为具有所需的入站和出站安全规则。

  6. 重启节点以将其返回到默认状态。

原因 2:缺少所需的用户定义的路由(UDR)

如果与池关联的 VNet 启用强制隧道,则必须添加一个 UDR,该 UDR 对应于 BatchNodeManagement.<region> Batch 帐户所在的区域中的服务标记。 否则,Batch 服务与节点之间的流量将被阻止,计算节点将不可用。

解决方案 2:添加与 BatchNodeManagement 对应的 UDR。<区域> 服务标记

若要解决此问题,请添加一个 UDR,该 UDR 对应于 BatchNodeManagement.<region> Batch 帐户所在的区域中的服务标记。 然后,将 “下一跃点”类型 设置为 Internet。 有关详细信息,请参阅 用于强制隧道的用户定义路由。

为此,请按照下列步骤进行操作:

  1. 从Azure 门户导航到池。

  2. 检查池属性以获取 VNet 和子网名称。

    网络配置的屏幕截图。

  3. 导航到 VNet。 在 VNet 页上,选择“设置>子网”。 在子网列表中,选择与预期子网关联的路由表。

    显示子网及其路由表的屏幕截图。

  4. 在根表页上,选择“添加路由>”。 在“添加路由”窗格中,添加所需的 UDR,然后将“下一跃点”类型设置为 Internet

    显示如何添加 UDR 的屏幕截图。

  5. 重启节点以将其返回到默认状态。

简化节点通信

使用简化的节点通信模式可以简化池中的 VNet 配置。 如果使用简化节点通信模式的池中的节点显示 不可用 状态,请检查以下可能的原因和解决方案进行自我故障排除。

原因 1:缺少出站 NSG 规则

应用 VNet 时,必须正确配置从内部节点到外部的出站请求。 否则,节点将变得不可用。

解决方案 1:添加出站服务标记 BatchNodeManagement。<地区>

若要解决此问题,请在 BatchNodeManagement.<region> 出站 NSG 规则中添加服务标记。

显示阻止出站请求的 NSG 规则的屏幕截图。

有关详细信息,请参阅 出站安全规则

原因 2:Batch 节点管理缺少出站访问

此原因仅适用于 Batch 池没有公共 IP 地址的方案。 默认情况下,Azure Batch 虚拟机配置池中的所有节点都分配有公共 IP 地址。 但是,用户可以在没有公共 IP 地址的情况下预配池,以限制对这些节点的访问,并减少 Internet 上这些节点的可发现性。 默认情况下,没有公共 IP 地址的池没有启用 Internet 出站访问,从而导致 Batch 节点与 Batch 节点管理服务之间的网络通信问题。

解决方案 2:配置节点管理专用终结点

导航到 Batch 帐户并选择“设置网络”,检查网络设置> 如果启用了“所选网络”或“禁用”选项,但你仅配置batchAcount专用终结点或未配置任何专用终结点,请配置nodeManagement专用终结点以确保节点之间的内部通信。

原因 3:错误的 DNS 配置可防止节点与节点管理终结点通信

如果未正确配置 DNS,则节点可能无法与 Batch 服务终结点通信。 这种情况会导致 Batch 节点停滞在不可用状态。

注意

此方案适用于启用节点管理专用终结点的批处理池。 通常,这些池具有简化的节点通信,并且不使用公共 IP 地址。

解决方案 3:修复 DNS 配置

检查 DNS 名称解析是否正常工作,并在必要时修复 DNS 配置。 验证 DNS 配置的正确过程取决于是使用自动专用 DNS 集成还是自定义 DNS 配置创建了节点管理专用终结点。

自动专用 DNS 集成 的过程:按照以下步骤验证是否已正确配置自动专用 DNS 集成:
  1. 确保专用终结点已集成到专用 DNS 区域 privatelink.batch.azure.com

    Azure 门户节点管理专用终结点的 DNS 配置页(自动配置版本)的屏幕截图。

  2. 确保此专用 DNS 区域链接到批处理池使用的同一 VNet 或对等 VNet。

    Azure 门户专用 DNS 区域的“虚拟网络链接”页的屏幕截图。

自定义 DNS 配置 的过程:按照以下步骤验证是否已正确配置自定义 DNS 并指向专用终结点 IP 地址:
  1. Azure 门户中,搜索并选择 Batch 帐户

  2. 在 Batch 帐户列表中,选择 Batch 帐户的名称。

  3. Batch 帐户的“概述”页中,找到“概要”部分,然后在“节点管理终结点”字段中复制该值。 (此值通常是具有以下格式的 URL: <guid>.<region>.service.batch.azure.com.)

    Azure 门户 Batch 帐户的“概述”页的屏幕截图。突出显示节点管理终结点值。

  4. 在 Batch 帐户的导航窗格中,找到 “设置” 标题,然后选择“ 网络”。 在 “网络 ”页中,选择“ 专用访问 ”选项卡,然后在专用终结点列表中,选择节点管理专用终结点。

    Azure 门户 Batch 帐户的“网络”页的屏幕截图。突出显示了“专用访问”选项卡和节点管理专用终结点。

  5. 在专用终结点的导航窗格中,找到 “设置” 标题,然后选择 DNS 配置。 在 DNS 配置页中,找到“客户可见 FQDN”部分,然后复制节点管理专用终结点网络接口的 IP 地址列中的值

    Azure 门户节点管理专用终结点的 DNS 配置页(手动配置版本)的屏幕截图。

  6. 在在其中创建池的同一子网中创建 Batch 节点或虚拟机(VM)。 然后,连接到 VM 并打开 PowerShell 控制台(在 Windows 中)或 Shell 控制台(在 Linux 中)。

  7. 通过运行以下 nslookup 命令来测试 DNS 名称解析。 (在 Windows 中,默认情况下安装 nslookup。在 Linux 中,安装 nslookup 或使用其他工具。

    nslookup <node-management-endpoint-url>
    

    预期结果与节点管理专用终结点的专用 IP 地址相同:

    PS C:\Users\xxx> nslookup <node-management-endpoint-url>
    Server:  UnKnown
    Address:  x.x.x.x
    
    Name:     <node-management-endpoint-url>
    Address:  <private-ipnode-management-endpoint-private-ip>
    Aliases:  <node-management-endpoint-url>
    
  8. 在端口 443 上测试与节点管理终结点 URL 的连接。 为此,请在 Windows 中运行 Test-NetConnection cmdlet,或在 Linux 中运行 Netcatnc) 命令。

    Test-NetConnection -ComputerName <node-management-endpoint-url> -Port 443
    
    nc -v <node-management-endpoint-url> 443
    

    预期结果是成功的连接,如以下示例输出中所示:

    PS C:\Users\xxx> Test-NetConnection -ComputerName <node-management-endpoint-url> -Port 443
    
    ComputerName     : <node-management-endpoint-url>
    RemoteAddress    : <private-ipnode-management-endpoint-private-ip>
    RemotePort       : 443
    InterfaceAlias   : Ethernet
    SourceAddress    : <vm-private-ip>
    TcpTestSucceeded : True
    
  9. 如果在尝试前两个步骤后遇到任何问题,请应用下表中的故障排除指南。

    问题场景 故障排除指南
    nslookup 命令的结果不符合预期。 检查批处理池 VNet 的自定义 DNS 设置。 要验证的值包括以下项:
    • 专用 DNS 区域名称
    • 自定义 DNS 服务器
    • 可能影响 DNS 名称解析的任何其他服务或组件
    nslookup 命令的结果是预期的,但 cmdlet 或nc命令的结果是意外的Test-NetConnection 检查是否存在任何服务(例如网络安全组和防火墙),这些服务可以阻止 VNet 的传出连接。

有关详细信息,请参阅 节点管理专用终结点疑难解答

问题 2:磁盘已满问题

节点处于 “不可用 ”状态,节点上会显示以下错误消息:

代码: DiskFull
消息:
节点上没有足够的磁盘空间

消息 - VM 磁盘已满。 删除节点上的作业、任务或文件以释放空间,然后重启节点。

“DiskFull”错误消息的屏幕截图。

原因:节点上的磁盘空间不足

当作业在节点上运行时,作业中的每个任务都可以生成输出数据。 此输出数据将写入 Batch 节点的文件系统。 当此数据达到节点 SKU 磁盘大小的 90% 以上时,Batch 服务会将节点标记为不可用,并阻止节点运行任何其他任务,直到 Batch 服务完成清理。

Batch 节点代理为其功能保留 10% 的磁盘空间容量。 在计划运行任何任务之前,根据 Batch 节点的容量,必须保留磁盘上的足够空间。 有关设计任务时要遵循的最佳做法,请参阅 “任务”。

解决方案:清除任务文件夹中的文件

若要解决该问题,请执行以下步骤:

  1. 使用 RDP 连接到节点。

  2. 检查磁盘上可用的空间。

    • 如果磁盘上没有足够的可用空间,请转到步骤 3。

      以下示例显示磁盘上没有足够的可用空间。 在此示例中,适用于 Windows 和 Linux 的 VM SKU Standard_D2s_V3,磁盘大小为 16 GB(GB)。

      对于 Windows,以下屏幕截图显示磁盘上可用空间不足 1 GB。

      显示可用磁盘空间小于 1 GB 的屏幕截图。

      注意

      对于 Windows,还可以使用文件资源管理器来检查磁盘空间。

      对于 Linux,以下屏幕截图显示了 100% 的已装载磁盘被利用。

      显示已装载磁盘的 100% 的屏幕截图。

      Linux 上的任务相关文件位于以下位置 ./mnt/batch/tasks/workitems/

    • 如果有足够的磁盘空间可供任务运行,但节点不可用,Batch 服务可能已根据任务的保留策略清理文件。 在这种情况下,请转到步骤 4。

  3. 导航到每个任务文件夹并清除文件。

  4. 清除文件后,重启节点。

    重启节点后,节点应处于正常状态,并且可以接受新任务。

    处于正常状态的节点的屏幕截图。

问题 3:自定义映像配置问题

有时,自定义映像配置问题(如准备不正确)可能会损坏节点。 自定义映像使用各种变量,这些变量可能导致节点不可用。

例如,Batch 节点处于 “不可用 ”或 “正在 启动”状态,并且节点上会显示以下错误代码:

代码:
BatchAgentInstallationFailure
消息:
批处理代理扩展预配在计算节点上失败

BatchAgentInstallationFailure 错误消息的屏幕截图。

原因:自定义映像 OS SKU 不同于在创建池期间选择的 OS SKU

通过Azure 门户创建 Azure Batch 池时,将映像类型设置为自定义映像 - 共享映像库,Azure 门户不会运行 OS SKU 验证。 如果选择的 OS SKU 不同于自定义映像中使用的实际 OS SKU,Azure Batch 将安装与所选 OS SKU 匹配的 Batch 节点代理,而不是自定义映像中使用的实际 OS SKU。

在以下屏幕截图中,自定义映像基于 Canonical 的 Ubuntu 20 Azure 市场 映像。 设置 OS SKU 时,Azure Batch 不会运行验证。

显示池创建期间映像类型和 OS SKU 设置的屏幕截图。

解决方案:重新创建具有自定义映像 OS SKU 的池

若要解决此问题,请重新创建池,使自定义映像中使用的 OS SKU。

有关如何创建自定义映像的详细信息,请参阅以下文章:

问题 4:托管标识配置问题

如果链接Azure 存储帐户(也称为自动存储帐户)的身份验证模式设置为 Batch 帐户托管标识(如以下屏幕截图中所示),则池标识上的错误配置会导致节点变得不可用。 有关详细信息,请参阅 行为方案

“Batch 帐户托管标识”身份验证模式的屏幕截图。

Batch 节点处于 不可用 状态,节点上会显示以下错误代码:

代码: ApplicationPackageError
消息:
为池指定的一个或多个应用程序包无效

ApplicationPackageReference - asdf:0.0.1
消息 - 资源下载失败

ApplicationPackageError 的屏幕截图。

原因:节点标识引用中定义的托管标识不会添加到池标识

创建池时,可以指定多个托管标识。 如果节点标识引用(在自动存储帐户中配置)中定义的托管标识未添加到池标识中,则节点无法使用正确的托管标识进行身份验证。 这会导致应用程序包下载过程失败,节点变得不可用。

解决方案:重新创建池以更正托管标识

若要解决此问题,请重新创建池以包含节点标识引用中定义的正确托管标识(在自动存储帐户中配置)。 有关如何使用 Batch 池托管标识的详细信息,请参阅 在批处理池中设置托管标识。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区