Azure 虛擬機器擴展集代理程式

Azure DevOps Services

Azure 虛擬機擴展集代理程式之後稱為擴展集代理程式,是一種可自動調整以符合您需求的自我裝載代理程式形式。 這種彈性可降低您不斷執行專用代理程式的需求。 與裝載於 Microsoft 的代理程式不同,您可彈性選擇執行代理程式的機器大小和映像。

如果您想要 Microsoft 裝載的代理程式,但受限於其提供的內容,您應該考慮擴展集代理程式。 以下列出一些範例:

  • 您需要比我們在原生 Microsoft 裝載代理程式中提供的記憶體、處理器、更多的記憶體或更多 IO。
  • 您需要具有機器學習特殊指示集的 NCv2 VM。
  • 您必須在沒有輸入連線的私人 VNET 中部署至私人 Azure App Service。
  • 您必須將公司防火牆開啟至特定IP位址,讓 Microsoft 裝載的代理程式可以與您的伺服器通訊。
  • 您必須限制代理程式機器的網路連線,並允許它們只連線到已核准的網站。
  • 您無法從 Microsoft 取得足夠的代理程式,以符合您的需求。
  • 您的作業超過 Microsoft 裝載的代理程式逾時。
  • 您無法將 Microsoft 裝載的平行作業分割至組織中的個別專案或小組。
  • 您想要在代理程式上執行數個連續作業,以利用累加來源和機器層級套件快取。
  • 您想要在代理程序開始接受作業之前執行組態或快取熱身。

如果您想要自我裝載的代理程式,但希望您可以簡化管理它們,您應該考慮擴展集代理程式。 以下列出一些範例:

  • 您不想全天候執行專用代理程式。 您想要取消佈建未用來執行作業的代理程式機器。
  • 您在管線中執行不受信任的程式碼,並想要在每個作業之後重新安裝代理程式機器的映像。
  • 您想要簡化代理程式基底映像的定期更新。

注意

  • 您無法使用擴充集執行 Mac 代理程式。 您只能以這種方式執行 Windows 或 Linux 代理程式。

  • 僅針對 Azure 公用 (全域服務) 雲端支援使用適用於 Azure DevOps Services 的 VMSS 代理程式集區。 目前,VMSS 代理程式集區不支援任何其他 國家雲端供應專案

  • 您不應該將 VMSS 與多個集區產生關聯。

建立擴展集

在準備建立擴展集代理程式時,您必須先在 Azure 入口網站 中建立虛擬機擴展集。 您必須以特定方式建立虛擬機擴展集,讓 Azure Pipelines 能夠管理它。 特別是,您必須 停用自動調整 ,讓 Azure Pipelines 可以決定如何根據傳入管線作業數目執行調整。 建議您使用下列步驟來建立擴展集。

在下列範例中,會使用UbuntuLTS VM映射,使用 Azure Cloud Shell 建立新的資源群組和虛擬機擴展集。

注意

