【发布时间】:2017-07-12 16:32:33
【问题描述】:
我对侦听/响应事件感兴趣,因为 cpu 或内存不足,服务无法启动任务。如果我选择特定服务并查看其“事件”选项卡,则可以在控制台中查看此信息。在那里,将显示如下事件:
“服务 X 无法放置任务,因为没有容器实例满足其所有要求。最匹配的容器实例 Y 的可用 CPU 单元不足。有关详细信息,请参阅故障排除部分。”
集群中的容器实例在 AutoScalingGroup 中进行管理,因此适当的操作是通过扩展额外的实例来对此事件做出反应,然后允许安排任务运行。现在,我的问题是,我该如何应对这个事件?
我有一个 LogGroup,其中包含来自集群中所有 EC2 实例的以下文件的数据:
- /var/log/dmesg
- /var/log/messages
- /var/log/docker
- /var/log/ecs/ecs-init.log.*
- /var/log/ecs/ecs-agent.log.*
(EC2 实例基于 amazon-ecs-optimized 镜像)
最初,我认为“服务 X 无法放置任务...”消息会出现在这些日志文件之一中(更具体地说,在 ecs-agent.log 或 ecs-init.log 中),但事实并非如此。
然后我意识到“ECS 事件”是一个东西(在http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html 上查看更多信息)。但不幸的是,此特定事件不是“ECS 事件”支持的事件。仅有的: 容器实例状态更改事件和任务状态更改事件。 不是“服务状态更改事件”。即使有人会认为服务中“事件”选项卡中的事件也会被流式传输,但事实并非如此。我开始意识到文档甚至说:
“您可以使用 CloudWatch Events 的 Amazon ECS 事件流来接收有关 Amazon ECS 集群中容器实例的当前状态以及所有 在这些容器实例上运行的任务。”
因此,“用于 CloudWatch 事件的 Amazon ECS 事件流”不是流式传输服务事件(因此不是被阻止运行的任务的事件)。我真的希望将来会包含“服务状态更改事件”,这样我就可以创建一个与该事件匹配的 CloudWatch 事件规则,触发一个 Lambda 函数,然后确定该事件是否是“服务 X”类型的事件无法放置任务...”,并基于此操作 AutoScalingGroup 以将其他实例扩展到集群。
但如前所述,目前不支持此功能。有没有其他方法可以让我“倾听”这个事件?我什至想过每 2-3 分钟运行一次 lambda,它使用 CLI 调用“aws ecs describe-services --service X”以输出事件列表,然后匹配“服务 X 无法放置任务” ...“ 事件。但这似乎是错误的......
非常感谢任何帮助。谢谢!
【问题讨论】:
-
如果 AWS 为 ECS 提供了合理的指标(absolute cpu/memory available),那么这是可能的。也就是说,当这些值低于集群上运行的服务的最大要求并适当扩展时,可以设置警报。向 AWS 提出功能请求?
-
我不确定绝对可用的 CPU/内存是否足够。您可能有一个实例有足够的可用内存,而另一个实例有足够的 cpu,但没有一个实例同时具有足够的内存和 cpu。然后还有其他可能使问题复杂化的约束条件,例如可用端口、主机标签等。您仍然会遇到放置错误,并且您仍然希望捕获它们并可能扩大集群的大小。
-
现在可以吗?
标签: amazon-web-services amazon-ecs