没有 ELB 的 ECS 任务的 HealthCheck

chr*_*itz 4 amazon-ecs

我们有一个运行在 ECS 集群中的 Docker 容器(Spring Boot)。我们在没有 Elastic Load Balancing 的情况下运行它。

我们希望在不停机的情况下更新服务,因此当新任务正常运行时,旧任务停止。我们一直在尝试在任务定义上添加健康检查,但它拒绝工作。我已经尝试过这些基本的健康检查命令。

[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]
Run Code Online (Sandbox Code Playgroud)

我希望前者会导致一个健康状况良好的任务,而后者会导致健康检查失败..在这两种情况下,新任务都可以正常启动,但健康状况未知。

这与我们不使用 ELB 有关系吗?文档不是很好,我的谷歌搜索没有返回任何有用的东西。

小智 5

Given 命令在语法上无效。

它应该是

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
Run Code Online (Sandbox Code Playgroud)
  • CMDCMD-SHELL- 使用容器的默认 shell 运行命令
  • curl -f http://localhost/ - 需要在容器内执行以验证健康检查的实际命令。
  • exit 1 - 如果 curl 命令失败,那么它将退出 shell

所以你应该像下面一样改变你的命令。

[ "CMD-SHELL", "echo hi || exit 1" ]
Run Code Online (Sandbox Code Playgroud)

echo hi 是我的示例中的 helath 检查命令,您可以执行任何命令而不是“echo hi”,如果它在您的容器中成功运行,则应返回退出状态 0。


小智 5

raja 的回答和 Andrew 的编辑对 ECS/FARGATE 的回答略有偏差。它没有括号也没有引号:

CMD-SHELL, curl -f http://localhost/ || exit 1
Run Code Online (Sandbox Code Playgroud)

如果在 ECS 的任务定义中输入健康检查信息,这是正确的格式。

有效文档https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

ECS/FARGATE 的无效文档 https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html

  • 但是如果容器没有暴露 80 端口怎么办?例如队列或redis容器? (2认同)