為什麼我的 Amazon ECS 任務卡在「待處理」狀態?
我的 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."
要解決此問題,請確定您依賴 (非必要) 的容器如預期般運作。如果您無法解決基礎問題,則將這些容器設定為基本,以避免任務卡在「待處理」狀態下太久。
相關資訊
相關內容
- 已提問 2 年前lg...
- 已提問 5 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 1 個月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 6 個月前
- AWS 官方已更新 2 年前