Skip to main content

排查组织中的 GitHub 托管运行器的 Azure 专用网络配置问题

了解如何在创建Azure专用网络配置时解决常见问题,以便在Azure VNet中使用 GitHub 托管的运行程序。

谁可以使用此功能?

Enterprise owners can configure private networking for GitHub-hosted runners at the enterprise level.

排查为企业中的 GitHub 托管的运行器配置私有网络的问题

允许为企业中的组织创建网络配置

默认情况下,企业中的组织无法创建新的网络配置,只能继承企业级网络配置。 企业所有者可以设置策略,允许企业中的组织创建独立于企业的网络配置。 有关详细信息,请参阅“为企业中的GitHub托管运行器配置私有网络”。

在 GitHub

中创建网络配置之前,请配置 Azure 资源

在 GitHub 中添加网络配置_前_,请确保已配置 Azure 资源。

支持的区域

该服务 GitHub Actions 支持 Azure 提供的所有区域的子集。 为了方便服务与子网之间的 GitHub Actions 通信,子网必须位于支持的区域之一。

注意

如果在数据驻留上使用GHE.com,那么支持的区域会有所不同。 请参阅“GHE.com 的网络详细信息”。

在 GitHub.com 上支持以下区域。

  • AustraliaEast
  • BrazilSouth
  • CanadaCentral
  • CanadaEast
  • CentralUs
  • EastAsia
  • EastUs
  • EastUs2
  • FranceCentral
  • GermanyWestCentral
  • JapanWest
  • KoreaCentral
  • NorthCentralUs
  • NorthEurope
  • NorwayEast
  • SouthCentralUs
  • SoutheastAsia
  • SouthIndia
  • SwedenCentral
  • SwitzerlandNorth
  • UkSouth
  • UkWest
  • WestUs
  • WestUs2
  • WestUs3

Azure 专用网络支持以下区域中的 GPU 运行程序。

  • EastUs
  • NorthCentralUs
  • SouthCentralUs
  • WestUs

Azure 专用网络支持以下区域中的 arm64 运行程序。

  • CentralUs
  • EastUs
  • EastUs2
  • NorthCentralUs
  • SouthCentralUs
  • WestUs
  • WestUs2
  • WestUs3

我们将很快启动一个流程,请求支持新区域。 你也可以使用全球虚拟网络对等互连来连接不同 Azure 区域的虚拟网络。 有关详细信息,请参阅 Azure 文档中的虚拟网络对等互连

运行器无法连接到 Internet

          GitHub

托管运行器需要能够建立到 GitHub 以及 GitHub Actions 的其他必要 URL 的出站连接。

如果 GitHub Actions 无法与运行器通信,池将永远无法使运行器上线,因此不会拾取任何作业。 这种情况下,池将会显示以下错误代码。

VNetInjectionFailedToConnectToInternet

要解决此问题,请确保已根据“配置 Azure 资源”过程配置 Azure 资源。

部署范围已锁定

可以在 Azure 订阅或资源组上放置锁,阻止创建或删除 NIC。

阻止 NIC 创建的锁无法选取作业,而阻止 NIC 删除的锁会耗尽子网地址空间(通过继续创建 NIC),或者在服务重试部署异常时具有长时间的排队分配时间 (QTA)。

这种情况下,池将会显示以下错误代码。

RunnerDeploymentScopeLocked

若要解决此问题,请删除锁或更改未锁定的子网。

部署被策略阻止

可以在其管理组、订阅、资源组或单个资源上创建策略。 最常见的策略是要求资源具有特定标记或具有特定名称。

该策略将阻止创建 NIC,这意味着池不会选取作业,因为无法联机 VM。

这种情况下,池将会显示以下错误代码。

RunnerDeploymentBlockedByPolicy

若要解决此问题,请删除策略或更改未使用策略的子网。

子网已满

要分发的子网的 IP 地址数量有限。 每个运行器会占用一个 IP 地址。 如果服务尝试纵向扩展超出最大运行器计数设置,则会遇到部署错误。

