如何對已中斷連線的 Amazon ECS 代理程式進行疑難排解?
我的 Amazon Elastic Container Service (Amazon ECS) 的容器執行個體已中斷連線。
簡短描述
您的 Amazon ECS 容器代理程式在一小時內多次斷線並重新連線,是正常運作的一部分。不需要擔心這些變更事件。僅持續幾分鐘的連線事件可能並不代表容器代理程式或容器執行個體有問題。
但是,如果容器代理程式長時間處於中斷連線狀態,那麼該容器執行個體將無法作為您 Amazon ECS 叢集的一部分來運作。此問題可能是由以下原因之一所造成的:
- 網路問題導致該執行個體與 Amazon ECS 之間無法通訊。
- 容器代理程式沒有與 Amazon ECS 端點通訊所需的 AWS Identity and Access Management (IAM) 權限。
- 容器執行個體內的主機或 Docker 常駐程式有問題。
- 底層主機存在資源爭用問題。
**注意:**最佳實務是使用最新版本的 Amazon ECS 容器代理程式。
解決方法
**注意:**以下解決方案適用於針對 Amazon ECS 最佳化的 Amazon Linux 2 AMI。
您可以使用 SSH 金鑰連線到您的 Amazon EC2 執行個體。如果您尚未產生 SSH 金鑰,可以使用 Session Manager (AWS Systems Manager 的一項功能) 來連線到您的執行個體。預設情況下,Systems Manager Agent 安裝在 Amazon Linux 2 AMI 和 Amazon Linux 2 ECS 最佳化基本 AMI 上。
確認容器代理程式是否正在容器執行個體上執行
若要確認 Amazon ECS 容器代理程式的狀態和連線,請在容器執行個體上執行下列其中一個命令:
$ sudo systemctl status ecs $ sudo docker ps -f name=ecs-agent
輸出會顯示為作用中 (執行),並類似以下內容:
ecs.service - Amazon Elastic Container Service - container agent Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2022-02-15 15:51:09 UTC; 37min ago Docs: https://aws.amazon.com/documentation/ecs/ Process: 30039 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS) Process: 29987 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS) Process: 30077 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS) Main PID: 30123 (amazon-ecs-init) Tasks: 5 Memory: 3.7M CGroup: /system.slice/ecs.service └─30123 /usr/libexec/amazon-ecs-init start CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb1dc8d4ab3b amazon/amazon-ecs-agent:latest "/agent" 3 days ago Up 3 days (healthy) ecs-agent
如果問題是由於代理程式中斷連線引起的,則執行以下命令重新啟動 ECS 代理程式:
$ sudo systemctl restart ecs
**注意:**執行上述命令後,不會傳回任何輸出。
若要確認代理程式是否正在執行,請執行以下命令:
sudo systemctl status ecs
確認 Docker 服務是否在容器執行個體上執行
若要確認 Docker 服務是否在受影響的容器執行個體上執行,請執行下列命令:
sudo systemctl status docker
輸出會顯示為作用中 (執行),並類似以下內容:
docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2022-02-11 17:42:32 UTC; 3 days ago Docs: https://docs.docker.com Process: 4307 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS) Process: 4296 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS) Main PID: 4315 (dockerd) Tasks: 24 Memory: 360.5M CGroup: /system.slice/docker.service ├─4315 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536 ├─6010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80 └─6016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80
如果 Docker 服務處於非作用中狀態,則執行以下命令重新啟動 Docker 服務:
sudo systemctl restart docker
**注意:**執行上述命令後,不會傳回任何輸出。
若要確認 Docker 服務已重新啟動,請執行以下命令:
sudo systemctl status docker
查看容器代理程式和 Docker 的日誌檔案
如果您的容器執行個體仍然處於斷線狀態,請查看容器主機上的容器代理程式和 Docker 的日誌檔案。
檢查以下日誌檔案中是否存在關鍵字,例如 "error"、"warn" 或 "agent transition state":
- 查看 Amazon ECS 容器代理程式的最新日誌,其位於 **/var/log/ecs/ecs-agent.log
注意:**您可以透過篩選到 /var/log/ecs/ecs-agent-log.timestamp 來查看輪換日誌 - 查看 /var/log/ecs/ecs-init.log 中的 Amazon ECS init 日誌
- 查看 /var/log/cloud-init.log 中的使用者資料執行日誌
- 使用命令 sudo journalctl -u docker 查看 Docker 常駐程式日誌
如果您使用 Linux,那麼您也可以查看退出代碼,以獲取有關已停止代理程式容器的更多資訊。如需詳細資訊,請參閱 GitHub 網站上的 exitcodes。
若要取得退出程式碼,請執行以下命令:
docker inspect your container ID
將您的容器 ID 替換為已停止容器的 ID。
**注意:**您可以使用 Amazon ECS 日誌收集器收集 Amazon ECS 的一般作業系統日誌、Docker 日誌和容器代理程式日誌。
確認 IAM 執行個體設定檔是否具有必要的權限
如果容器代理程式仍然處於斷線狀態,請確認與容器執行個體關聯的 IAM 執行個體設定檔是否具有必要的 IAM 權限:
-
使用 SSH 或 Session Manager 連線到執行個體。
-
若要查看與執行個體關聯的執行個體設定檔上的執行個體中繼資料,請執行下列命令:
curl http://169.254.169.254/latest/meta-data/iam/info輸出結果類似下列內容:
{ "Code" : "Success", "LastUpdated" : "2022-02-16T22:42:17Z", "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole", "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN" } -
若要確認特定的憑證錯誤,請執行類似以下的指令,以檢查容器代理程式日誌中的 ECS 日誌清單:
cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-##將 YYYY-MM-DD-## 替換為相關時間戳記。
**注意:**容器代理程式日誌每小時輪換一次。尾碼會自動變更,以反映目前的日期和時間。更新命令以包含問題發生時的日期範圍和日誌 ID。
確認您的容器執行個體具有足夠的資源來執行 ECS 代理程式
如果您的任務具有較高的記憶體/CPU 使用率,那麼您的容器執行個體可能沒有足夠的資源來執行 ECS 代理程式。
Amazon ECS 容器代理程式使用 Docker **ReadMemInfo () ** 函式查詢作業系統可用的記憶體量。
在您的容器執行個體上執行以下命令來查看作業系統識別的總記憶體:
free -b
執行針對 Amazon ECS 最佳化的 Amazon Linux AMI 的 t2.large 執行個體的範例輸出結果:
total used free shared buff/cache available Mem: 8361193472 298577920 7325388800 405504 737226752 7844274176 Swap: 0 0 0
您可以選擇為 Amazon ECS 容器代理程式及其他重要系統程序在您的容器執行個體上保留部分記憶體。保留這部分記憶體有助於確保您的工作負載容器不會與其他程序爭用相同的記憶體資源。如需詳細資訊,請參閱預留 Amazon ECS Linux 容器執行個體記憶體。
確認環境變數 ECS_CLUSTER 具有正確的叢集名稱
如果 Amazon ECS 容器代理程式的設定參數 ECS_CLUSTER 具有錯誤的叢集名稱,則該容器執行個體將無法加入叢集。若要檢查 /etc/ecs/ecs.config 檔案的內容以確認此參數,請執行以下命令:
cat /etc/ecs/ecs.config
確認 ECS 代理程式能夠與 ECS 端點進行通訊
若要連線 ECS 端點,網路存取控制清單和容器執行個體安全群組必須允許連接埠 443 (HTTPS) 上的傳出連線。
若要檢查到 ECS 端點 (ACS/TCS) 的傳出連線,請在容器執行個體上執行以下其中一個命令:
sudo yum install telnet -y$ telnet ecs.region.amazonaws.com 443
-或-
$ curl https://ecs.region.amazonaws.com
請參閱以下最佳實務:
- 除非您的應用程式需要特定的作業系統或不支援的 Docker 版本,否則請使用針對 Amazon ECS 最佳化的 AMI 來執行您的 ECS 工作負載。
- 請使用最新版的 Amazon ECS 容器代理程式。最新版本包含強化的功能並提供重要的更新。
- 設定任務的 CPU 和記憶體限制。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 3 年前
- 已提問 2 年前