다음을 통해 공유


관리형 DevOps 풀 네트워킹 구성

격리된 가상 네트워크 또는 기존 가상 네트워크에서 실행되도록 관리되는 DevOps 풀 에이전트를 구성할 수 있습니다. 이 문서에서는 가상 네트워크에서 에이전트를 실행하도록 풀을 구성하는 방법을 설명합니다.

네트워크 유형 선택

관리형 DevOps 풀은 다음 두 가지 유형의 네트워킹 구성을 지원합니다.

  • 격리된 가상 네트워크: 각 풀은 Managed DevOps 풀 서비스에서 만들고 관리하는 자체 격리된 가상 네트워크를 가져옵니다.
  • 기존 가상 네트워크에 삽입된 에이전트: 사용자 고유의 가상 네트워크 및 서브넷을 가져올 수 있습니다. 풀에 대해 만들어진 모든 가상 머신은 해당 서브넷을 사용하며 다른 리소스는 서브넷을 사용할 수 없습니다. 다음과 같은 시나리오를 위해 관리형 DevOps 풀의 에이전트를 사용자 고유의 가상 네트워크에 추가할 수 있습니다.
    • CI/CD(지속적인 통합 및 지속적인 업데이트) 에이전트는 Azure ExpressRoute와 같은 서비스를 통해 회사 네트워크에서만 사용할 수 있는 리소스에 액세스해야 합니다.
    • CI/CD 에이전트는 프라이빗 엔드포인트로 격리된 리소스에 액세스해야 합니다.
    • 회사별 방화벽 규칙을 사용하여 사용자 고유의 가상 네트워크를 가져와서 CI/CD 인프라를 네트워크 격리하려고 합니다.
    • 기본 관리형 DevOps 풀 네트워킹 기능으로는 달성할 수 없는 다른 고유한 사용 사례입니다.

격리된 가상 네트워크

기본적으로 모든 풀은 모든 인바운드 트래픽을 제한하고 다음과 같은 아웃바운드 트래픽 구성 옵션을 포함하는 Microsoft 제공 가상 네트워크를 사용합니다.

  1. 기본 아웃바운드 액세스 연결은 Microsoft에서 제공하는 IP 주소를 사용하여 모든 아웃바운드 트래픽을 허용하는 현재 기본값입니다. Azure의 VM에 대한 기본 아웃바운드 액세스는 사용 중지될 예정입니다. 기본 아웃바운드 액세스가 사용 중지되면 기본적으로 하나의 고정 IP 주소로 풀이 구성됩니다.
  2. 기본 아웃바운드 액세스를 사용하는 대신 최대 16개의 정적 아웃바운드 IP 주소를 사용하도록 풀을 구성할 수 있습니다. 관리되는 DevOps 풀은 IP 주소를 제공하기 위해 풀과 동일한 지역에 NAT 게이트웨이를 만듭니다. 이 구성을 사용하면 파이프라인이 액세스해야 하는 외부 서비스에서 특정 IP 주소를 허용 목록에 추가할 수 있습니다.
    • NAT 게이트웨이에는 추가 Azure 비용이 발생합니다. Azure 비용 계산기를 사용하여 비용을 모델링할 수 있습니다. 자세한 내용은 Azure NAT Gateway 가격 책정을 참조하세요.

중요한

풀을 만든 후 고정 IP 주소 수를 수정하는 경우 IP 주소는 변경될 수 있으며 업데이트 작업이 완료된 후 새 IP 주소를 가져오고 외부 서비스에서 허용 목록을 업데이트해야 합니다.

풀을 만들 때 IP 주소 설정을 구성하려면 네트워킹 탭으로 이동합니다. 기존 풀을 업데이트하려면 설정>네트워킹으로 이동합니다.

기본 아웃바운드 액세스를 사용하려면 공용 IP 주소를 통한 경로 없음을 선택합니다.

Microsoft 제공 IP를 선택하여 정적 아웃바운드 IP 주소를 구성하고 사용하려는 고정 IP 주소 수를 지정합니다. 관리형 DevOps 풀은 NAT 게이트웨이를 만들고 IP 주소를 관리합니다.

IP 주소 설정의 스크린샷.

비고

알려진 문제가 있습니다. 풀이 관리 ID로 구성된 경우, DevOpsInfrastructure 서비스 주체가 관리 ID에 관리 ID 운영자 역할을 할당하지 않으면, API 호출에서 속성을 반환하지 않습니다. 자세한 단계는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

고정 IP 주소가 작동하려면 이 역할을 부여할 필요가 없습니다. 이 역할 할당이 없으면 Azure Portal의 네트워킹 페이지에서 할당된 IP 주소를 볼 수 있습니다.

기존 가상 네트워크에 삽입된 에이전트