在此範例中,UbuntuLTS VM 映像會用於擴展集。 如果您需要自定義的 VM 映射作為代理程式的基礎,請在建立擴展集之前建立自定義映像,方法是遵循使用自定義映像、軟體或磁碟大小建立擴展集中的步驟。

  1. 在流覽至 Azure Cloud Shellhttps://shell.azure.com/

  2. 執行下列命令來驗證您的預設 Azure 訂用帳戶。

    az account list -o table
    

    如果所需的訂用帳戶未列為預設值,請選取所需的訂用帳戶。

    az account set -s <your subscription ID>
    
  3. 為您的虛擬機擴展集建立資源群組。

    az group create \
    --location westus \
    --name vmssagents
    
  4. 在您的資源群組中建立虛擬機擴展集。 在此範例中,會指定Ubuntu2204 VM映射。

    az vmss create \
    --name vmssagentspool \
    --resource-group vmssagents \
    --image Ubuntu2204 \
    --vm-sku Standard_D2_v4 \
    --storage-sku StandardSSD_LRS \
    --authentication-type SSH \
    --generate-ssh-keys \
    --instance-count 2 \
    --disable-overprovision \
    --upgrade-policy-mode manual \
    --single-placement-group false \
    --platform-fault-domain-count 1 \
    --load-balancer "" \
    --orchestration-mode Uniform
    

    注意

    Azure Pipelines 不支援擴展集 過度布 建和 自動調整。 請確定這兩個功能都已針對擴展集停用。

    因為 Azure Pipelines 會管理擴展集,因此需要或建議使用下列設定:

    • --disable-overprovision -必填
    • --upgrade-policy-mode manual -必填
    • --load-balancer "" - Azure Pipelines 不需要負載平衡器將作業路由至擴展集代理程式集區中的代理程式,但設定負載平衡器是取得擴展集代理程式 IP 位址的一種方式,可供您用於防火牆規則。 取得擴展集代理程式的IP位址的另一個選項是使用 --public-ip-address 選項建立擴展集。 如需使用負載平衡器或公用IP位址設定擴展集的詳細資訊,請參閱 虛擬機器擴展集檔和az vmss create
    • --instance-count 2 - 此設定並非必要,但可讓您在建立代理程式集區之前,先確認擴展集已完全正常運作。 建立這兩個 VM 可能需要幾分鐘的時間。 稍後,當您建立代理程式集區時,Azure Pipelines 會刪除這兩個 VM 並建立新的 VM。

    重要

    如果您在 Windows 上使用 Azure CLI 執行此文稿,則必須以如下的單引號括住 :""--load-balancer ""--load-balancer '""'

    如果您的 VM 大小支援 暫時 OS 磁碟,則啟用暫時 OS 磁碟的下列參數是選擇性的,但建議改善虛擬機的重新映像時間。

    • --ephemeral-os-disk true
    • --os-disk-caching readonly

    重要

    所有 VM 大小都不支援暫時 OS 磁碟。 如需支援的 VM 大小清單,請參閱 Azure VM 的暫時 OS 磁碟。

    從 Azure Marketplace 或您自己的自定義映像選取任何 Linux 或 Windows 映射,以建立擴展集。 請勿在映像中預先安裝 Azure Pipelines 代理程式。 Azure Pipelines 會在布建新的虛擬機時自動安裝代理程式。 在上述範例中,我們使用純文本 UbuntuLTS 映像。 如需建立和使用自定義映像的指示,請參閱 常見問題

    選取任何 VM SKU 和記憶體 SKU。

    注意

    授權考慮會限制我們散發 Microsoft 裝載的映像。 我們無法提供這些映像,讓您在擴展集代理程式中使用。 但是,我們用來產生這些映像的腳本 開放原始碼。 您可以自由使用這些腳本,並建立自己的自定義映像。

  5. 建立延伸集之後,請流覽至 Azure 入口網站 中的擴展集,並確認下列設定:

    • 升級原則 - 手動

      Verify upgrade policy.

      您也可以執行下列 Azure CLI 命令來確認此設定。

      az vmss show --resource-group vmssagents --name vmssagentspool --output table
      
      Name            ResourceGroup    Location    Zones    Capacity    Overprovision    UpgradePolicy
      --------------  ---------------  ----------  -------  ----------  ---------------  ---------------
      vmssagentspool  vmssagents       westus               0           False            Manual
      
    • 調整 - 手動調整

      Verify manual scale policy.

重要

Azure Pipelines 不支持 實例保護。 請確定您已 停用相應縮小擴展集動作 實例保護。

協調流程模式

您可以使用兩種 協調流程模式來設定 Azure 虛擬機擴展集:統一和彈性。 統一協調流程模式的 Azure Pipelines 支援已正式推出,可供所有客戶使用。

彈性協調流程模式可讓 Azure Pipelines 以平行方式將多個擴展集作業排入佇列。 彈性協調流程的 Azure Pipelines 支援可在要求時取得,而且會受到評估。 客戶的使用模式必須指出其顯著優勢。 這類客戶具有大型擴展集、不要重複使用多個作業的代理程式、以平行方式執行多個短期作業,以及在其 VM 中獨佔使用暫時磁碟。 如果您想要使用這項功能,請連絡我們的 支援小組

