我的多个 Amazon Elastic Container Service (Amazon ECS) 容器实例具有 ECS 容器代理,这些容器实例处于断开连接状态。为什么会断开连接?

ECS 容器代理将 ECS 容器实例与您的集群关联,告知 Docker 何时启动、停止容器或者查询您指定要运行的容器。如果代理无法访问服务,则容器实例无法作为 ECS 集群的成员运行。有关容器代理的更多信息,请参阅 Amazon ECS 容器代理

在其正常操作中,容器代理可能会在一个小时内断开连接并重新连接数次。持续仅几分钟的连接事件并不能表明容器代理或您的容器实例出现问题。有关更多信息,请参阅容器实例状态更改事件

如果容器代理保持断开连接状态的时间已超过数分钟,则容器实例无法作为 ECS 集群的成员运行。造成此问题的原因如下:

  • 网络问题阻止了实例与 ECS 之间的通信。
  • 容器代理缺乏必需的 AWS Identity and Access Management (IAM) 权限,无法与 ECS 终端节点通信。
  • 问题发生在主机级别或容器实例内部的 Docker 守护程序级别。

以下步骤可帮助确定造成故障的原因。使用 AWS 提供的针对 Amazon ECS 进行优化的 Amazon 系统映像 (AMI) 支持这些命令。

注意:如果使用不同 AMI,则可能需要进行更改。

请验证 Docker 守护程序是否正在容器实例上运行

要验证 Docker 守护程序是否正在受影响容器实例上运行,请运行以下命令:

ps aux | grep dockerd

此命令输出应该类似于以下内容:

root      2909  7.0  1.2 699128 52284 ?        Sl   13:29   0:04 /usr/bin/dockerd --default-ulimit nofile=1024:4096 --storage-driver devicemapper --storage-opt dm.thinpooldev=/dev/mapper/docker-docker--pool --storage-opt dm.use_deferred_removal=true --storage-opt dm.fs=ext4 --storage-opt dm.use_deferred_deletion=true

验证 Docker 容器守护程序是否正在容器实例上运行

要验证 Docker 容器守护程序是否正在受影响容器实例上运行,请运行以下命令:

ps aux | grep docker-containerd

此命令输出应该类似于以下内容:

root      2916  0.8  0.3 361096 12396 ?        Ssl  13:29   0:02 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

如果这些命令未输出预期的结果,请通过运行以下命令来执行 Docker 守护程序的停止和启动:

sudo service docker stop && sudo service docker start

命令的输出应包含两行,指示与 Docker 服务在主机级别的停止和启动相关的 [OK] 状态。

验证容器实例上是否正在运行容器代理

要验证容器代理是否正在受影响容器实例上运行,请运行以下命令:

docker ps

注意:默认情况下,容器代理使用 ecs-agent 作为 Docker 容器名称,但如果您自己运行容器,则名称可能会不同。

如果 ECS 容器代理未运行,请使用以下命令来启动它:

sudo start ecs

如果在启动容器代理之后,ECS 集群仍具有断开连接状态,请验证与容器实例关联的 IAM 实例配置文件是否具有必需的 IAM 权限。

验证 IAM 实例配置文件是否具有必需的权限

使用 IAM 控制台或 AWS 命令行界面 (AWS CLI),验证与容器实例关联的实例配置文件是否满足必需的要求

在实例级别分析容器代理日志文件,确保没有凭证错误。容器代理日志每小时轮换一次,后缀自动更改以体现当前的日期和时间。运行以下命令以列出 ECS 日志:

cat /var/log/ecs/ecs-agent.log.2017-10-24-13

注意:更新命令以包括出现问题的日期范围。

如果容器代理没有所需的凭证,则在日志中会看到类似于以下的错误:

2017-10-24T13:48:59Z [INFO] Registering Instance with ECS
2017-10-24T13:48:59Z [ERROR] Could not register: NoCredentialProviders: no valid providers in chain. Deprecated.
	For verbose messaging see aws.Config.CredentialsChainVerboseErrors
2017-10-24T13:48:59Z [CRITICAL] Could not create cluster: NoCredentialProviders: no valid providers in chain. Deprecated.
	For verbose messaging see aws.Config.CredentialsChainVerboseErrors
2017-10-24T13:48:59Z [ERROR] Error registering: NoCredentialProviders: no valid providers in chain. Deprecated.
	For verbose messaging see aws.Config.CredentialsChainVerboseErrors

此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助?请访问 AWS 支持中心

发布时间:2016 年 8 月 4 日

更新时间:2018 年 7 月 19 日