다음 단계를 사용하여 가상 네트워크를 사용하도록 풀의 에이전트를 구성할 수 있습니다.

  1. 가상 네트워크 및 서브넷을 만들거나 가져옵니다.
  2. 서브넷을 .에 위임합니다 Microsoft.DevOpsInfrastructure/pools.
  3. 서브넷을 풀에 연결합니다.

이전 단계에서는 풀에서 단독 액세스를 위해 서브넷을 위임합니다. 다른 풀 또는 리소스는 서브넷을 사용할 수 없습니다.

풀은 여러 서브넷을 사용하여 여러 풀을 동일한 가상 네트워크에 연결할 수 있습니다. 각 서브넷은 위임되고 자체 풀과 연결됩니다.

가상 네트워크 및 서브넷 만들기 또는 가져오기

서브넷에는 연결하려는 풀의 최대 풀 크기를 수용할 수 있는 충분한 주소 공간이 있어야 합니다(Azure가 서브넷에 예약하는 5개의 IP 주소 포함).

ExpressRoute를 사용하는 경우 리소스 그룹의 관리 잠금을 일시적으로 삭제하거나 변경하여 쓰기를 허용해야 합니다.

중요한

풀과 가상 네트워크는 동일한 지역에 있어야 합니다. 그렇지 않으면 풀을 만들거나 네트워크 구성을 업데이트하려고 할 때 다음과 유사한 오류가 발생합니다. "가상 네트워크 MDPVN은 동부 지역에 있지만 풀 mdpnonprodsub는 오스트레일리아 지역에 있습니다. 동일한 지역에 있어야 합니다."

DevOpsInfrastructure 서비스 주체에 대한 읽기 권한자 및 네트워크 기여자 액세스 권한 부여

보안 주체 DevOpsInfrastructure 가 가상 네트워크에 ReaderNetwork Contributor 액세스 권한을 가지고 있는지 확인합니다.