建立擴展集代理程式集區

  1. 流覽至您的 Azure DevOps 專案設定,選取 [管線] 下的 [代理程式集區],然後選取 [新增集區] 以建立新的代理程式集區。

    Create agent pool.

    重要

    您可以在 [項目設定] 或 [組織設定] 中建立擴展集集集區,但當您刪除擴展集集區時,您必須從 [組織設定] 中刪除它,而不是 [項目設定]。

  2. 針對集區類型選取 [Azure 虛擬機擴展集 ]。 選取包含擴展集的 Azure 訂用帳戶,選擇 [授權],然後從該訂用帳戶中選擇所需的虛擬機擴展集。 如果您有現有的 服務連線,您可以從清單中選擇該連線,而不是訂用帳戶。

    重要

    • 若要設定擴展集代理程式集區,您必須擁有所選訂用帳戶的擁有者使用者存取 管理員 istrator 許可權。 如果您有其中一個許可權,但在選擇 [授權] 時收到錯誤,請參閱 疑難解答

    • 目前唯一支援的服務連線是以服務主體密鑰為基礎的 Azure Resource Manager (ARM) 服務連線。 根據憑證認證或受控識別的 ARM 服務連線將會失敗。 當您嘗試列出訂用帳戶中的現有擴展集時,您會看到如下的錯誤:

      Invalid Service Endpoint with Id <guid> and Scope <guid>

  3. 從該訂用帳戶選擇所需的虛擬機擴展集。

  4. 指定代理程式集區的名稱。

  5. 設定下列選項:

    • 每次使用後自動卸除虛擬機 - 每個作業都會使用 新的 VM 實例。 VM 在執行作業之後會脫機,並在挑選另一個作業之前重新製作映射。
    • 儲存狀況不良的代理程式以進行調查 - 是否要儲存 狀況不良的代理程式 VM 進行疑難解答,而不是刪除它們。
    • 擴展集中 的虛擬機數目上限 - Azure Pipelines 會自動相應放大代理程式數目,但不會超過此限制。
    • 待命 的代理程式數目 - Azure Pipelines 會自動調整代理程式的數目,但會確保一律有許多代理程式可供執行新的作業。 如果您將 [代理程序數目] 設為 [待命] 設定0,例如為了節省少量作業的成本,Azure Pipelines 只會在有作業時啟動 VM。
    • 刪除過多閑置代理程式 前幾分鐘的延遲 - 為了考慮組建負載的變動性,Azure Pipelines 會等待指定的持續時間,再刪除多餘的閑置代理程式。
    • 將 VM 設定為執行互動式測試 (僅限 Windows Server OS) - Windows 代理程式可以設定為使用自動記錄和互動式 UI 執行未刪除,也可以設定為以提升許可權執行。 核取此方塊,以使用互動式 UI 執行未刪除。 不論是哪一種情況,代理程式使用者都是 管理員 istrators 群組的成員。
  6. 設定時,選擇 [建立] 以建立代理程式集區。

使用擴展集代理程式集區

使用擴展集代理程式集區類似於任何其他代理程式集區。 您可以在傳統組建、發行或 YAML 管線中使用。 用戶權力、管線許可權、核准和其他檢查的運作方式與任何其他代理程式集區的運作方式相同。 如需詳細資訊,請參閱 Agent 集區

重要

直接對 Azure 入口網站 中的擴展集進行變更時,必須注意。

  • 您可能不會變更 Azure 入口網站 中的許多擴展集組態設定。 Azure Pipelines 會更新擴展集的組態。 您對擴展集所做的任何手動變更可能會干擾 Azure Pipelines 的作業。
  • 若沒有先刪除 Azure Pipelines 中的擴展集集區,您就無法重新命名或刪除擴展集。

Azure Pipelines 管理擴展集的方式

建立擴展集代理程式集區之後,Azure Pipelines 會自動調整代理程序機器。

Azure Pipelines 會每隔 5 分鐘取樣擴展集中的集區和虛擬機中的代理程序狀態。 相應縮小或相應放大的決定是以當時的閑置代理程式數目為基礎。 如果代理程式處於在線狀態且未執行管線作業,則代理程式會被視為閑置。 如果符合下列任一條件,Azure Pipelines 就會執行向外延展作業:

  • 閑置代理程式的數目低於您指定的待命代理程式數目
  • 佇列中沒有閑置的代理程式可供服務管線作業等候

如果符合其中一個條件,Azure Pipelines 就會增加 VM 數目。 相應放大是以集區大小上限的特定百分比遞增完成。 允許針對每個步驟建立機器 20 分鐘。

當閑置代理程式數目超過待命計數超過 30 分鐘時,Azure Pipelines 會在代理程式中進行調整(可在刪除多餘的閑置代理程式前幾分鐘使用延遲進行設定)。

若要將這一切放入範例中,請考慮使用兩個待命代理程式和四個最大代理程式所設定的擴展集代理程式集區。 讓我們假設您想要在每次使用之後卸除 VM。 此外,讓我們假設擴展集中沒有要開始使用的 VM。

  • 由於閑置代理程式的數目是0,而且閒置代理程式的數目低於2的待命計數,因此Azure Pipelines會相應放大,並將兩個VM新增至擴展集。 一旦這些代理程序上線,就會有兩個閑置的代理程式。

  • 讓我們說一個管線作業到達,並配置給其中一個代理程式。

  • 此時,閑置代理程式的數目為1,且小於2的待命計數。 因此,Azure Pipelines 會相應放大並新增 2 個以上的 VM(此範例中使用的遞增大小)。 此時,集區有三個閑置代理程式和一個忙碌代理程式。

  • 讓我們說第一個代理程式上的作業已完成。 Azure Pipelines 會將該代理程式離線以重新映像該電腦。 幾分鐘后,它又傳回了一個全新的影像。 此時,我們將有四個閑置的代理程式。

  • 如果沒有任何其他作業抵達 30 分鐘(可在刪除多餘的閑置代理程式前幾分鐘使用 延遲進行設定),Azure Pipelines 會判斷有比必要更多的閑置代理程式。 因此,它會在集區中調整為兩個代理程式。

