使用 UDP ECS 服务对 NetworkLoadBalancer 进行健康检查

Posted

技术标签:

【中文标题】使用 UDP ECS 服务对 NetworkLoadBalancer 进行健康检查【英文标题】:Healthcheck for NetworkLoadBalancer with UDP ECS service 【发布时间】:2020-01-02 01:39:56 【问题描述】:

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

我遇到的问题是,对于 NLB,运行状况检查显然是强制性,并且必须基于 TCP。对于运行状况检查端口,您可以保留默认的“目标”端口(它适用于动态主机端口分配),或者您可以指定一个端口。我不能做的是为 TCP 公开的端口与我的负载均衡器目标 UDP 端口不同。我可以让我的容器在同一端口上同时监听用于生产的 UDP 和用于运行状况检查的 TCP,但任务定义似乎不允许这样做,即使 Docker 支持它也很好。

这似乎使 UDP NLB 对 ECS 服务毫无用处,除非我遗漏了什么?我想出的唯一选择是使用静态配置的主机端口,这样我就可以在受控主机端口上为 TCP 公开第二个端口,并将其作为 NLB 运行状况检查的目标。这样做的问题是,由于无法在一个实例上运行多个任务,我们现在已经失去了 ECS 的所有可扩展性优势。

【问题讨论】:

我遇到了同样的问题。你找到解决办法了吗? 问题仍然存在。 【参考方案1】:

对于上述问题,看起来他们是一个发展。

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

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

【讨论】:

看起来很有希望,感谢您的链接。我会关注 aws 问题并希望它尽快完成。【参考方案2】:

您可以在 UDP 容器旁边设置一个 sidecar 容器,为健康检查提供 TCP 端点。

以下是我们 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 路径和端口。

【讨论】:

以上是关于使用 UDP ECS 服务对 NetworkLoadBalancer 进行健康检查的主要内容,如果未能解决你的问题,请参考以下文章

使用云服务器ECS搭建DoH服务的开发实践

AWS 使用 Fargate 对 ECS 服务的多个端口进行负载平衡

记一次阿里云服务器被用作DDOS攻击肉鸡

AWS EC2 容器服务/Elastic Beanstalk Docker 容器端口 udp 绑定

ECS云服务器不支持Emlog插件Sendmail发邮件的解决办法

ECS API调用方式