기본 제공 역할을 사용하는 대신 다음 권한이 있는 사용자 지정 역할을 만들 수 있습니다.

  • Microsoft.Network/virtualNetworks/*/read
  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/validate/action
  • Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/write
  • Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/delete

서비스 연관 링크 액세스를 위한 사용자 지정 역할을 만듭니다. 다음 예제와 같이 Access Control 탭의 리소스 그룹 또는 구독 수준에서 예제 역할을 만들 수 있습니다.

사용자 지정 역할 권한을 보여 주는 스크린샷

DevOpsInfrastructure에 대한 주 사용자 접근 점검

  1. 가상 네트워크에 대한 액세스 제어(IAM) 를 선택한 다음, 액세스 확인을 선택합니다.

    서브넷 위임에 대한 가상 네트워크 권한을 보여 주는 스크린샷

  2. DevOpsInfrastructure를 검색하여 선택합니다.

    AzureDevOpsInfrastructure 보안 주체를 선택하는 방법을 보여 주는 스크린샷

  3. Reader 수준의 액세스 권한이 있는지 확인합니다. Microsoft.Network/virtualNetworks/subnets/join/action, Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/validate/action, 및 Microsoft.Network/virtualNetworks/subnets/serviceAssociationLinks/write 액세스가 할당되었는지 확인합니다. 사용자 지정 역할이 여기에 표시됩니다.

    가상 네트워크 권한을 보여 주는 스크린샷

  4. DevOpsInfrastructure 보안 주체에 해당 권한이 없는 경우, 해당 권한을 추가합니다. 가상 네트워크에 대한 액세스 제어(IAM) 를 선택한 다음, 이 리소스에 대한 액세스 권한 부여를 선택합니다.

Microsoft.DevOpsInfrastructure/pools에 서브넷 위임

포털에서 서브넷 속성을 열고 Microsoft.DevOpsInfrastructure/pools에서 선택합니다. 저장을 선택합니다.

서브넷 위임을 구성하는 방법을 보여 주는 스크린샷

이 프로세스는 풀에 대한 단독 액세스를 위해 서브넷을 위임합니다. 다른 풀 또는 리소스는 서브넷을 사용할 수 없습니다. 여러 풀을 동일한 가상 네트워크에 연결하려면 여러 서브넷을 사용해야 합니다. 각 서브넷을 위임하고 자체 풀과 연결해야 합니다. 서브넷 위임에 대한 자세한 내용은 서브넷 위임 개요에서 확인할 수 있습니다.

서브넷을 위임한 후 서브넷 Microsoft.DevOpsInfrastructure/pools을 사용하도록 풀을 업데이트할 수 있습니다.

서브넷을 풀과 연결하세요

  1. 새 풀을 만들려면 네트워킹 탭으로 이동합니다. 기존 풀을 업데이트하려면 설정>네트워킹으로 이동 한 다음 기존 가상 네트워크>구성에 삽입된 에이전트를 선택합니다.

    구성 옵션을 보여 주는 스크린샷.

  2. 위임구독, Virtual NetworkMicrosoft.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 Services 작업 에이전트가 연결할 수 없거나 시작할 수 없으므로 Azure DevOps와 통신하지 못할 수도 있습니다.

  • download.agent.dev.azure.com: Azure DevOps 에이전트를 다운로드하는 데 사용되는 Azure DevOps 에이전트의 CDN(콘텐츠 배달 네트워크) 위치(이전 vstsagentpackage.azureedge.net의 경우 , Azure DevOps용 Edgio CDN 사용 중지 참조).
  • dev.azure.com: Azure DevOps와의 통신을 처리하는 데 필요합니다.

Linux 머신에 필요한 엔드포인트

이러한 엔드포인트는 Ubuntu 머신을 스핀업하는 데 필요하지만 풀에서 Windows만 사용하는 경우에는 필요하지 않습니다. Azure DevOps 작업 에이전트를 설정할 때 필요한 패키지가 추가되고 명령이 apt-get 실행됩니다. 다음 엔드포인트가 허용 목록에 추가되지 않으면 이 프로세스가 실패합니다.

  • azure.archive.ubuntu.com: Linux 시스템 프로비저닝 이 엔드포인트는 HTTPS(포트 443)가 아닌 HTTP(포트 80)입니다.
  • 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 VM(가상 머신)은 서브넷을 통해 특정 Azure 기능으로 트래픽을 라우팅할 수 있습니다. 이러한 요청의 경우 Azure를 통해 직접 요청을 라우팅하거나 네트워크를 통해 액세스를 사용하도록 설정할 수 있습니다.

  1. 서비스 엔드포인트를 통해 실행되도록 Azure 트래픽을 구성합니다.

    네트워크 보안 그룹 또는 방화벽에 처리량을 추가하지 않도록 Azure를 통해 트래픽을 직접 라우팅할 수 있습니다. 다음 옵션에 나열된 도메인을 허용 목록에 추가할 필요가 없습니다.

    예를 들어 데이터 디스크 기능을 사용하여 Azure Storage에 대한 네트워크 호출을 포함할 수 있습니다. 네트워크에서 Microsoft.Storage 서비스 엔드포인트를 사용하도록 설정하면 트래픽이 Azure를 통해 직접 라우팅되므로 네트워크 규칙을 방지하고 부하가 줄어듭니다.

  2. 서비스 엔드포인트를 통한 트래픽 라우팅을 방지하려면 허용 목록에 도메인을 추가 md-*.blob.storage.azure.net 합니다. 이 도메인은 데이터 디스크를 구성하는 데 필요합니다.

Akamai CDN 전송 IP

2025년 5월 1일, Azure DevOps CDN 자산이 Akamai 및 Azure Front Door에서 제공하는 솔루션으로 전환되었습니다. 네트워크에 Akamai IP 범위에 대한 아웃바운드 액세스 권한이 있는지 확인합니다. 자세한 내용은 다음을 참조하세요.

컨테이너 내에서 실행되도록 Azure DevOps 파이프라인을 구성하는 경우 컨테이너 이미지의 원본(Docker 또는 Azure Container Registry)도 허용 목록에 추가해야 합니다.

엔드포인트 연결 유효성 검사

해당 서브넷의 리소스에서 다음 스크립트를 실행하여 관리형 DevOps 풀에서 서브넷을 사용할 수 있는지 확인합니다. 이 단계는 네트워크 흐름이 사용 가능한 모든 엔드포인트 및 Managed 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 에이전트 구성

이미지에 프록시 서비스를 구성하고 풀에서 실행되는 워크로드가 이 프록시 뒤에서 실행되도록 하려면 이미지에 다음 환경 변수를 추가해야 합니다.

  • VSTS_AGENT_INPUT_PROXYURL: 뒤에서 실행할 구성된 프록시의 URL입니다.
  • VSTS_AGENT_INPUT_PROXYUSERNAME: 프록시를 사용하는 데 필요한 사용자 이름입니다.
  • VSTS_AGENT_INPUT_PROXYPASSWORD: 프록시를 사용할 암호입니다.

Windows의 경우 이러한 환경 변수는 시스템 환경 변수여야 합니다. Linux의 경우 이러한 변수는 /etc/environment 파일에 있어야 합니다. 이러한 시스템 변수를 잘못 설정하거나 이미지에 구성된 프록시 서비스 없이 설정하는 경우 네트워크 연결 문제로 새 에이전트의 프로비저닝이 실패합니다.

Azure Virtual Machine Scale Sets 에이전트에서 마이그레이션하고 이미지에서 프록시 환경 변수를 이미 사용하고 있는 경우 변경할 필요가 없습니다. 이 프로세스는 Azure Virtual Machine Scale Set 에이전트: 파이프라인 에이전트 구성 사용자 지정에 설명되어 있습니다.