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

3 分的閱讀內容
0

我使用 Amazon Elastic Compute Cloud (Amazon EC2) 啟動類型為 Amazon Elastic Container Service (Amazon ECS) 叢集建立了一個容量供應商。但是,容量供應商並未如預期般擴展。

簡短說明

以下問題會導致您的 Amazon EC2 容量供應商無法自動縮減或擴展:

  • 您沒有將 Amazon ECS 服務與容量供應商關聯。
  • 您沒有將容量供應商擴展政策附加到 Amazon EC2 Auto Scaling 群組。
  • 您沒有正確設定目標容量百分比。
  • 您正在使用受管擴展功能作為容量供應商,並且自訂擴展政策會附加到 EC2 Auto Scaling 群組。
  • Amazon EC2 Auto Scaling 群組已啟動容器執行個體,但無法加入叢集。
  • 您的容器執行個體無法縮減或縮小。
  • 容量供應商卡在失敗狀態。
  • Auto Scaling 群組卡在擴展循環。

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

檢查您是否已將 Amazon ECS 服務與容量供應商關聯

若要確認您是否將 Amazon ECS 服務與容量供應商關聯,請執行下列 describe-services AWS CLI 命令:

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

注意:example-cluster 替換為您的叢集名稱,將 example-service 替換為您的服務名稱,並將 example-region 替換為您的 AWS 區域。

如果您將 Amazon ECS 服務與容量供應商關聯,那麼您將收到類似下列範例的輸出:

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

請確定capacityProviderStrategy 值不是 []

若要為服務新增容量供應商,請執行下列 update-service 命令:

aws ecs update-service --cluster example-cluster --service example-service --region example-region --capacity-provider-strategy capacityProvider=capacity-provide-name,weight=weight-value,base=base-value --force-new-deployment

注意:example-cluster 替換為您的叢集名稱,將 example-service 替換為您的服務名稱,將 example-region 替換為您的區域,並將 capacity-provider-name 替換為您的容量供應商名稱。此外,將 weight-value 替換為使用容量供應商的總任務數,將 base-value 替換為容量供應商執行的最少任務數。

您也可以使用 Amazon ECS 主控台來更新服務

請確定已將容量供應商擴展政策附加到 Auto Scaling 群組

當您將容量供應商與 Auto Scaling 群組關聯時,Amazon ECS 會建立根據叢集負載修改容量的擴展政策。

若要對擴展政策問題進行疑難排解,請查看 PutScalingPolicyUpdateAutoScalingGroupCreateCapacityProviderUpdateCapacityProvider API 呼叫的 AWS CloudTrail 事件。請確認該政策可以與 Auto Scaling 群組關聯,並且容量供應商如預期運作。

若要確認 Auto Scaling 群組是否為叢集附件,請執行以下 describe-cluster 命令:

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

注意:example-cluster 替換為您的叢集名稱,將 example-region 替換為您的區域。

輸出範例:

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

如果您使用受管擴展政策,請完成以下步驟以檢查該政策是否已附加到 Auto Scaling 群組:

  1. 開啟 Amazon ECS 主控台
  2. 在導覽窗格中,選取 Clusters (叢集)。
  3. 選取您的叢集。
  4. 選擇 Infrastructure (基礎架構) 索引標籤。
  5. 選擇 Capacity providers (容量供應商) 索引標籤。
  6. 選取您的「Auto Scaling 群組」。
    注意: 此動作會將您重新導向至 Amazon EC2 主控台中的 Auto Scaling 群組頁面。
  7. 選擇 Automatic Scaling (自動擴展) 索引標籤。
  8. 選擇 Actions (動作),然後選取 Edit dynamic scaling policy (編輯動態擴展政策)。
  9. Custom metric JSON (自訂指標 JSON) 欄位中,檢查政策是否包含 CapacityProviderReservation 指標。

檢查目標容量百分比組態

檢查容量供應商的 CapacityProviderReservation Amazon CloudWatch 指標,以追蹤其容器執行個體的使用情況。與 Auto Scaling 群組關聯的目標追蹤擴展政策會調整正在執行的執行個體數量,以確保 CapacityProviderReservation 與目標容量值相符。例如,如果您將目標容量設定為 100%,則 Amazon ECS 將使用所有執行個體,並在未執行任務的執行個體中擴充。

若要設定額外容量,請將設定目標容量更新為低於 100 的值。

確保從 Auto Scaling 群組啟動的執行個體可以加入叢集

如果您的執行個體無法加入叢集,請參閱為什麼我的 Amazon EC2 執行個體無法加入 Amazon ECS 叢集?

確保您的容器執行個體不受縮減或縮減規模動作的保護

對於使用受管終止保護的容量提供者,Amazon ECS 可禁止在縮減動作期間終止具有任務的 Amazon EC2 執行個體。

若要停止所有正在執行的任務並允許 Auto Scaling 群組終止 EC2 執行個體,請使用 Amazon ECS 主控台耗盡執行個體。或者,執行以下 update-container-instances-state 命令:

aws ecs update-container-instances-state --cluster example-cluster --container-instances example-container --status DRAINING --region example-region

注意:examples-cluster 替換為您的叢集名稱,將 example-container 替換為您的容器執行個體,並將 example-region 替換為您的區域。

如果在耗儘後任務仍在容器執行個體上執行,請參閱如何對容器執行個體設為 DRAINING 時,需要很長時間才停止的 Amazon ECS 任務進行疑難排解?

若要進一步對受管終止保護問題進行疑難排解,請參閱如何解決 Amazon ECS 中容量供應商錯誤的受管終止保護設定?

如果擴充保護阻止執行個體中的縮減操作,您會在 Auto Scaling 活動歷史記錄中收到下列錯誤訊息:

「無法擴展到所需容量,因為所有剩餘執行個體都受到保護,不能縮減。」

若要解決此問題,請檢查您的工具或第三方工具,例如 Terraform 或 GitLab。確保他們不會從 Auto Scaling 群組中移除 AmazonECSManaged 索引標籤。Amazon ECS 需要此標籤來管理擴展功能。若要檢查是否缺少 AmazonECSManaged 索引標籤,請檢查 CloudTrail 事件歷史記錄中的 SetInstanceProtection 事件。如果您看到 SetInstanceProtection,則必須將索引標籤新增回 Auto Scaling 群組。

檢查容量供應商的狀態

當您使用容量供應商時,最佳做法是建立新的 Auto Scaling 群組,而不是重複使用現有群組。與現有群組關聯且註冊到 Amazon ECS 叢集,處於正在執行狀態的執行個體可能無法正確註冊。

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

aws ecs describe-capacity-providers \
--capacity-providers MyCapacityProvider

如果容量供應商處於非作用中狀態,則表示該容量供應商已刪除。

此外,檢查 CloudTrail 事件中是否有與 CreateCapacityProvider API 相關的錯誤。

確保 Auto Scaling 群組未卡在擴展循環

當您在 Amazon ECS 服務擴展政策中指定的目標容量達到峰值時,Auto Scaling 群組會擴展並啟動執行個體。但是,如果指標值在突然激增之後下降,則 Auto Scaling 群組會在執行個體中擴展。如果目標容量在短時間內頻繁波動,則 Auto Scaling 群組將卡在擴展循環。為了避免此問題,請設定目標容量值以符合您的工作負載。

相關資訊

深入了解 Amazon ECS 叢集自動擴展

如何解決 Amazon ECS 中刪除容量供應商時出現的錯誤?

適用於 AWS Fargate 啟動類型的 Amazon ECS 叢集

AWS 官方
AWS 官方已更新 2 個月前