Azure 虛擬機器擴展集執行個體的終止通知

擴展集執行個體可以選擇加入以接收執行個體終止通知,並為終止作業設定預先定義的延遲逾時。 終止通知會透過 Azure Metadata Service - Scheduled Events 傳送,此服務可提供會造成影響的作業 (例如重新啟動和重新部署) 通知和延遲。 解決方案會將另一個事件 - 終止 - 新增至 Scheduled Events 清單,而終止事件的相關延遲,將取決於使用者在其擴展集模型設定中所指定的延遲限制。

呼叫適當的中繼資料服務端點,註冊到排程的事件之後,擴展集執行個體就不需要等待指定的逾時到期再刪除執行個體。 收到終止通知之後,在終止逾時時間到期之前,執行個體隨時都可以刪除。 無法在現成品執行個體上啟用終止通知。 如需現成品執行個體的詳細資訊,請參閱虛擬機器擴展集的 Azure 現成品虛擬機器

啟用終止通知

有多種方式可以在擴展集執行個體上啟用終止通知,如下列範例所述。

Azure 入口網站

下列步驟可在建立新的擴展集時啟用終止通知。

  1. 移至 [虛擬機器擴展集]
  2. 選取 [+ 新增],建立新的擴展集。
  3. 移至 [管理] 索引標籤。
  4. 找出 [執行個體終止] 區段。
  5. 針對 [執行個體終止通知],選取 [開啟]
  6. 針對 [終止延遲 (分鐘)],請設定所需的預設逾時。
  7. 完成建立新的擴展集之後,選取 [檢閱 + 建立] 按鈕。

您也可以在現有的擴展集上啟用終止通知。

  1. 瀏覽至需要的擴展集
  2. 移至 [設定] 索引標籤
  3. 針對 [啟用執行個體終止通知],選取 [開啟]
  4. 針對 [終止延遲 (分鐘)],請設定所需的預設逾時。
  5. 選取 [儲存] 按鈕。

REST API

下列範例會在擴展集模型上啟用終止通知。

PUT on `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{vmScaleSetName}?api-version=2019-03-01`
{
  "properties": {
    "virtualMachineProfile": {
            "scheduledEventsProfile": {
                "terminateNotificationProfile": {
                    "notBeforeTimeout":"PT5M",
                    "enable":true
                }
            }
        }
    }        
}

上述區塊會針對擴展集內所有執行個體上的任何終止作業,指定 5 分鐘的逾時延遲 (如 PT5M 所示)。 [notBeforeTimeout] 欄位可使用 5 到 15 分鐘之間的任何值 (ISO 8601 格式)。 您可以藉由修改上面所述 [terminateNotificationProfile] 底下的 [notBeforeTimeout] 屬性,變更終止作業的預設逾時。

在擴展集模型上啟用 [scheduledEventsProfile] 並設定 [notBeforeTimeout] 之後,請將個別執行個體更新至最新的模型,以反映變更。

注意

若要啟用擴展集執行個體上的終止通知,只能使用 API 版本 2019-03-01 和更新版本

Azure PowerShell

建立新的擴展集時,您可以使用 New-AzVmssConfig Cmdlet 啟用擴展集上的終止通知。

此範例指令碼會逐步解說如何使用設定檔來建立擴展集和相關聯的資源:建立完整的虛擬機器擴展集。 您可以在建立擴展集時將 TerminateScheduledEventsTerminateScheduledEventNotBeforeTimeoutInMinutes 參數新增至設定物件,以提供「設定終止」通知。 下列範例會啟用延遲逾時為 10 分鐘的功能。

重要

自 2023 年 11 月起,如果未指定協調流程模式,則使用 PowerShell 和 Azure CLI 建立的虛擬機器擴展集會預設為彈性協調流程模式。 如需此變更的詳細資訊及您應該採取的動作,請移至針對 VMSS PowerShell/CLI 客戶的中斷性變更 - Microsoft 社群中樞

New-AzVmssConfig `
  -Location "VMSSLocation" `
  -SkuCapacity 2 `
  -OrchestrationMode "Flexible" `
  -SkuName "Standard_DS2" `
  -TerminateScheduledEvents $true `
  -TerminateScheduledEventNotBeforeTimeoutInMinutes 10

使用 Update-AzVmss Cmdlet 可在現有的擴展集上啟用終止通知。

Update-AzVmss `
  -ResourceGroupName "myResourceGroup" `
  -VMScaleSetName "myScaleSet" `
  -TerminateScheduledEvents $true `
  -TerminateScheduledEventNotBeforeTimeoutInMinutes 15

上述範例會在現有的擴展集上啟用終止通知,並為 terminate 事件設定 15 分鐘的逾時。

在擴展集模型上啟用排程事件並設定逾時,請將個別執行個體更新至最新的模型,以反映變更。

Azure CLI 2.0

下列是在建立新的擴展集時啟用終止通知的範例。

az group create --name <myResourceGroup> --location <VMSSLocation>
az vmss create \
  --resource-group <myResourceGroup> \
  --name <myVMScaleSet> \
  --image Ubuntu2204 \
  --admin-username <azureuser> \
  --generate-ssh-keys \
  --terminate-notification-time 10