在整個作業中,Azure Pipelines 的目標是達到待命時所需的閑置代理程式數目。 集區緩慢地擴增和縮減。 在一天的時間里,當要求在早上排入佇列時,集區會相應放大,並在晚上負載減少時相應縮小。 您可能會在各種時間觀察到比您想要的更多閑置代理程式,因為 Azure Pipelines 會逐漸聚合至您指定的條件約束。

注意

Azure Pipelines 可能需要一小時以上的時間,才能相應放大或相應放大虛擬機。 Azure Pipelines 會相應放大步驟、監視作業是否有錯誤,並藉由刪除無法使用的計算機,並在一段時間內建立新的電腦來做出回應。 這項更正作業可能需要一個多小時的時間。

為了達到最大的穩定性,會循序完成擴展集作業。 例如,如果集區需要相應放大,而且也有狀況不良的機器要刪除,Azure Pipelines 會先相應放大集區。 集區相應放大以達到待命時所需的閑置代理程式數目之後,將會刪除狀況不良的計算機,視 [儲存狀況不良的代理程式以進行調查 ] 設定而定。 如需詳細資訊,請參閱 狀況不良的代理程式。

由於取樣大小為 5 分鐘,所有代理程式都可以在短時間內執行管線,而且不會發生相應放大。

自訂管線代理程式設定

您可以在擴展集的作業系統自定義映像中定義環境變數,以自定義 Azure Pipelines Agent 的組態。 例如,擴展集代理程式工作目錄預設為 C:\a for Windows 和適用於 Linux 的 /agent/_work。 如果您想要變更工作目錄,請使用所需的工作目錄來設定名為 VSTS_AGENT_INPUT_WORK 的環境變數。 如需詳細資訊,請參閱 管線代理程式自動設定 檔。 這些範例包含:

  • VSTS_AGENT_INPUT_WORK
  • VSTS_AGENT_INPUT_PROXYURL
  • VSTS_AGENT_INPUT_PROXYUSERNAME
  • VSTS_AGENT_INPUT_PROXYPASSWORD

重要

自定義 Pipelines 代理程式時必須注意。 某些設定與其他必要設定衝突,導致代理程式無法註冊,且 VM 將會遭到刪除。 不應設定或改變這些設定:

  • VSTS_AGENT_INPUT_URL
  • VSTS_AGENT_INPUT_AUTH
  • VSTS_AGENT_INPUT_TOKEN
  • VSTS_AGENT_INPUT_USERNAME
  • VSTS_AGENT_INPUT_PASSWORD
  • VSTS_AGENT_INPUT_POOL
  • VSTS_AGENT_INPUT_AGENT
  • VSTS_AGENT_INPUT_RUNASSERVICE
  • ...與部署群組相關的任何專案。

透過自定義腳本擴充功能自定義虛擬機啟動

使用者可能想要先在其擴展集代理程式機器上執行啟動腳本,再讓這些機器開始執行管線作業。 啟動腳本的一些常見使用案例包括安裝軟體、變暖快取或擷取存放庫。 您可以安裝適用於 Windows自訂腳本擴充功能或適用於 Linux 的自定義腳本擴充功能來執行啟動腳本。

此擴充功能會在擴展集的每個虛擬機建立或重新映像之後立即執行。 執行 Azure Pipelines 代理程式擴充功能之前,將會執行自定義腳本擴充功能。

以下是建立Linux自定義腳本擴充功能的範例。

az vmss extension set \
--vmss-name <scaleset name> \
--resource-group <resource group> \
--name CustomScript \
--version 2.0 \
--publisher Microsoft.Azure.Extensions \
--settings '{ \"fileUris\":[\"https://<myGitHubRepoUrl>/myScript.sh\"], \"commandToExecute\": \"bash ./myScript.sh /myArgs \" }'

以下是為 Windows 建立自定義腳本擴充功能的範例。

az vmss extension set \
--vmss-name <scaleset name> \
--resource-group <resource group> \
--name CustomScriptExtension \
--version 1.9 \
--publisher Microsoft.Compute \
--settings '{ \"FileUris\":[\"https://<myGitHubRepoUrl>/myscript.ps1\"], \"commandToExecute\": \"Powershell.exe -ExecutionPolicy Unrestricted -File myscript.ps1 -myargs 0 \" }'

重要

