Skip to main content

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

了解在创建 Azure 专用网络配置,以便将 GitHub 托管的运行器与 Azure VNET 配合使用时,如何解决常见问题。

谁可以使用此功能?

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 服务与你的子网之间进行通信,你的子网必须位于受支持区域中的一个区域。

Note

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

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

  • EastUs
  • EastUs2
  • WestUs2
  • WestUs3
  • CentralUs
  • NorthCentralUs
  • AustraliaEast
  • JapanEast
  • FranceCentral
  • GermanyWestCentral
  • NorthEurope
  • NorwayEast
  • SwedenCentral
  • SwitzerlandNorth
  • UkSouth
  • SoutheastAsia
  • KoreaCentral

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

  • EastUs
  • WestUs
  • NorthCentralUs

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

  • EastUs
  • EastUs2
  • WestUs2
  • WestUs3
  • NorthCentralUs

如果所需的区域不受支持,请在此 GitHub 表单中提交新区域可用性请求。 你也可以使用全局虚拟网络对等互连连接不同 Azure 区域间的虚拟网络。 有关详细信息,请参阅 Azure 文档中的虚拟网络对等互连

运行器无法连接到 Internet

GitHub 托管的运行器需要能够发送出站到 GitHub,并需要其他必要的 URL 才能执行GitHub Actions。

如果 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 资源”过程列出了所需的打开项。 但是,你的生产网络可能较复杂,具有多个下游代理或防火墙。

如果运行器未能上线,就不会选取任何作业。 设置过程可能涉及设置运行器应用程序,并传送回 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 标志运行命令来查看详细信息。