带有UDP ECS服务的NetworkLoadBalancer的运行状况检查

时间:2019-08-28 19:33:20

标签: amazon-web-services amazon-ec2 udp amazon-ecs aws-elb

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

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

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

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您可以做的是在您的 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 路径和端口。