自定義腳本擴充功能中執行的腳本必須傳回結束代碼 0,VM 才能完成 VM 建立程式。 如果自定義腳本擴充功能擲回例外狀況或傳回非零結束代碼,則不會執行 Azure Pipeline 擴充功能,而且 VM 不會向 Azure DevOps 代理程式集區註冊。

您的擴充功能可能會在布建所有 VM 資源之前執行,在此情況下,您會看到類似「安裝基本必要條件失敗」的錯誤。您可以藉由在文稿開頭新增 sleep 命令來修正此問題,例如 sleep 30

擴展集代理程式的生命週期

以下是 Azure Pipelines 虛擬機擴展集代理程式的作業流程

  1. Azure DevOps 擴展集代理程式集區重設大小作業會決定集區太少的閑置代理程式,而且需要相應放大。Azure Pipelines 會呼叫 Azure 擴展集,以增加擴展集容量。

  2. Azure 擴展集會開始建立新的虛擬機。 虛擬機執行之後,Azure 擴展集會循序執行任何已安裝的 VM 擴充功能。

  3. 如果已安裝自定義腳本擴充功能,則會在 Azure Pipelines 代理程式擴充功能之前執行。 如果自定義腳本擴充功能傳回非零結束代碼,則會中止 VM 建立程式,並將會刪除。

  4. 執行 Azure Pipelines 代理程式擴充功能。 此延伸模組會下載最新版的 Azure Pipelines 代理程式以及最新版的組態腳本。 您可以使用下列格式的網址找到群組態文稿:

    • Linux: https://vstsagenttools.blob.core.windows.net/tools/ElasticPools/Linux/<script_version>/enableagent.sh例如第 15 版
    • Windows: https://vstsagenttools.blob.core.windows.net/tools/ElasticPools/Windows/<script_version>/enableagent.ps1例如版本 17
  5. 如果操作系統是 Windows Server 或 Linux,組態腳本會建立名為 AzDevOps 的本機使用者。 針對 Windows 10 用戶端作業系統,代理程式會以 LocalSystem 的形式執行。 然後,腳本會解壓縮、安裝及設定 Azure Pipelines 代理程式。 在設定中,代理程式會向 Azure DevOps 代理程式集區註冊,並出現在處於離線狀態的代理程式集區清單中。

  6. 在大部分情況下,組態腳本會立即啟動代理程式,以本機使用者 AzDevOps身分執行。 代理程式會上線,並準備好執行管線作業。

    如果集區已設定為互動式UI,虛擬機會在設定代理程序之後重新啟動。 重新啟動之後,本機用戶會自動登入並啟動管線代理程式。 然後代理程式會上線,並準備好執行管線作業。

使用自定義映像、軟體或磁碟大小建立擴展集

