不使用 ELB 对 ECS 任务进行健康检查

不使用 ELB 对 ECS 任务进行健康检查

我们有一个在 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 的任务定义中输入健康检查信息,这是正确的格式。

有效文件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

答案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:

相关内容