我们有一个在 ECS 集群中运行的 Docker 容器 (Spring Boot)。我们在没有 Elastic Load Balancing 的情况下运行它。
我们希望在不停机的情况下更新服务,因此当新任务启动并正常运行时,旧任务就会停止。我们一直在尝试在任务定义上添加健康检查,但它拒绝工作。我尝试了这些基本的健康检查命令。
[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]
我希望前者导致任务具有“健康”状态,而后者导致健康检查失败。在这两种情况下,新任务都启动正常,但健康状态为“未知”。
这与我们不使用 ELB 有什么关系吗?文档不是很好,而且我的 Google 搜索也没有返回任何有用的东西。
答案1
raja 的回答和 Andrew 的编辑对于 ECS/FARGATE 略有偏差。它没有括号,也没有引号:
CMD-SHELL, curl -f http://localhost/ || exit 1
如果在 ECS 的任务定义中输入健康检查信息,这是正确的格式。
ECS/FARGATE 的文档无效 https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html
答案2
给定的命令在语法上无效。
它应该是
[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
CMD
或者CMD-SHELL
- 使用容器的默认 shell 运行该命令curl -f http://localhost/
- 需要在容器内执行以验证健康检查的实际命令。exit 1
- 如果 curl 命令失败,它将退出 shell
因此您应该像下面这样更改您的命令。
[ "CMD-SHELL", "echo hi || exit 1" ]
echo hi 是我的示例中的健康检查命令,您可以执行任何命令而不是“echo hi”,如果它在您的容器中成功运行,它应该返回退出状态 0。
答案3
如果您使用 ecs-cli 部署 fargate 服务,我发现您必须升级到支持任务定义中的健康检查的版本。我还发现不需要使用 CMD-SHELL - 事实上,当您添加它时它会中断,在生成的任务定义的结果 json 中将您的 CMD-SHELL 与另一个 CMD-SHELL 包装在一起(如在 aws 控制台中看到的那样)。
因此对我有用的是将 ecs-cli 从 1.4.0 升级到 1.7.0,然后在服务下的 ecs-params.yml 文件中添加 healthcheck:
task_definition:
ecs_network_mode: awsvpc
task_role_arn: arn:aws:iam::........
task_execution_role: arn:aws:iam::........
task_size:
cpu_limit: 2048
mem_limit: 4GB
services:
foo:
healthcheck:
command: ps cax | grep "[p]ython"
interval: 30s
timeout: 10s
retries: 2
essential: true
答案4
例如,如果您的“端口映射”适用8000:8000
于“ECS EC2”或8000 tcp
“ECS Fargate”,则“HEALTHCHECK”的“命令”为:
CMD-SHELL, curl -f http://localhost:8000/ || exit 1
在这种情况下,8000
不要忘记。http://localhost: