在使用 Azure DevOps Pipeline 時看似非常神奇,一切都照著我們寫好的 CICD 步驟執行,而實際上在執行前需要先有底層運行的機器,在 DevOps 中主要有 Microsoft-hosted agents 與 Self-hosted agents 兩種可以選擇,前者是由微軟提供的環境,隨點隨用又不必自己維護版本,是大部分情況的首選;但當事情複雜起來時,就會多出各種不得不使用自架環境的原因,這時候就輪到 Self-hosted agents 登場了。
Azure Virtual Machine Scale Sets 提供了管理一組具有相同組態 VM 的功能,其中動態調整 VM 數量的能力恰巧滿足了 Pipeline 執行 CICD 的情境,本篇將逐步說明如何使用 VMSS 來建立 DevOps 上的 Self-hosted agents。
建立 VMSS
VMSS 在設定上就像建立普通 VM 一樣有非常多可以調整的項目,所以建議直接使用下方 Azure CLI 指令來建立 VMSS:
以下說明其中幾項需要注意的參數:
- image:這邊選擇 Ubuntu 22.04 版的映像來建立 VMSS,視應用的需求也能選擇建立 windows 的 agents。
- ephemeral-os-disk 與 os-disk-caching:為 VMSS 啟用暫時性 OS 磁碟,對於無狀態的工作負載,暫時性 OS 磁碟可以提高讀寫效能、加快重映像時間並降低儲存體成本,非常適用於 CICD 情境。
- vm-sku:機器的規格,因為我們想要啟用暫時性 OS 磁碟,所以記得要挑選有支援該功能的機器,其次因為暫時性 OS 磁碟會建在本機上,以 Ubuntu 來說機器至少需要 30 GB 的空間,這邊就以價錢考量先選擇 Standard_DS1_v2。
- instance-count:VMSS 中的執行個體數量,這邊設定幾台 VM 都不會影響使用,因為後續機器的數量會由 DevOps 來決定,但設定為 2 方便我們可以看到稍後與 DevOps 接上後的變化。
- disable-overprovision:DevOps Pipelines 不支援過度佈建,記得關閉。
- upgrade-policy-mode:升級原則設定為手動,這邊一樣會由 DevOps 自動處理,絕對不要再 VMSS 這層設定。
因為這次是使用 Linux 的映像來建立,速度會快上許多,建立完成後切換到 Protal 的「執行個體」頁面,確認有兩台 VM 被建起來就可以了。
兩台 VM 建立成功 |
在 Azure DevOps 中建立 Agent Pool
接著到 Azure DevOps 中,找到「Organization Setting」→ 「Agent pools」,點擊「Add pool」後選擇使用 VMSS 建立 。選擇 VMSS |
中間會需要驗證 Azure 訂閱,過程中會建立服務主體,後續這個服務主體會被賦予 VMSS 的參與者角色,並使用這個權限執行所有設定。
設定 Agent pool |
在設定上建議開啟「Automatically tear down vm after every use」,可以確保每個 CICD Pipeline 在乾淨的環境上運行,其他選項則視需求設定就好。
按下建立後回到 VMSS 的 Portal,切換到 「擴充功能 + 應用程式」就能看到與 Pipeline 有關的擴充。
自動帶上的擴充 |
也可以分別觀察 「活動紀錄」、「執行個體」與「擴充中」,會看到 DevOps 再完成一些初始設定後,會先將機器數量調整成零,主因是我們現在並沒有執行任何的 Pipeline,所以 DevOps 判定我們目前不需要任何的機器,這也是使用 VMSS 在成本上優勢💰。
目前沒有任何機器 |
測試
直接寫一個最簡單的 YAML 來測試,在 DevOps Repos 中建立一個名稱為 azure-pipelines.yml 的檔案,其中 pool.name 輸入剛剛建立的 Agent Pool 名,就能指定 Self-hosted agents 來執行 Pipeline 了。
繼續觀察 Agent Pool 的 Log 與 VMSS 的執行個體數量:
Agent Pool Log |
Pipeline 在一開始並不會馬上執行,DevOps 會先去調整 VMSS 中 VM 的數量。
Pipeline 執行完成 |
當新長出的 VM 開機完成就會開始執行 Pipeline,一切看起來就是那麼地自動。
結論
但凡事都有缺點,Self-hosted Agents 最困難的部分就是維護機器上的各種軟體版本,尤其在資安考量下,時常需要將 VMSS 放在純內網的環境,在安裝軟體上又進一步提升難度。
留言
張貼留言