如果您只想使用公開可用的 Azure 映射來建立具有預設 128 GB OS 磁碟的擴展集,請直接跳到步驟 10,並使用公用映像名稱 (UbuntuLTS、Win2019DataCenter 等)來建立擴展集。 否則,請遵循下列步驟來自定義您的 VM 映像。

  1. 建立具有所需 OS 映射的 VM,並選擇性地將 OS 磁碟大小從 128 GB 擴充至 <myDiskSizeGb>

    • 如果從可用的 Azure 映射開始,例如 <myBaseImage> = (Win2019DataCenter, UbuntuLTS):

      az vm create --resource-group <myResourceGroup> --name <MyVM> --image <myBaseImage> --os-disk-size-gb <myDiskSize>  --admin-username myUserName --admin-password myPassword
      
    • 如果從一般化 VHD 開始:

      1. 首先,使用所需大小的非受控磁碟建立 VM,然後轉換成受控磁碟:

        az vm create --resource-group <myResourceGroup> --name <MyVM> --image <myVhdUrl> --os-type windows --os-disk-size-gb <myDiskSizeGb> --use-unmanaged-disk --admin-username <myUserName> --admin-password <myPassword> --storage-account <myVhdStorageAccount>
        
      2. 關閉 VM

        az vm stop --resource-group <myResourceGroup> --name <MyVM>
        
      3. 解除分配 VM

        az vm deallocate --resource-group <myResourceGroup> --name <MyVM>
        
      4. 轉換為受控磁碟

        az vm convert --resource-group <myResourceGroup> --name <MyVM>
        
      5. 重新啟動 VM

        az vm start --resource-group <myResourceGroup> --name <MyVM>
        
  2. 遠端桌面 (或 SSH) 到 VM 的公用 IP 位址,以自定義映像。 您可能需要在防火牆中開啟埠,以解除封鎖 RDP (3389) 或 SSH (22) 埠。

    1. Windows - 如果 <MyDiskSizeGb> 大於 128 GB,請擴充 OS 磁碟大小以填滿您指定的 <MyDiskSizeGb>磁碟大小。

      以系統管理員身分開啟 DiskPart 工具,然後執行下列 DiskPart 命令:

      1. list volume (查看磁碟區)
      2. select volume 2 (取決於哪個磁碟區是 OS 磁碟驅動器)
      3. extend size 72000 (將磁碟驅動器擴充為 72 GB,從 128 GB 延伸至 200 GB)
  3. 在 VM 上安裝任何所需的其他軟體。

  4. 若要自定義管線代理程式用戶的許可權,您可以建立名為 AzDevOps的使用者,並將您所需的許可權授與該使用者。 如果擴展集代理程序啟動文本尚未存在,此使用者將會建立此使用者。

  5. 完成自訂時重新啟動 VM

  6. 將 VM 一般化。

    • Windows - 從管理控制台視窗:
      C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /shutdown
      
    • Linux
      sudo waagent -deprovision+user -force
      

    重要

    等候 VM 完成一般化和關機。 在 VM 停止之前,請勿繼續進行。 允許 60 分鐘。

  7. 解除分配 VM

    az vm deallocate --resource-group <myResourceGroup> --name <MyVM>
    
  8. 將 VM 標示為一般化

    az vm generalize --resource-group <myResourceGroup> --name <MyVM>
    
  9. 根據一般化映像建立 VM 映像。 執行這些步驟以更新現有的擴展集映射時,請記下輸出中的映射標識碼 URL。

    az image create  --resource-group <myResourceGroup> --name <MyImage> --source <MyVM>
    
  10. 根據自訂 VM 映像建立擴展集

    az vmss create --resource-group <myResourceGroup> --name <myScaleSet> --image <MyImage> --admin-username <myUsername> --admin-password <myPassword> --instance-count 2 --disable-overprovision --upgrade-policy-mode manual --load-balancer '""'
    
  11. 確認在擴展集中建立的兩部 VM 都已上線、具有不同的名稱,並達到成功狀態

您現在已準備好使用此擴展集建立代理程式集區。

使用新的自定義映像更新現有的擴展集

若要更新現有擴展集上的映射,請依照上 一個建立具有自定義映射、軟體或磁碟大小的 擴展集一節中的步驟,逐步 az image create 產生自定義OS映像。 記下命令輸出的 az image create 識別碼屬性 URL。 然後使用新的映射更新擴展集,如下列範例所示。 擴展集映像更新之後,將會使用新的映像來建立擴展集中的所有未來 VM。

az vmss update --resource-group <myResourceGroup> --name <myScaleSet> --set virtualMachineProfile.storageProfile.imageReference.id=<id url>

支援的作業系統

擴展集代理程式目前支援UbuntuLinux、Windows Server/DataCenter 2016/2019和 Windows 10 用戶端。

已知問題

  • 不支援Debian或 RedHat Linux 發行版。 只有 Ubuntu 是。
  • Windows 10 用戶端不支援以本機使用者身分執行管線代理程式,因此代理程式無法與 UI 互動。 代理程式會改為以本地服務的形式執行。

疑難排解問題

流覽至您的 Azure DevOps 專案設定、選取 [管線] 下的 [代理程式集區],然後選取您的代理程式集區。 選取標示為 [診斷] 的索引標籤。

[診斷] 索引標籤會顯示 Azure DevOps 在 Azure 擴展集中建立、刪除或重新映射 VM 所執行的所有動作。 診斷也會記錄嘗試執行這些動作時遇到的任何錯誤。 檢閱錯誤,以確定您的擴展集有足夠的資源可相應放大。如果您的 Azure 訂用帳戶已達到 VM、CPU 核心、磁碟或 IP 位址中的資源限制,這些錯誤會顯示在這裡。

狀況不良的代理程式

當代理程式或虛擬機無法啟動、未連線到 Azure DevOps 或意外離機時,Azure DevOps 會將失敗記錄到 [代理程式集 區的診斷 ] 索引標籤,並嘗試刪除相關聯的虛擬機。 網路設定、映像自定義和擱置重新啟動可能會導致這些問題。 連線 至 VM 進行偵錯和收集記錄有助於調查。

如果您想要讓 Azure DevOps 儲存狀況不良的代理程式 VM 進行調查,而不會在偵測到狀況不良狀態時自動刪除它,請流覽至您的 Azure DevOps 專案設定、選取 [管線] 下的 [代理程式集區],然後選取您的代理程式集區。 選擇 [設定],選取 [儲存狀況不良的代理程式以進行調查] 選項,然後選擇 [儲存]。

Save unhealthy agent setting.