上述範例會先建立資源群組,然後建立新的擴展集,並啟用預設逾時為 10 分鐘的終止通知。

下列是在現有擴展集時啟用終止通知的範例。

az vmss update \  
  --resource-group <myResourceGroup> \
  --name <myVMScaleSet> \
  --enable-terminate-notification true \
  --terminate-notification-time 10

取得終止通知

終止通知是透過 Scheduled Events (也就是 Azure Metadata Service) 來提供。 如果您是使用可由 VM 內存取的 REST 端點來執行虛擬機器,Azure 中繼資料服務會公開這類相關資訊。 這項資訊是透過無法路由傳送的 IP 取得,因此不會在 VM 之外公開。

系統會在您第一次提出事件要求時,為您的擴展集啟用 Scheduled Events。 您可能會在第一次呼叫中遇到長達兩分鐘的延遲回應。 定期查詢端點以偵測即將進行的維護事件,以及進行中維護活動的狀態。

如果擴展集執行個體已 24小時未提出要求,則會停用擴展集的 Scheduled Events。

端點探索

針對已啟用 VNET 的 VM,可以從靜態非可路由 IP 169.254.169.254 取得 Metadata Service。

最新版已排定事件的完整端點為:

'http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01'

查詢回應

回應包含排定的事件陣列。 空白陣列表示目前沒有任何排定的事件。

在有排定事件的情況下,回應會包含事件陣列。 針對「終止」事件,回應會如下所示:

{
    "DocumentIncarnation": {IncarnationID},
    "Events": [
        {
            "EventId": {eventID},
            "EventType": "Terminate",
            "ResourceType": "VirtualMachine",
            "Resources": [{resourceName}],
            "EventStatus": "Scheduled",
            "NotBefore": {timeInUTC},
        }
    ]
}

DocumentIncarnation 是一種 ETag,能夠輕鬆檢查事件裝載自從上次查詢之後是否已變更。

如需上述每個欄位的詳細資訊,請參閱 WindowsLinux 的 Scheduled Events 文件。

回應事件

在您得知即將發生的事件,並完成正常關機邏輯之後,即可使用 EventId 向中繼資料服務進行 POST 呼叫,以核准未處理的事件。 POST 呼叫會向 Azure 指出,可以繼續執行 VM 刪除。

POST 要求本文中應出現的 json 如下。 要求應包含 StartRequests 清單。 每個 StartRequest 都包含要加速事件的 EventId:

{
	"StartRequests" : [
		{
			"EventId": {EventId}
		}
	]
}

確保擴展集的每個 VM 只核准該 VM 相關的 EventID。 VM 可以透過執行個體中繼資料取得自己的 VM 名稱。 此名稱採用 "{scale-set-name}_{instance-id}" 格式,而且將會顯示在上述查詢回應的 [資源] 區段中。

您也可以參考查詢和回應事件 Python 的範例指令碼。

訣竅和最佳做法

  • 僅終止「刪除」作業的通知:如果擴展集已啟用 scheduledEventsProfile,所有手動刪除或自動調整起始的刪除作業將會產生終止事件。 重新啟動、重新安裝映像、重新部署和停止/解除配置等其他作業不會產生終止事件。
  • 沒有必要的逾時等待時間:在收到事件之後,以及事件的 NotBefore 時間到期之前,您可以隨時啟動終止作業。
  • 在逾時時強制刪除:沒有任何功能可在事件產生後延長逾時值。 當逾時時間過期時,將會處理擱置中的終止事件,並且刪除 VM。
  • 可修改的逾時值:您可以在刪除執行個體之前隨時修改逾時值,方法是修改擴展集模型上的 notBeforeTimeout 屬性,並將 VM 執行個體更新為最新模型。
  • 核准所有擱置中的刪除:如果 VM_1 上有尚未核准的擱置中刪除,而且您已在 VM_2 核准另一個終止事件,則 VM_2 將不會刪除,直到 VM_1 的終止事件核准,或其逾時時間到期為止。 一旦您核准 VM_1 的終止事件之後,就會同時刪除 VM_1 和 VM_2。
  • 核准所有同時刪除:上述範例的延伸情況,如果 VM_1 且 VM_2 具有相同的 NotBefore 時間,則必須同時核准這兩個終止事件,否則在到期前都不會刪除 VM。

疑難排解

無法啟用 scheduledEventsProfile

如果您收到 ‘BadRequest’ 錯誤,並出現錯誤訊息表示「在 'VirtualMachineProfile' 類型的物件上找不到成員 'scheduledEventsProfile'」,請檢查用於擴展集作業的 API 版本。 需要使用 2019-03-01 版或更新版本的 API。

無法取得終止事件

如果您無法透過 Scheduled Events 取得任何終止事件,請檢查用來取得事件的 API 版本。 終止事件需要 2019-01-01 或更高版本的 Metadata Service API。

'http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01'

取得的終止事件 NotBefore 時間不正確

在擴展集模型上啟用 [scheduledEventsProfile] 並設定 [notBeforeTimeout] 之後,請將個別執行個體更新至最新的模型,以反映變更。

下一步

了解如何在虛擬機器擴展集上部署您的應用程式