您可以將受控 DevOps 集區代理程式設定為在隔離的虛擬網路或現有的虛擬網路中執行。 本文說明如何設定集區以在虛擬網路中執行代理程式。
選擇你的網路類型
受管理的 DevOps Pool 支援兩種網路配置:
- 獨立虛擬網路:每個池子都有自己的獨立虛擬網路,由 Managed DevOps Pools 服務建立和管理。
-
將代理注入現有虛擬網路:你可以帶入自己的虛擬網路和子網。 所有為池子建立的虛擬機器都會使用該子網,其他資源無法使用該子網。 你可能想將 Managed DevOps Pool 的代理加入你自己的虛擬網路,以應對以下情境:
- 您的持續整合和持續交付(CI/CD)代理程式必須透過 Azure ExpressRoute 等服務存取只能在公司網路內部使用的資源。
- 您的 CI/CD 代理程式必須存取隔離至私人端點的資源。
- 您希望透過採用自己的虛擬網路以及公司特有的防火牆規則,來實現對 CI/CD 基礎設施的網路隔離。
- 任何其他無法透過現成的受管 DevOps 集區網路功能實現的獨特使用案例。
隔離虛擬網路
預設情況下,所有池均使用Microsoft提供的虛擬網路,該網路限制所有入站流量,並具備以下出站流量設定選項。
- 預設的外撥存取連線是目前的預設,允許所有使用 Microsoft 提供的 IP 位址進行外撥流量。 Azure 中虛擬機器的預設的對外存取權已預定將被淘汰。 當預設的外撥連線被淘汰時,池將預設設定為一個靜態 IP 位址。
- 你可以將您的資源池設定為使用最多 16 個靜態出站 IP 位址,而不是使用預設的出站存取。 受管理的 DevOps Pool 會在與你的 Pool 相同區域建立一個 NAT 閘道器,提供 IP 位址。 此設定允許您在管道需要存取的特定外部服務中加入特定 IP 位址。
- NAT 閘道會產生額外的 Azure 成本。 您可以使用 Azure 成本計算機來建立其成本的模型。 欲了解更多資訊,請參閱 Azure NAT Gateway 定價。
重要
如果你在建立池後修改靜態 IP 位址數量,IP 位址可能會被更改,更新操作完成後你需要取得新的 IP 位址並更新外部服務的允許清單。
建立池時要設定 IP 位址設定,請到網路分頁。要更新現有的池,請到設定>網路。
選擇「無」作為「透過公網 IP 路由」選項,以使用預設的外撥存取。
選擇 Microsoft 提供的 IP, 以設定靜態出站 IP 位址,並指定你想使用的靜態 IP 數量。 Managed DevOps Pools 會幫你建立一個 NAT 閘道,並管理 IP 位址。
備註
有一個已知問題:如果你的池子設定了 受管理身份,API 呼叫不會回傳該 ipAddresses 屬性,除非 DevOpsInfrastructure 服務主體被指派為 受管理身份操作員角色。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
授予此角色並非靜態 IP 位址能夠運作的必要條件。 即使沒有這個角色指派,你仍可在 Azure 入口網站的 網路 頁面查看分配的 IP 位址。
注入至現有虛擬網路的代理程式
您可以透過以下步驟設定您的池的代理使用虛擬網路:
上述步驟會委派子網路,以供集區獨佔存取。 其他集區或資源無法使用子網路。
集區可以使用多個子網,將多個集區連線到相同的虛擬網路。 每個子網路都會分配並與自己的集區相關聯。
建立或帶入您的虛擬網路和子網
子網路必須具備足夠的位址空間,以容納您希望關聯之集區的最大大小,這包括 Azure 在子網路中保留的五個 IP 位址。
如果您使用 ExpressRoute,您必須暫時卸除或變更資源群組上的管理鎖定,以允許寫入。
重要
集區和虛擬網路必須位於相同的區域中。 否則,當您嘗試建立集區或更新網路設定時,您會收到類似下列的錯誤:「虛擬網路 MDPVN 位於 eastus 區域中,但集區 mdpnonprodsub 位於 australiaeast 區域中。 這些必須在同一地區。
對於 DevOpsInfrastructure 服務主體,賦予讀者和網路參與者的存取權限。
請確定 DevOpsInfrastructure 主體在虛擬網路上具有 Reader 和 Network Contributor 存取權。
您可以建立具有下列權限的自訂角色,而不是使用內建角色:
Microsoft.Network/virtualNetworks/*/readMicrosoft.Network/virtualNetworks/subnets/join/actionMicrosoft.Network/virtualNetworks/subnets/serviceAssociationLinks/validate/actionMicrosoft.Network/virtualNetworks/subnets/serviceAssociationLinks/writeMicrosoft.Network/virtualNetworks/subnets/serviceAssociationLinks/delete
為服務關聯連結存取建立自定義角色。 您可以在 [ 存取控制 ] 索引標籤上的資源群組或訂用帳戶層級建立範例角色,如下列範例所示。
檢查 DevOps Infrastructure 的存取主要權限
選取虛擬網路的存取控制 (IAM),然後選取 [檢查存取]。
搜尋並選取 DevOpsInfrastructure。
確認您具有 「讀者 」層級存取權。 確認已指派
Microsoft.Network/virtualNetworks/subnets/join/action、Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/validate/action和Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/write的存取權。 您的自定義角色應該會出現在這裡。
如果 DevOpsInfrastructure 主體沒有這些許可權,請新增這些許可權。 選取虛擬網路的 存取控制 (IAM), 然後選取 授與此資源的存取權。
將子網委派給 Microsoft.DevOpsInfrastructure/pools
在入口網站中,開啟子網路屬性,然後在Microsoft.DevOpsInfrastructure/pools下選取。 選取 [儲存]。
此程式會委派子網路以取得集區的獨佔存取權。 其他集區或資源無法使用子網路。 若要將多個集區連線到相同的虛擬網路,您必須使用多個子網路。 每個子網路都必須被指派並與自己的集區建立關聯。 您可以在 此子網路委派概觀中找到有關子網路委派的詳細資訊。
將子網路委派給 Microsoft.DevOpsInfrastructure/pools之後,您可以更新集區以使用子網路。
將子網路與您的集區建立關聯
若要建立新的集區,請移至 [網路] 索引標籤。若要更新現有的集區,請移至 [設定>網路],然後選取 [插入現有虛擬網路>的代理程式設定]。
選取您委派給的 [訂用帳戶]、[虛擬網路] 和
Microsoft.DevOpsInfrastructure/pools] 值,然後選取 [確定]。
網路更新完成之後,集區中新建立的資源將會使用委派的子網路。
重要
當您更新集區時,請勿在虛擬網路上放置 [刪除] 鎖。 在集區更新作業期間,受控 DevOps 集區會在子網路上建立 服務關聯連結 。 如果更新失敗,受控 DevOps 集區會嘗試清除服務關聯連結,但如果有 刪除鎖定 ,您會收到 InUseSubnetCannotBeDeleted 錯誤。 受控 DevOps 集區無法刪除服務關聯連結,這會讓子網路處於鎖定狀態 (無法刪除)。 若要解決此問題,請移除 刪除 鎖定,然後重試更新作業。
如需詳細資訊,請參閱 將鎖定套用至 Azure 資源之前要考慮的事項。
限制輸出連線
如果你的網路上有系統(例如網路安全群組或防火牆)限制外接連線,你需要將某些端點加入允許清單,才能完全支援受管理的 DevOps 池。 這些端點分為全域所需的端點 (在任何使用受控 DevOps 集區的機器上都需要) 和特定案例所需的端點。 除非另有說明,否則所有端點都是 HTTPS。
啟動受控 DevOps 集區的必要端點
如果你沒有將這些端點加入允許清單,機器將無法作為受管 DevOps 池服務的一部分上線,且你無法在池上運行管線:
-
*.prod.manageddevops.microsoft.com:用來與受管理 DevOps 集區服務通訊的受管理 DevOps 集區端點。 -
rmprodbuilds.azureedge.net:用來下載已管理的 DevOps 集區工作二進位檔和啟動指令碼。 工作程式的二進位檔代理部分是從rm-agent.prod.manageddevops.microsoft.com下載的(以前從agent.prod.manageddevops.microsoft.com下載),這涵蓋在之前必需的*.prod.manageddevops.microsoft.com項目中。 -
*.queue.core.windows.net:用於與受管理的 DevOps 集區服務通訊的工作者佇列。
連線到 Azure DevOps 的必要端點
如果你不把這些端點加入允許清單,機器可能會上線,甚至進入 已分配 狀態,但卻無法與 Azure DevOps 溝通,因為 Azure DevOps 服務的任務代理無法連線或無法啟動。
-
download.agent.dev.azure.com:Azure DevOps 代理程式的內容傳遞網路 (CDN) 位置,用來下載 Azure DevOps 代理程式 (先前vstsagentpackage.azureedge.net,如需詳細資訊,請參閱 Azure DevOps 的 Edgio CDN 即將淘汰) 。 -
dev.azure.com:需要處理與 Azure DevOps 的通訊。
Linux 機器的必要端點
啟動 Ubuntu 機器需要這些端點,但如果集區只使用 Windows,則不需要這些端點。 當您設定 Azure DevOps 工作代理程式時,會新增必要的套件,並 apt-get 執行命令。 如果以下端點未被加入允許清單,此程序將失敗。
-
azure.archive.ubuntu.com:佈建 Linux 機器。 此端點是 HTTP (連接埠 80),而不是 HTTPS (連接埠 443)。 -
www.microsoft.com:佈建 Linux 機器。 -
security.ubuntu.com:佈建 Linux 機器。 -
packages.microsoft.com:佈建 Linux 機器。 -
ppa.launchpad.net:佈建一些特定的 Linux 發行版。 -
dl.fedoraproject.org:佈建某些 Linux 發行版。
某些 Azure DevOps 功能所需的端點
這些選擇性端點是特定 Azure DevOps 功能在管線上運作的必要條件。 在下列集合中,萬用字元可以替換為執行管線的特定 Azure DevOps 組織。 例如,如果您的組織命名 contoso為 ,您可以使用 contoso.services.visualstudio.com ,而不是 *.services.visualstudio.com。
*.services.visualstudio.com-
*.vsblob.visualstudio.com:用於上傳和取用成品。 -
*.vssps.visualstudio.com:用於使用 Azure DevOps 進行特定功能的驗證。 *.visualstudio.com
備註
上述項目是所需的最低網域。 如果您有任何問題,請參閱 Azure DevOps 允許的 IP 位址和網域 URL 中必要網域的完整清單。
Azure 相關端點
Azure 虛擬機器 (VM) 可能會透過您的子網路將流量路由傳送至特定 Azure 功能。 針對這些要求,您可以直接透過 Azure 路由傳送要求,或透過網路啟用存取。
-
您可以透過 Azure 直接路由流量,以避免將流量負載新增至網路安全性群組或防火牆。 你不需要把以下選項中列出的網域加入允許清單。
例如,您可以使用 資料磁碟 功能來牽涉對 Azure 儲存體的網路呼叫。 當您在網路上啟用 Microsoft.Storage 服務端點時,流量會直接透過 Azure 路由傳送,這會避免您的網路規則並減少負載。
為了避免流量經過服務端點,請將該
md-*.blob.storage.azure.net網域加入你的允許清單。 需要此網域來設定資料磁碟。
Akamai CDN 傳送 IP
2025 年 5 月 1 日,Azure DevOps CDN 資產轉換至 Akamai 和 Azure Front Door 所提供的解決方案。 請確定您的網路具有對 Akamai IP 範圍的輸出存取權。 如需詳細資訊,請參閱:
如果你設定 Azure DevOps 管線在容器內執行,也需要將容器映像檔的來源(Docker 或 Azure 容器登錄檔)加入允許清單。
驗證端點連線能力
在該子網路上的資源上執行下列指令碼,以確認您是否可以在受管 DevOps 集區中使用該子網路。 此步驟可協助您驗證網路流程是否已設定為連線到所有這些可用的端點和受控 DevOps 控制平面。
重要
您必須在子網路中的資源 (例如 VM 或容器) 上執行此指令碼,以驗證網路路徑是否已從該子網路開啟到必要的端點。
若要使用 PowerShell Core 或 PowerShell 5 或更新版本執行腳本,請將下列腳本儲存為 ValidateMDPEndpoints.ps1。 執行下列 PowerShell 命令: .\ValidateMDPEndpoints.ps1 -organization "<your-organization>"。
# ValidateMDPEndpoints.ps1
param (
[string]$organization
)
$azureDevOpsUris = @(
"https://dev.azure.com",
"https://vssps.dev.azure.com",
"https://vsrm.dev.azure.com",
"https://management.azure.com",
"https://login.microsoftonline.com",
"https://graph.microsoft.com",
"https://aadcdn.msftauth.net",
"https://${organization}.visualstudio.com",
"https://${organization}.vsrm.visualstudio.com",
"https://${organization}.vstmr.visualstudio.com",
"https://${organization}.pkgs.visualstudio.com",
"https://${organization}.vssps.visualstudio.com",
"https://download.agent.dev.azure.com",
"download.agent.dev.azure.com"
)
$managedDevOpsPoolsControlPlaneUris = @(
# List of agent queue endpoints - maps to *.queue.core.windows.net
"https://rmprodaedefaultcq.queue.core.windows.net",
"https://rmprodbrsdefaultcq.queue.core.windows.net",
"https://rmprodcncdefaultcq.queue.core.windows.net",
"https://rmprodcusdefaultcq.queue.core.windows.net",
"https://rmprodeus2defaultcq.queue.core.windows.net",
"https://rmprodgwcdefaultcq.queue.core.windows.net",
"https://rmprodincdefaultcq.queue.core.windows.net",
"https://rmprodneudefaultcq.queue.core.windows.net",
"https://rmprodseadefaultcq.queue.core.windows.net",
"https://rmprodszndefaultcq.queue.core.windows.net",
"https://rmproduksdefaultcq.queue.core.windows.net",
"https://rmprodwus3defaultcq.queue.core.windows.net",
# CDN for downloading the Managed DevOps Pools agent - maps to *.prod.managedevops.microsoft.com
"rm-agent.prod.manageddevops.microsoft.com"
# List of control plane endpoints - maps to *.manageddevops.microsoft.com
"default.ae.prod.manageddevops.microsoft.com",
"default.brs.prod.manageddevops.microsoft.com",
"default.cnc.prod.manageddevops.microsoft.com",
"default.cus.prod.manageddevops.microsoft.com",
"default.eus2.prod.manageddevops.microsoft.com",
"default.gwc.prod.manageddevops.microsoft.com",
"default.inc.prod.manageddevops.microsoft.com",
"default.neu.prod.manageddevops.microsoft.com",
"default.sea.prod.manageddevops.microsoft.com",
"default.szn.prod.manageddevops.microsoft.com",
"default.uks.prod.manageddevops.microsoft.com",
"default.wus3.prod.manageddevops.microsoft.com"
)
$unreachableUris = @()
foreach ($uri in $azureDevOpsUris) {
try {
$hostName = ($uri -replace "^https?://", "") -replace "/.*", ""
$connection = Test-NetConnection -ComputerName $hostName -Port 443 -WarningAction SilentlyContinue
if (-not $connection.TcpTestSucceeded) {
$unreachableUris += $uri
}
} catch {
$unreachableUris += $uri
}
}
if ($unreachableUris.Count -eq 0) {
Write-Output "All Azure DevOps endpoints are reachable."
} else {
Write-Output "The following Azure DevOps endpoints could not be reached:"
$unreachableUris | ForEach-Object { Write-Output $_ }
}
foreach ($uri in $managedDevOpsPoolsControlPlaneUris) {
try {
$hostName = ($uri -replace "^https?://", "") -replace "/.*", ""
$connection = Test-NetConnection -ComputerName $hostName -Port 443 -WarningAction SilentlyContinue
if (-not $connection.TcpTestSucceeded) {
$unreachableUris += $uri
}
} catch {
$unreachableUris += $uri
}
}
if ($unreachableUris.Count -eq 0) {
Write-Output "All Azure Managed DevOps Pools endpoints are reachable."
} else {
Write-Output "The following Managed DevOps Pools endpoints could not be reached:"
$unreachableUris | ForEach-Object { Write-Output $_ }
}
將 Azure DevOps 代理程式設定為在 Proxy 後方執行
如果您在映像上設定 Proxy 服務,並想要在集區上執行的工作負載在此 Proxy 後面執行,則必須在映像上新增下列環境變數:
-
VSTS_AGENT_INPUT_PROXYURL:用於在後面運行的已設定代理伺服器的 URL。 -
VSTS_AGENT_INPUT_PROXYUSERNAME:使用代理所需的使用者名稱。 -
VSTS_AGENT_INPUT_PROXYPASSWORD:使用代理的密碼。
對於Windows,這些環境變數應該是系統環境變數。 對於 Linux,這些變數應該位於檔案中 /etc/environment 。 如果您設定這些系統變數不正確,或沒有在映像上設定 Proxy 服務,則佈建新代理程式會失敗,並出現網路連線問題。
如果您是從 Azure 虛擬機器擴展集代理程式移轉,而且已經在映像上使用 Proxy 環境變數,則不需要進行任何變更。 此程式會在 Azure 虛擬機器擴展集代理程式:自訂管線代理程式設定中說明。