本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 部署斷路器如何偵測失敗
部署斷路器是可確定任務是否達到穩定狀態的滾動式更新機制。部署斷路器邏輯有一個選項,可將失敗的部署自動復原至處於 COMPLETED 狀態的部署。您可以自訂斷路器如何計算故障及其觸發的閾值,以便復原行為符合您應用程式的啟動特性和任務故障的容錯能力。
當開始服務部署變更狀態時,Amazon ECS 會傳送服務部署狀態變更事件至 EventBridge。這提供一種程式設計方式來監控您的服務部署的狀態。如需詳細資訊,請參閱Amazon ECS 服務部署狀態變更事件。建議您使用 SERVICE_DEPLOYMENT_FAILED 的 eventName 建立和監控 EventBridge 規則,以便您可以採取手動動作來啟動部署。如需詳細資訊,請參閱 Amazon EventBridge User Guide 中的 Getting started with EventBridge。
當部署斷路器判斷部署失敗時,會尋找處於 COMPLETED 狀態的最新部署。這是部署斷路器用來做為復原部署的部署。復原開始時,部署會從 COMPLETED 變更為 IN_PROGRESS。這表示在部署達到 COMPLETED 狀態之前,不符合另一個復原的資格。當部署斷路器找不到處於 COMPLETED 狀態的部署時,斷路器不會啟動新任務,且會阻礙部署。
建立服務時,排程器會追蹤兩個階段中啟動失敗的任務。
-
階段 1 – 排程器會監控任務,檢查其是否轉換為 RUNNING 狀態。
-
成功 – 部署有機會轉換為 COMPLETED 狀態,因為有多項任務已轉換為 RUNNING 狀態。系統會略過失敗條件,且斷路器會移至階段 2。
-
失敗 - 根據預設,未轉換為 RUNNING 狀態的連續任務會計入失敗閾值 (
resetOnHealthyTask為true)。當resetOnHealthyTask為 時false,無論運作狀態良好的任務是否在失敗之間啟動,所有任務失敗都會累積。
-
-
階段 2 – 當至少有一項任務處於 RUNNING 狀態時,部署會進入此階段。斷路器會檢查目前部署中正在評估的任務的運作狀態檢查。驗證的運作狀態檢查為 Elastic Load Balancing、 AWS Cloud Map 服務運作狀態檢查和容器運作狀態檢查。
-
成功 – 至少有一項處於執行中狀態的任務通過了運作狀態檢查。
-
失敗 – 因運作狀態檢查失敗而被取代的任務達到了失敗閾值。
-
當您對服務使用部署斷路器方法時,請考量下列事項。EventBridge 產生規則。
-
DescribeServices回應可提供部署狀態洞察,rolloutState和rolloutStateReason。當啟動新的部署時,推展狀態從IN_PROGRESS狀態開始。當服務到達穩定狀態時,推展狀態轉移到COMPLETED。若服務無法達到穩定狀態,而斷路器已開啟,則部署將轉換為FAILED狀態。處於FAILED狀態的部署不會啟動任何新任務。 -
除 Amazon ECS 為已開始和已完成的部署傳送服務部署狀態變更事件以外,Amazon ECS 還會在開啟的斷路器部署失敗時傳送事件。這些事件提供有關部署失敗原因的詳細資訊,或者部署是否因為回復而開始。如需詳細資訊,請參閱Amazon ECS 服務部署狀態變更事件。
-
如果新的部署因為先前的部署失敗並發生復原而開始,服務部署狀態變更事件的
reason欄位將指示部署因為復原而開始。 -
部署斷路器僅支援使用滾動更新 (
ECS) 部署控制器的 Amazon ECS 服務。 -
當您搭配 CloudWatch 選項使用部署斷路器 AWS CLI 時,必須使用 Amazon ECS 主控台或 。如需詳細資訊,請參閱《AWS Command Line Interface 參考》中的 使用定義的參數建立服務 和 create-service。
下列create-service AWS CLI 範例顯示當部署斷路器與復原選項搭配使用時,如何建立 Linux 服務。
aws ecs create-service \ --service-nameMyService\ --deployment-controller type=ECS\ --desired-count3\ --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \ --task-definitionsample-fargate:1\ --launch-typeFARGATE\ --platform-familyLINUX\ --platform-version1.4.0\ --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"
下列create-service AWS CLI 範例顯示如何使用使用固定故障計數 5 和累積故障追蹤的自訂部署斷路器組態來建立服務。
aws ecs create-service \ --service-nameMyService\ --deployment-controller type=ECS\ --desired-count10\ --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true,resetOnHealthyTask=false,thresholdConfiguration={type=COUNT,value=5}}" \ --task-definitionsample-fargate:1\ --launch-typeFARGATE\ --platform-familyLINUX\ --platform-version1.4.0\ --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"
範例:
部署 1 處於 COMPLETED 狀態。
部署 2 無法啟動,因此斷路器會復原至部署 1。部署 1 會轉換至 IN_PROGRESS 狀態。
部署 3 會啟動,且 COMPLETED 狀態中沒有部署,因此部署 3 無法復原或啟動任務。
Failure threshold
部署斷路器會使用失敗閾值來判斷何時將部署移至 FAILED 狀態。您可以同時設定故障計數方式和閾值本身。
失敗計數模式
resetOnHealthyTask 設定會控制斷路器在部署期間如何計算任務失敗。
true(default)-
每次任務達到運作狀態時,失敗計數會重設為 0。只有連續失敗才會計入閾值。此模式適用於在穩定之前可能遇到間歇性啟動失敗的應用程式。
false-
任務失敗會在整個部署過程中累積。即使運作狀態良好的任務在失敗之間啟動,故障計數也不會重設。此模式可在任何失敗模式指出有問題的部署時,提供更快速的偵測。
閾值組態
thresholdConfiguration 設定會定義斷路器觸發的時間。它包含決定閾值計算方式type的 value,以及指定要使用之百分比或計數的 。
BOUNDED_PERCENT(default)-
Amazon ECS 會
value乘以最新的服務所需計數,以計算失敗閾值。結果會固定為最少 3 個,最多 200 個。這是預設值為 50 的預設類型。 UNBOUNDED_PERCENT-
Amazon ECS 會
value乘以最新的服務所需計數,以計算失敗閾值。結果沒有下限或上限。將此類型用於需要比例閾值但沒有 200 上限的大型所需計數的服務。 COUNT-
Amazon ECS 會
value直接使用 作為失敗閾值。無論服務所需的計數為何,閾值都會保持固定。當您想要確切數量的可容忍失敗時,請使用此類型,例如,在開發環境中更快復原的閾值較低。
對於百分比類型 (BOUNDED_PERCENT 和 UNBOUNDED_PERCENT), 的有效範圍value為 1–100。在部署期間,Amazon ECS 會持續在計算中使用最新的服務所需計數。
如何BOUNDED_PERCENT計算閾值
當您使用預設BOUNDED_PERCENT閾值類型時,部署斷路器會使用下列公式計算閾值。
Minimum threshold (3) <= (value/100) * desired task count => Maximum threshold (200)
當計算結果小於 3 時,閾值會設為 3。當結果大於 200 時,閾值會設為 200。否則,閾值會設為計算值 (四捨五入)。
下表提供使用預設值 50 的範例。
| 所需的任務計數 | 計算 | Threshold |
|---|---|---|
|
1 |
|
3 (計算值小於最小值) |
|
25 |
|
13 (值會無條件進位) |
|
400 |
|
200 (計算值大於最大值) |
|
800 |
|
200 (計算值大於最大值) |
使用 時UNBOUNDED_PERCENT,套用相同的計算,但沒有下限和上限。例如,所需計數為 800 且值為 50 的服務,其閾值為 400。
部署狀態檢查有兩個階段。
-
部署斷路器監視部署過程中的任務,並檢查處於
RUNNING狀態的任務。當目前部署中的任務處於RUNNING狀態時,排程器會忽略故障條件,並繼續進行到下一個階段。當任務無法達到RUNNING狀態時,部署斷路器會將失敗計數增加 1。當故障計數等於閾值時,部署將標記為FAILED。 -
如果一項或多項任務處於
RUNNING狀態,則會進入此階段。部署斷路器對目前部署中的任務,針對以下資源執行運作狀態檢查:-
Elastic Load Balancing 負載平衡器
-
AWS Cloud Map 服務
-
Amazon ECS 容器運作狀態檢查
當任務的運作狀態檢查失敗時,部署斷路器會在故障計數上增加一。當故障計數等於閾值時,部署將標記為
FAILED。 -
例如,當閾值為 3 時,斷路器會從失敗計數設定為 0 開始。當任務未能達到 RUNNING 狀態時,部署斷路器會在失敗計數上增加一。當失敗計數等於 3 時,部署將標記為 FAILED。
如需有關使用復原選項的其他範例,請參閱 Announcing Amazon ECS deployment circuit breaker