現在,當擴展集中偵測到狀況不良的代理程式時,Azure DevOps 會儲存該代理程式和相關聯的虛擬機。 儲存的代理程式會顯示在代理程式集區 UI 的 [診斷] 索引標籤上。 流覽至您的 Azure DevOps 專案設定、選取 [管線] 下的 [代理程式集區]、選取您的代理程式集區、選擇 [診斷],然後記下代理程序名稱。

Saved agents card.

在 [實例] 清單中,透過 Azure 入口網站,在 Azure 虛擬機擴展集中尋找相關聯的虛擬機。

Azure portal Virtual Machine Scale Set instances.

選取實例,選擇 [連線],然後執行您的調查。

Connect to virtual machine instance.

若要在完成調查時刪除已儲存的代理程式,請流覽至您的 Azure DevOps 專案設定、選取 [管線] 下的 [代理程式集區],然後選取您的代理程式集區。 選擇標示為 [診斷] 的索引標籤。 在儲存用於調查卡片的代理程式上尋找代理程式,然後選擇 [刪除]。 這會從集區中移除代理程式,並刪除相關聯的虛擬機。

Saved agents card delete button.

常見問題集

哪裡可以找到用於 Microsoft 裝載代理程式的映像?

授權考慮會限制我們散發 Microsoft 裝載的映像。 我們無法提供這些映像,讓您在擴展集代理程式中使用。 但是,我們用來產生這些映像的腳本 開放原始碼。 您可以自由使用這些腳本,並建立自己的自定義映像。

如何? 設定擴展集代理程式以執行UI測試?

使用 Windows Server OS 建立擴展集,並在建立代理程式集區時選取 [設定 VM 以執行互動式測試] 選項。

如何刪除代理程式?

'瀏覽至您的 Azure DevOps 專案設定,選取 [管線] 下的 [代理程式集區],然後選取您的代理程式集區。 選取標示為 [代理程式] 的索引標籤。 按兩下 [已啟用] 切換按鈕以停用代理程式。 已停用的代理程式將會完成目前正在執行的管線,且不會取得其他工作。 在完成目前管線作業的幾分鐘內,代理程式將會被刪除。

我可以將擴展集代理程式集區設定為待命時有零個代理程式嗎?

是,如果您將 [代理程序數目] 設定 為 [待命 數] 設定為零,例如為了節省少量作業的成本,Azure Pipelines 只會在有作業時啟動 VM。

擴展集代理程式的成本是多少?

擴展集代理程式的定價類似於其他自我裝載代理程式。 您可以提供用來執行代理程式軟體和作業的基礎結構,並購買平行作業來支付可同時執行的所需作業數目。

針對擴展集代理程式,執行代理程式軟體和作業的基礎結構是 Azure 虛擬機器擴展集,而定價會說明 虛擬機器擴展集 定價

如需購買平行作業的資訊,請參閱設定和支付平行作業

有哪些常見問題及其解決方案?

您觀察到的閑置代理程式比各種時間想要的還要多

若要進一步瞭解發生這種情況的原因,請參閱 Azure Pipelines 如何管理擴展集。 在整個調整作業中,Azure Pipelines 的目標是達到待命時所需的閒置代理程式數目。 集區緩慢地擴增和縮減。 在一天當中,集區會隨著要求在早上排入佇列而擴增,並隨著負載在晚上消退而縮減。 這是預期的行為,因為 Azure Pipelines 會逐漸收斂為您指定的條件約束。

VMSS相應增加不會在預期的五分鐘間隔內發生

調整作業每隔五分鐘執行一次,但如果只處理一項作業,您可能會發現不會在五分鐘內發生擴大;這是目前的設計方式。

Azure DevOps Linux VM 擴展集經常無法啟動管線

當擴展集代理程式發生問題時,所要查看的第一個地方是代理程式集區中的 [診斷] 索引標籤。

此外,請考慮儲存狀況不良的 VM 以進行偵錯。 如需詳細資訊,請參閱狀況不良的代理程式

除非您刪除這些代理程式,否則儲存的代理程式會存在。 如果代理程式在 10 分鐘內未上線,則會標示為狀況不良,並盡可能儲存。 只有一個 VM 會保持儲存狀態。 如果代理程式意外離線(因為 VM 重新啟動或映像發生狀況),則不會儲存以供調查。

只會儲存代理程式無法啟動的 VM。 如果 VM 在建立期間處於失敗狀態,則不會儲存。 在此情況下,[診斷] 索引標籤中的訊息是「刪除狀況不良的計算機」,而不是「無法啟動」。

您可以檢查在代理程式集區每次使用之後自動卸除虛擬機的選項,但您會看到 VM 不會像應該一樣重新映像處理,而且只要在排入佇列時挑選新的作業