这会影响池添加其他运行器的能力。 如果队列足够深,则可能会出现队列到分配 (QTA) 次数增加。 作业仍将得到处理,但不能在你可能期望的并发级别处理。

这种情况下,池将会显示以下错误代码。

VNetInjectionSubnetIsFull

若要解决此问题,请增加正在使用的子网大小,或减少池的最大运行器计数以匹配子网大小。

无法删除子网

在某些情况下,无法删除子网,因为它已应用了服务关联链接 (SAL)。 有关详细信息,请参阅“为组织中的 GitHub 托管的运行器配置专用网络”。

如果需要识别与子网关联的网络设置资源,可以运行以下 curl 命令。 要获取 Azure Entra 令牌,请参阅 Azure 文档。 使用用于创建资源的相同 api-version

curl --request GET \
  --url "https://management.azure.com/subscriptions/{subscriptionId}/providers/GitHub.Network/NetworkSettings?api-version={api-version}&subnetId={subnetId}" \
  --header 'Content-Type: application/json' \
  --header "Authorization: Bearer {entra_token}"

错误的 NSG 或防火墙规则

“配置 Azure 资源的过程列出了所需的开放端口。” 但是,你的生产网络可能较复杂,具有多个下游代理或防火墙。

如果运行器未能上线,就不会选取任何作业。 设置过程中,您可能需要设置 runner 应用程序,并与 GitHub Actions 服务进行通信以指示其已准备就绪,还需提取和安装反滥用工具。 如果其中任一进程失败,运行器将无法选取任何作业。

如果你遇到这些问题,尝试在用于 GitHub 托管运行器专用网络的同一子网上设置虚拟机。 但是,如果已建立服务关联链接 (SAL),则无法执行此操作。

如果已就地设置 SAL,请尝试在虚拟网络中设置类似的子网,并将虚拟机置于该网络上。 然后尝试在它上注册自承载运行程序。

配置 Azure 资源时 HTTP 请求负载错误

运行命令来配置 Azure 资源时,请确保使用正确的 API 版本和 businessId 属性。 如果使用其他属性,则命令可能会返回以下错误。

(HttpRequestPayloadAPISpecValidationFailed) HTTP request payload failed validation against API specification with one or more errors. Please see details for more information.

如果遇到此错误,可以通过使用 ---debug 标志运行命令来查看详细信息。

在不正确级别配置的网络设置

如果网络设置是使用组织的 databaseId 而不是企业的 databaseId 配置的,则会发生错误。 错误消息将指示无法使用提供的资源 ID 创建专用网络,因为该资源 ID 已与其他企业或组织关联。 要解决此问题,请删除现有网络设置,并使用企业 databaseId 重新创建它们。

故障转移网络未切换流量

注意

VNET 故障转移处于 公共预览版 阶段,可能会发生变化。 主网络和故障转移网络之间的切换是一个渐进的过程。 在转换期间,运行器可能同时在两个网络上运行。 根据测试,完整转换大约需要 15 分钟。 确保这两个子网在此期间保持可访问性。

如果启用故障转移网络后似乎未重新路由运行器流量,请检查以下内容:

  • 确保正确配置故障转移子网的 Azure 资源(VNET/子网、NSG/防火墙、网络设置)。 遵循用于主子网的相同“配置 Azure 资源”过程。
  • 确认故障转移网络已添加到正确的网络配置中,并且该配置已关联到合适的 Runner 组。

故障转移子网无法访问

如果在启用故障转移网络后运行程序无法连接,则可能是针对故障转移子网配置的 Azure 资源出现问题。

GitHub 启动的故障转移后无法切换回主网络

  1. 托管计算网络 设置中导航到网络配置。
  2. 单击网络配置旁边的编辑图标。 单击“编辑配置”。
  3. 单击“禁用故障转移 VNET”****,将运行器流量返回主子网。

如果你无法禁用故障转移,请确保主子网上的 Azure 资源正常且可访问。 验证主子网的 Azure 区域中没有持续中断。