使用 UDP ECS 服务对 NetworkLoadBalancer 进行运行状况检查

问题描述 投票:0回答:4

我正在尝试部署仅使用 UDP 端口的 ECS 服务。通过 NetworkLoadBalancers 添加了对 UDP 负载平衡的支持,因此我部署了服务,允许为我的任务分配动态主机端口,并使用适当的侦听器和目标组设置 NLB。

我遇到的问题是,健康检查对于 NLB 来说显然是“强制”的,并且必须基于 TCP。对于运行状况检查端口,您可以保留默认的“目标”端口(这适用于动态主机端口分配),也可以指定一个端口。我不能做的是为 TCP 暴露一个与我的负载均衡器目标 UDP 端口不同的端口。我可以让我的容器在同一端口上监听用于生产的 UDP 和用于健康检查的 TCP,但任务定义似乎不允许这样做,尽管 Docker 很好地支持它。 这似乎使得 UDP NLB 对于 ECS 服务毫无用处,除非我遗漏了什么?我提出的唯一替代方案是使用静态配置的主机端口,这样我就可以在受控主机端口上公开 TCP 的第二个端口,并将其作为 NLB 运行状况检查的目标。问题是我们现在已经失去了 ECS 的所有可扩展性优势,因为无法在一个实例上运行多个任务。

amazon-web-services amazon-ec2 udp amazon-ecs aws-elb
4个回答
4
投票

{ "name": "healthcheck", "image": "busybox:latest", "essential": true, "portMappings": [ { "containerPort": 8080, "hostPort": 8080, "protocol": "tcp" } ], "entryPoint": ["sh", "-c"], "command": [ "while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; echo 'ok'; } | nc -l -p 8080; done" ] }



2
投票

https://github.com/GetSimpl/cloudlift/pull/43

https://github.com/aws/containers-roadmap/issues/850


1
投票

以下是在 NLB 目标组中运行的服务的 ECS 任务定义的截断示例:

{ "containerDefinitions": [ { "image": "[your-udp-image]", "essential": true, "portMappings": [ { "containerPort": 5008, "protocol":"udp" } ] }, { "image": "[your-tcp-health-check-image]", "essential": true, "portMappings": [ { "containerPort": 5006, "protocol":"tcp" } ], "healthCheck": { "command": [ "CMD-SHELL", "curl -f http://localhost:5006 || exit 1" ], "interval": 10, "timeout": 5, "retries": 3, "startPeriod": 120 } } ] }

然后你的目标组的健康检查设置可以只指向你的健康检查容器的TCP路径和端口。


0
投票

原因是:

您必须在NLB TG中定义健康检查,它只能是TCP或HTTP
  1. 因此您需要在任务定义中映射 TCP 和 UDP 端口 - UDP 用于流量,TCP 用于健康检查
  2. 为了托管多个实例,您必须使端口映射动态(hostPort:0)并将TG中的健康检查端口设置为“traffic-port”
  3. 在这种情况下,ECS 可以为 UDP 和 TCP 分配不同的端口,这会导致健康检查始终失败,服务永远不稳定。
  4. 确实,请求(
https://github.com/aws/containers-roadmap/issues/850

)似乎解决了问题,因为您将能够为 UDP 流量和 TCP 运行状况检查映射相同的动态端口。不过已经开了好久了...

© www.soinside.com 2019 - 2024. All rights reserved.