在每次建置後終止 VM 的選項,僅適用於 Windows Server 和支援的 Linux 映像。 Windows 用戶端映像不提供支援。

如果 VM 重新啟動,VMSS 會將代理程式顯示為離線

如果 VM 重新啟動是預期的行為,則會將代理程式顯示為離線。 代理程式服務只會在 systemd 內容中執行。 不過,如果電腦因為某種原因而重新啟動,則會將其視為狀況不良的 VM 並刪除。 如需詳細資訊,請參閱狀況不良的代理程式

當代理程式或虛擬機無法啟動、無法連線到 Azure DevOps 或意外離機時,Azure DevOps 會將失敗記錄到 [代理程式集區診斷] 索引標籤,並嘗試刪除相關聯的虛擬機。 網路設定、映像自定義和擱置重新啟動可能會導致這些問題。 若要避免此問題,請停用影像上的軟體更新。 您也可以連線到 VM 以偵錯並收集記錄,協助調查問題。

您可以在成本管理中看到多個標籤,例如 VMSS 的_AzureDevOpsElasticPoolTimeStamp

建立集區時,系統會將標籤新增至擴展集,將擴展集標示為使用中 (以避免兩個集區使用相同的擴展集),並針對在每次設定作業執行時更新 (每兩個小時) 的時間戳記新增另一個標籤。

您無法建立新的擴展集代理程式集區,並收到錯誤訊息,指出集區已有相同名稱

您可能會收到錯誤訊息,例如 This virtual machine scale set is already in use by pool <pool name> ,即使在刪除標籤之後,標籤仍存在於擴展集上。 刪除代理程式集區時,您會嘗試從擴展集刪除標記,但這是最佳嘗試,並在三次重試之後放棄。 此外,最多可以有兩個小時的間距,其中任何代理程式集區未使用的虛擬機擴展集無法指派給新的虛擬機擴展集。 修正此問題的方法是等待該時間間隔過去,或從 Azure 入口網站手動刪除擴展集的標籤。 在 Azure 入口網站中檢視擴展集時,請選取左側的 [標籤] 連結,並刪除標示為 _AzureDevOpsElasticPool 的標籤。

VMSS 維護作業未在代理程式上執行或取得記錄

維護作業每 24 小時執行一次。 VM 可能會在此時間之前填滿。 請考慮增加 VM 的磁碟大小,並在管線中新增指令碼以刪除內容。

如果您在 VMSS 的文稿中指定 AzDevOps 為主要系統管理員,您可能會發現擴展集實例上的代理程式設定發生問題

如果您在虛擬機擴展集的腳本中指定 AzDevOps 為主要系統管理員,您可能會在擴展集實例上觀察代理程式設定的問題(如果使用者的密碼已經存在,則會變更其密碼)。

之所以發生此問題,是因為代理程式延伸模組腳本嘗試建立用戶 AzDevOps 並變更其密碼。

注意

建立使用者並授與額外的許可權是可以的,但不應該是主要系統管理員,任何專案都不應該取決於密碼,因為密碼將會變更。 若要避免此問題,請在建立延伸集時挑選不同的使用者作為主要系統管理員,而不是 AzDevOps

由於網路安全性和防火牆設定,擴展集實例上的代理程序擴充功能安裝失敗

延伸模組必須能夠從 https://vstsagentpackage.azureedge.net/agent 下載組建代理程式檔案,而組建代理程式必須能夠向 Azure DevOps Services 註冊。 請確定此 URL 和 Azure DevOps Services 相關 IP 和 URL 已在執行個體上開啟。 如需必須在防火牆上解除封鎖的 IP 和 URL,請參閱允許的 IP 位址和網域 URL

為什麼我的擴展集代理程式設定腳本會呼叫 Add-MpPreference 並在代理程式上設定 Windows Defender?

為了改善效能和可靠性,組態腳本會呼叫 Add-MpPreferenceC:\,其中包含 ExclusionPathD:\,這會停用代理程式上這些資料夾中檔案的 Windows Defender 排程和實時掃描。 若要變更預設行為,請將名為 ELASTIC_POOLS_SKIP_DEFENDER_EXCLUSION 的環境變數設定為 true

我想增加我的集區大小。 我應該考慮什麼?

在您增加集區的大小之前,請確定針對 虛擬機器擴展集 集區設定的 Azure 虛擬網絡 具有足夠大的位址空間範圍,以容納所有新的代理程式。 如果沒有,您可能會收到類似 無法增加容量的錯誤。子網 azure-devops-agent-pool-fabrikam-fiber,位址前綴為 12.123.45.224/28,沒有足夠的容量來容納 5 個 IP 位址