如何對 Amazon ECS 容量供應商的擴展問題進行疑難排解?

上次更新日期:2022 年 4 月 14 日

我已為我的 Amazon Elastic Container Service (Amazon ECS) 叢集設定容量供應商。然而,當叢集資源耗盡,或當容量佔用較少而進行縮減時,容量供應商不會水平擴展。

簡短描述

由於以下一個或多個原因,Amazon ECS 叢集的容量供應商不會自動縮減或水平擴展:

  • Amazon ECS 服務未與容量供應商相關聯。
  • 與容量供應商相關的擴展政策不會連接至 Auto Scaling 群組。
  • 目標追蹤擴展政策設定不正確。
  • 在容量供應商中,沒有正確設定目標容量百分比。
  • 任務放置策略並非是根據工作負載所定義。
  • ECS 服務因一些錯誤而發生故障,並封鎖容量供應商擴展。
  • 您正為容量供應商使用受管擴展,且 Auto Scaling 群組已自訂連接至該擴展的自訂擴展政策。
  • Auto Scaling 群組已啟動容器執行個體,但無法加入叢集。
  • 您的容器執行個體受到保護,以防止擴展。
  • 容量供應商正處於故障狀態。
  • Auto Scaling 群組處於水平擴展和擴展的迴圈中。

解決方案

Amazon ECS 服務未與容量供應商相關聯

要檢查雲 ECS 服務是否與容量供應商相關聯,請執行 AWS Command Line Interface (AWS CLI) 命令 describe-services

aws ecs describe-services --cluster example-cluster --services example-service --region example-region --query services[].capacityProviderStrategy

如果您的 ECS 服務與容量供應商相關聯,則輸出必須類似於以下內容:

[
  [
    {
      "capacityProvider": "example-capacity-provider",
      "weight": 1,
      "base": 1
    }
  ]
]

請確保輸出中的 capacityProviderStrategy 欄位不是空。您可以藉由檢閱適用於 CreateServiceUpdateService API 呼叫的 AWS CloudTrail 事件,檢視服務的組態。

如要解決此問題,請使用 update-servicerun-task,或是 put-cluster-capacity-providers 等 AWS CLI 命令,更新 ECS 服務。您也可以使用 Amazon ECS 主控台,更新服務

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

當容量供應商已建立,且和 Auto Scaling 群組相關聯時,Auto Scaling 群組會建立一個擴展政策,並使用目標追蹤修改所需容量,以容納叢集負載。

如要解決此問題,請檢閱適用於 UpdateAutoScalingGroupCreateCapacityProviderUpdateCapacityProvider,以及 PutScalingPolicy API 的 CloudTrail 事件

執行以下命令,驗證 Auto Scaling 群組是否作為叢集連接而建立:

aws ecs describe-clusters --clusters example-cluster --include ATTACHMENTS --region example-region --query clusters[].attachments[]

命令的輸出必須類似於以下內容:

[
  {
    "id": "100a23456-5f0b-4abc-b998-d6789d111a",
    "type": "asp",
    "status": "CREATED",
    "details": [
      {
        "name": "capacityProviderName",
        "value": "example-capacityProvider"
      },
      {
        "name": "scalingPlanName",
        "value": "ECSManagedAutoScalingPlan-bb60c8fa-3ed7-4808-b39c-abcdef2345"
      }
    ]
  }
]

如果您使用的是受管擴展政策,請執行以下操作,檢查政策是否連接至 Auto Scaling 群組:

  1. 開啟 Amazon ECS console (Amazon ECS 主控台)。
  2. 在導覽窗格中,選擇 Clusters (叢集)。
  3. 開啟您要檢查的叢集。
  4. 選擇 Capacity Providers (容量供應商) 標籤。
  5. 針對您要檢查的容量供應商,請選擇 ASG。
    您將被轉向至 Amazon EC2 主控台中的 Auto Scaling groups (Auto Scaling 群組) 頁面。
  6. 選擇 Automatic Scaling (自動縮放) 標籤。
    您可以檢視擴展政策。
  7. 檢查您正使用的擴展政策是否包含其中。

另外,請務必在 Auto Scaling 群組擴展政策的名稱中,包含前綴 AutoScaling-ECSManagedAutoScalingPlan。否則,Auto Scaling 群組使用的擴展政策,會不同於容量供應商管理的擴展政策。請注意,容量供應商可以與其他類型的擴展政策一起使用。如需更多資訊,請參閲服務自動擴展

目標追蹤擴展政策設定不正確

目標追蹤擴展政策,會追蹤您定義指標的目標值。Amazon ECS 服務會建立並管理 Amazon CloudWatch 警示,而這些警示會觸發擴展政策,並根據指標與目標值計算擴展調整。如果目標追蹤政策設定不正確,則任務可能無法根據需要自動擴展。

假設目標追蹤自動擴展政策,正在追蹤 CloudWatch 中的 CPU 利用率指標,且您指定目標追蹤百分比為 60。在這種情況下,容量供應商會盡最大努力,將彙總的 CPU 利用率維持於 60%。當 CPU 利用率大於 60% 時,會導致水平擴展事件,若是利用率低於 60% 時,則會導致縮減事件。

如要解決此問題,請根據您的工作負載選擇正確的指標,並在目標追蹤政策中,設定正確的水平擴展與縮減數值。如需更多資訊,請參閲目標追蹤擴展政策

在容量供應商中,並未正確配置目標容量百分比

目標容量數值是用於 CloudWatch 指標中的目標數值,而該指標則是用於 Amazon ECS 受管目標追蹤擴展政策中。將盡最大努力比對此目標容量數值。此數值的允許數值為介於 1 到 100 之間的整數。例如,如果您將目標容量設定為 100%,則會利用所有執行個體,且會縮減任何未執行任務的執行個體。但是,並不保證這種行為每次都會發生。如果您需要備用容量,請根據您的需求將目標容量設置為略低於 100% 的值。

如要使用正確的目標容量百分比,更新容量供應商,請根據使用傳統主控台更新 Auto Scaling 群組容量供應商中的説明,進行操作。

任務放置策略並非根據工作負載所定義

建立服務或執行任務時,可以指定任務放置策略。您還可以更新現有服務的任務放置策略。例如,假使您的工作負載是記憶體密集型,且您沒有相應設定任務放置策略,則這些任務不會根據記憶體使用情況進行縮減或向外擴展。請務必檢查任務放置策略類型,並根據您的工作負載定義這些策略。

ECS 服務因一些錯誤而發生故障,並封鎖容量供應商擴展

如果 ECS 服務出現故障且發生錯誤,則容量供應商會無法擴展和水平擴展。要診斷 ECS 服務失敗的原因,請檢查 Amazon ECS主控台中的服務事件訊息

您正為容量供應商使用受管擴展,且 Auto Scaling 群組已自訂連接至該擴展的自訂擴展政策

如果您的叢集無法自動擴展,則可能會發生以下錯誤:

"StatusCode": "ActiveWithProblems"
"StatusMessage": "Scaling plan has been created but failed to be applied to all resources. Problems were encountered for 1 resource. See scaling plan resources for the failure details."
此錯誤會在下列兩項條件同時成立時發生:
  • 您正在為容量供應商使用 AWS 受管擴展。
  • Auto Scaling 群組具有非由 Amazon ECS 建立的自訂擴展政策。

如要解決此錯誤,請參閲避免 ActiveWithProblems 錯誤。啟用受管擴展時,Amazon ECS 會使用自動擴展擴展計劃,管理 Auto Scaling 群組的擴展和水平擴展操作。建立一個新的 Auto Scaling 群組,並連接此群組至容量供應商,始終是最佳實務。

Auto Scaling 群組已啟動容器執行個體,但無法加入叢集

您的容器執行個體受到保護,防止縮減

如果您在設定容量供應商時啟用了受管終止保護,Amazon ECS 會阻止 Auto Scaling 群組中包含任務的 Amazon EC2 執行個體,於擴展動作期間終止。

如要確保 Auto Scaling 群組可在您變更所需容量時終止舊的執行個體,請執行以下操作:

如需更多資訊,請參閱如何解決 Amazon ECS 中的「容量供應商的受管終止保護設定無效」錯誤?

容量供應商正處於故障狀態

最佳實務是建立一個新的 Auto Scaling 群組,以便與容量供應商一起使用,而非使用現有群組。如果您使用現有 Auto Scaling 群組,則使用容量供應商時,可能會遇到問題。這是因為與現有群組相關聯,並註冊到 Amazon ECS 叢集的執行中 Amazon EC2 執行個體,可能無法正確註冊到容量供應商。

如要查看容量供應商的狀態,請執行 AWS CLI 命令 describe-capacity-providers

此外,請檢閱 CloudTrail 事件,並檢查與 CreateCapacityProvider 相關的錯誤。

Auto Scaling 群組處於水平擴展和擴展的迴圈中

當 ECS 服務擴展政策中指定的指標數值達高峰時,Auto Scaling 群組會根據需要擴展,並啟動執行個體。但是,如果指標數值在突然峰值之後下降,Auto Scaling 群組會嘗試在執行個體中進行擴展。如果指標值在短時間範圍內波動多次,則 Auto Scaling 群組可能會陷入水平擴展與擴展的迴圈中。要避免此問題,請確保根據您的工作負載,定義擴展政策中的指標閥值。