為什麼我的 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) 路由未正確設定。
  • 基本容器取決於處於「不建全」狀態的非必要容器。

解決方法

要了解您的任務為什麼會卡在「待處理」狀態,請完成以下疑難排解步驟。

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI

Docker 常駐程式沒有回應

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

1.    使用 Amazon CloudWatch 指標,以查看您的容器執行個體是否超過 CPU 上限。

2.    視需要增加容器執行個體的大小

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

1.    執行 free 命令,以查看系統可用的記憶體容量。

2.    視需要增加容器執行個體的大小

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

1.    執行 iotop 命令。

2.    了解哪些服務中的哪些任務使用的 IOPS 最多。然後,使用任務置放限制和策略,以將這些任務分配到不同的容器執行個體。

-或-

使用 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。如果指定 prefer-cached,則在無快取映像檔時,從遠端提取映像檔。否則,會使用執行個體上的快取映像檔。

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

1.    要確認 Amazon ECS 容器代理程式的狀態和連線,請在容器執行個體上執行下列任一命令。

執行 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

注意:您會在輸出中看到作用中/執行中

2.    要檢視 ECS 容器執行個體中執行任務的中繼資料,請在容器執行個體上執行下列命令:

$ 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 "
}

3.    要檢視執行中任務的相關資訊,請在容器執行個體上執行下列命令:

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

您會收到下列輸出:

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

4.    如果問題與中斷連線的代理程式有關,則請使用下列任一命令,重新啟動容器代理程式。

執行 Amazon Linux 1 的下列命令:

$ sudo stop ecs
$ sudo start ecs

執行 Amazon Linux 2 的下列命令:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

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

ecs start/running, process xxxx

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

檢視 /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 的一般作業系統日誌、Docker 日誌和容器代理程式日誌。

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

您的容器代理程式收到 Amazon ECS 要開始的新任務 (從「待處理」到「執行中」) 時,可能需停止舊任務。在此案例中,在停止舊任務之前,代理程式不會啟動這些新任務。

要控制容器執行個體層級的容器停止和啟動逾時,請設定下列兩個參數

1.    在 /etc/ecs/ecs.config 中,調整 ECS_CONTAINER_STOP_TIMEOUT 參數的值。此參數會設定 Amazon ECS 強制結束您的容器前所經過的時間長度,如果容器本身無法正常結束。

**注意:**Linux 和 Windows 的預設值為 30 秒

2.    在 /etc/ecs/ecs.config,調整 ECS_CONTAINER_START_TIMEOUT 參數的值。此參數會設定 Amazon ECS 容器代理程式停止嘗試啟動容器前經過的時間長度。

**注意:**Linux 預設值為 3 分鐘,Windows 預設值為 8 分鐘

如果您的代理程式版本為 1.26.0 或更新版本,您可以定義每項任務先前的停止和啟動逾時參數。這可能會讓任務轉換為「已停止」狀態。例如,假設容器 A 取決於容器 B 是否已達到「完成」、「成功」或「健全」狀態。如果您沒有指定容器 B 的 startTimeout 值,且容器 B 在該時間內未達到所需狀態,則容器 A 不會啟動。

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

您的 Amazon VPC 路由未正確設定

檢查您的 Amazon ECS 或 Fargate 任務執行的 VPC 子網路組態。如果子網路未正確設定,則無法存取 Amazon ECS 或 Amazon ECR。要解決此問題,請確定子網路的路由表具有網際網路閘道或 NAT 閘道。如果您在沒有輸出路由到網際網路的子網路中啟動任務,則使用 AWS PrivateLink。這可讓您使用私有 IP 地址,以私有方式存取 Amazon ECS API。

基本容器取決於處於「不建全」狀態的非必要容器

如果您的非必要容器未處於「健全」狀態,且基本容器依賴它們,則您的任務就會卡在「待處理」狀態。在此案例中,您會看到下列訊息:

"stoppedReason":"Service ABCXYZ: task last status remained in PENDING too long."

要解決此問題,請確定您依賴 (非必要) 的容器如預期般運作。如果您無法解決基礎問題,則將這些容器設定為基本,以避免任務卡在「待處理」狀態下太久。

相關資訊

容器相依性

Amazon ECS 容器代理程式 (AWS GitHub)

AWS 官方
AWS 官方已更新 1 年前