【问题标题】:ECS Health Check Issue with Spring Boot Management PortSpring Boot 管理端口的 ECS 健康检查问题
【发布时间】:2020-10-30 19:23:05
【问题描述】:

设置 1:(不工作)

我有一个任务在 ECS 集群中运行。但它正在下降,因为它开始后立即进行健康检查。

我的服务是基于 Spring Boot 的,它同时具有流量(用于服务调用)和管理端口(用于健康检查)。我有"*/health" 路径的“permitAll() 权限。

PFA:我也通过在 TG 运行状况检查选项卡中选择覆盖端口选项进行了相同的配置。

设置 2:(工作正常) 我的 docker-compose 文件中有相同的设置,并且我可以访问本地容器中的健康检查端点。 这就是我在撰写中定义的方式:

service:
  image: repo/a:name
  container_name: container-1
  ports:
    - "9904:9904" # traffic port
    - "8084:8084". # management Port

所以,我尝试在容器部分的 Task Def 上配置管理端口。我尝试为这个最新版本的 TD 更新相应的服务,但是当我保存这个服务时,我得到一个错误。这是正确的处理方式吗?

ECS 控制台出错:

Failed updating Service : The task definition is configured to use a dynamic host port, 
but the target group with targetGroupArn arn:aws:elasticloadbalancing:us-east-2:{accountId}:targetgroup/ecs-container-tg/{someId} has a health check port specified.
Service

两种可能的解决方案:

  1. 有没有办法可以在 docker 文件中指定此端口映射?
  2. 在 ECS 内任务定义的容器配置中配置管理端口映射的另一种方法? (首选)
  3. 摆脱 Spring Boot 的执行器端点并实现我们自己的健康端点? (坏:因为我需要实现很多东西来显示弹簧启动返回的所有细节)

【问题讨论】:

    标签: spring-boot docker docker-compose amazon-ecs aws-application-load-balancer


    【解决方案1】:

    任务定义配置为使用动态主机端口,但目标指定了健康检查端口。

    根据错误,您似乎在任务定义中配置了动态端口映射,您可以在任务定义中验证这一点。

    understanding-dynamic-port-mapping-in-amazon-ecs

    因此在动态端口中,ECS 调度会在主机中分配和发布随机端口,该端口与8082 不同,因此将健康检查设置相应地更改为流量端口。

    这将解决健康问题,现在来咨询

    有没有办法可以在 docker 文件中指定这个端口映射?

    不,端口映射发生在运行时而不是构建时,您可以在任务定义中指定。

    在 ECS 内任务定义的容器配置中配置管理端口映射的另一种方法? (首选)

    您可以指定静态端口映射,这意味着发布端口和公开端口都将是相同的8082:8082,在此运行状况检查中将使用静态端口映射。

    摆脱 Spring Boot 的执行器端点并实现我们自己的健康端点? (坏:因为我需要实现很多东西来显示弹簧启动返回的所有细节)

    Healthcheck 是简单的 HTTP 获取 ALB 期望 200 HTTP status code 响应的调用,因此您可以创建一个返回 200 HTTP status code 的简单端点。

    【讨论】:

    • 感谢您的回复。因此,我暂时在我的服务中实现了一个简单的端点。此 API 的响应是:响应正文:{“状态”:true,“详细信息”:“服务器已启动并运行”} 我仍然面临一个问题,因为“由于(原因健康检查失败,这些代码:[502] )"
    • 好的,现在检查 ECS 事件选项卡是否有任何事件?还是应用程序真的在运行?能够通过 ssh 连接到实例吗?
    • 是的,没有。每 3 分钟发生一次事件,它通过杀死旧任务来启动新任务。这就是我发现此错误消息 502 的地方。EC2 正在运行,我也可以 ssh。我认为问题是,ALB 无法读取我发送的响应?因为我在进行旧的健康检查时遇到了同样的问题。这意味着 ALB 可以在我的案例(简单端点和框架的端点)中达到健康端点。
    • 看来任务失败了,做 ssh 并运行curl localhost:PORT/health?如果这在实例内部响应,我们可以在 ALB 级别进行调查
    【解决方案2】:

    所以,在做了 2 天不同的事情之后:

    1. 在任务定义中,组网方式应为“Bridge”类型
    2. 在任务定义中,将 CPU 和内存单元留空。在容器级别提供它们就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多