跳至內容

為什麼我的 Amazon ECS 任務卡在「待處理」狀態?

3 分的閱讀內容
0

我的 Amazon Elastic Container Service (Amazon ECS) 任務卡在「待處理」狀態。

簡短說明

以下情況會導致 Amazon ECS 任務卡在待處理狀態:

  • Docker 常駐程式沒有回應。
  • 叢集中存在資源限制。
  • Docker 映像檔很大。
  • Amazon ECS 容器代理程式在任務啟動期間,失去與 Amazon ECS 服務的連線。
  • Amazon ECS 容器代理程式需要很長時間才能停止現有任務。
  • 您沒有正確設定 Amazon Virtual Private Cloud (Amazon VPC) 路由。
  • 必要容器相依於未處於運作狀態良好的非必需容器。
  • 您與 Amazon ECS 任務相關聯的 AWS Identity and Access Management (IAM) 角色缺失或不正確。
  • 您選擇的 Windows 版本有映像檔相容性問題。

解決方法

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

Docker 常駐程式無回應或叢集中存在資源限制

在任務定義中,檢查任務請求的記憶體或 CPU 是否超出執行個體支援的容量。根據您的需求調整容器執行個體資源。

對於 CPU 問題,請完成下列步驟:

  1. 使用 Amazon CloudWatch 指標檢查您的容器執行個體是否超出 CPU 配額上限。
  2. 視需要增加容器執行個體的大小

針對記憶體問題,請完成下列步驟:

  1. 執行 free 命令,以查看系統可用的記憶體容量。
  2. 視需要增加容器執行個體的大小

針對 I/O 問題,請完成下列步驟:

  1. 執行 iotop 命令。
  2. 確定每項服務中使用每秒讀寫次數 (IOPS) 最多的任務
  3. 使用任務放置限制和策略將任務分發到不同的容器執行個體。
    -或-
    使用 CloudWatch,為 Amazon Elastic Block Store (Amazon EBS) BurstBalance 指標建立警示。然後,使用 AWS Lambda 函數或您自己的自訂邏輯以平衡任務。

Docker 映像檔很大

較大的映像檔需要較長的下載時間,而且會延長任務卡在待處理狀態的時間。

若要加快轉換時間,請調整 ECS_IMAGE_PULL_BEHAVIOR 參數以使用映像檔快取。例如,在 /etc/ecs/ecs.config 中,將 ECS_IMAGE_PULL_BEHAVIOR 參數設定為 prefer-cached。如果您使用 Preferred-cached,則當沒有快取映像檔時,Amazon ECS 會遠端提取映像檔。否則,Amazon ECS 將使用執行個體上的快取映像檔。

Amazon ECS 容器代理程式在啟動期間,失去與 Amazon ECS 服務的連線

若要確認 Amazon ECS 容器代理程式的狀態和連線,請根據您的 Amazon Linux 版本,在容器執行個體上執行下列命令。

Amazon Linux 1:

sudo status ecs
sudo docker ps -f name=ecs-agent

Amazon Linux 2:

sudo systemctl status ecs
sudo docker ps -f name=ecs-agent

如果輸出中的狀態為非作用中,則代理程式已中斷連線。若要解決此問題,請執行以下命令以重新啟動容器代理程式。

Amazon Linux 1:

sudo stop ecs
sudo start ecs

Amazon Linux 2:

sudo systemctl stop ecs
sudo systemctl start ecs

您會收到類似下列訊息的輸出:

ecs start/running, process abcd

若要確定代理程式的連線,請檢查相關時間範圍內的下列日誌中的關鍵字,例如錯誤警告代理程式轉換狀態

  • 檢視 /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh 中的 Amazon ECS 容器代理程式日誌。
  • 檢視 /var/log/ecs/ecs-init.log 中的 Amazon ECS init 日誌。
  • 檢視 /var/log/docker 中的 Docker 日誌。

使用日誌中的資訊來確定連線問題的根本原因。

**注意:**您也可以使用 Amazon ECS 日誌收集器,以收集 Amazon ECS 的一般作業系統 (OS) 日誌、Docker 日誌和容器代理程式日誌。

若要提取容器執行個體本機即時任務狀態,請執行下列命令以查看容器執行個體中正在執行任務的中繼資料:

curl http://localhost:51678/v1/metadata

您會收到類似於下列範例的輸出:

{  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

在輸出中,確定任務環境變數、CPU、記憶體和 IAM 角色組態正確。另外,請確定任務具有所需的密碼。

若要查看服務中執行的所有任務的詳細資訊,請執行以下命令:

curl http://localhost:51678/v1/tasks

您會收到類似於下列範例的輸出:

{  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

在上述命令輸出中,檢查本機代理程式和 Amazon ECS 服務之間是否存在差異。使用此資訊來確定任務卡住的位置和原因。

Amazon ECS 容器代理程式需要很長時間,才能停止現有任務

當 Amazon ECS 傳送新任務,以從待處理狀態啟動到執行中狀態時,容器代理程式可能需要停止現有任務。在這種情況下,在停止現有任務之前,代理程式不會啟動新任務。

若要在容器執行個體層級控制容器停止和啟動逾時,請調整 /etc/ecs/ecs.configECS_CONTAINER_STOP_TIMEOUTECS_CONTAINER_START_TIMEOUT 變數的環境變數ECS_CONTAINER_STOP_TIMEOUT 會設定如果容器未自行結束,Amazon ECS 強制結束容器前所經過的時間長度。Linux 和 Windows 的預設停止逾時值為 30 秒。ECS_CONTAINER_START_TIMEOUT 會設定 Amazon ECS 容器代理程式停止嘗試啟動容器前所經過的時間長度。Linux 的預設啟動逾時值為 3 分鐘,Windows 的預設啟動逾時值為 8 分鐘。

如果您的代理程式版本為 1.26.0 或更新版本,則您可以在每個任務中定義停止和啟動逾時參數。請注意,當您變更參數時,任務可能會變更為停止狀態。例如,容器執行個體 A 相依於容器執行個體 B 才能達到完成成功運作狀態良好狀態。您沒有為容器執行個體 B 指定 startTimeout 值。如果容器執行個體 B 在逾時時間內未達到所需狀態,則容器執行個體 A 不會啟動。

如需容器相依性範例,請參閱 GitHub 網站上的範例: 容器相依性

您沒有正確設定 Amazon VPC 路由

檢查您的 Amazon ECS 或 AWS Fargate 任務執行的 VPC 子網路組態。您的子網路必須具有對 Amazon ECS 或 Amazon Elastic Container Registry (Amazon ECR) 的存取權。若要解決設定問題,請確定子網路的路由表具有網際網路閘道或 NAT 閘道。如果您在沒有傳出路由到網際網路的子網路中啟動任務,請使用 AWS PrivateLink。此組態可讓您使用私有 IP 位址存取 Amazon ECS API。

另外,請確保您的安全群組規則允許透過您組態所需的連接埠進行傳入和傳出通訊。

必要容器執行個體相依於未處於「運作狀態良好」的非必要容器執行個體

如果必要容器執行個體所相依的非必要容器執行個體未處於運作狀態良好狀態,那麼您的任務將卡在待處理狀態。您收到「stoppedReason」:「Service ABCXYZ:任務最後狀態處於待處理狀態的時間太長」訊息。

要解決此問題,請確保您的非必要容器執行個體如預期運作。如果您無法解決根本問題,請更新容器執行個體的任務定義,並將必要參數設為 True。如果任務仍然處於停止狀態,則檢查停止原因。如需更多疑難排解步驟,請參閱為什麼我的 Amazon ECS 任務停止了?

IAM 角色缺失或設定錯誤

如果任務位於不具有所需權限的容器執行個體中,您會收到類似下列範例的錯誤:

「(服務測試) 無法啟動任務 (錯誤 ECS 無法擔任為此任務提供的角色 ''arn:aws:iam::111111111111:role/test-fTa-T3J4hVnyL53E'。請確認正在傳遞的角色是否具有正確的信任關係和權限,並且您的 IAM 使用者具有傳遞該角色的權限。)」

若要解決此問題,請確定容器執行個體具有所需的權限

此外,如果您的容器執行個體沒有使用 Amazon ECS 最佳化的 Amazon Machine Image (AMI),請檢查您的 Amazon ECS 代理程式組態

您選擇的 Windows 版本有映像檔相容性問題

當您在 Windows Fargate 任務中使用的映像檔與您的平台不相容時,任務就會失敗。若要檢查您的映像檔是否與 Windows 伺服器主機相容,請參閱 Microsoft 網站上的 Windows 容器版本相容性。然後,檢查執行 Windows 任務的先決條件

另外,請確定您定義的映像檔網址是準確的。

相關資訊

容器相依性

GitHub 網站上的 amazon-ecs-agent

AWS 官方已更新 9 個月前