AWS/EKS:从 ALB 频繁收到 504 网关超时错误

vma*_*loc 6 amazon-web-services amazon-elb amazon-eks

我正在使用 EKS 部署服务,入口在 alb-ingress-controller 之上运行。

总而言之,我有一个 pod 的大约 10 个副本,具有将NodePort流量转发给它们的单一服务类型。副本在 10 个节点上运行,使用 eksctl 建立,分布在 3 个可用区中。

我看到的问题非常奇怪 - 在集群内部,所有日志都显示请求的处理时间不到 1 秒,大部分在 20-50 毫秒左右。我知道这一点是因为我使用 linkerd 来显示请求延迟的百分位数以及应用程序日志本身。然而,ALB 日志/监控讲述了一个截然不同的故事。我发现请求延迟相对较高(通常接近 20 秒或更长),并且通常还会从 ELB 返回 504 错误(有时每 5 分钟 2-3 个)。

当尝试读取 ALB 的访问日志时,我注意到 504 行如下所示:

https 2019-12-10T14:56:54.514487Z app/1d061b91-XXXXX-3e15/19297d73543adb87 52.207.101.56:41266 192.168.32.189:30246 0.000 -1 -1 504 - 747 308 "GET XXXXXXXX" "-" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:eu-west-1:750977848747:targetgroup/1d061b91-358e2837024de757a3d/e59bbbdb58407de3 "Root=1-5defb1fa-cbcdd248dd043b5bf1221ad8" "XXXX" "XXXX" 1 2019-12-10T14:55:54.514000Z "forward" "-" "-" "192.168.32.189:30246" "-"
Run Code Online (Sandbox Code Playgroud)

其中请求处理时间为0,目标处理时间为-1,表示请求从未到达后端,并且立即返回响应。

我尝试使用后端 HTTP keepalive 超时(当前为 75 秒)和 ALB 空闲时间(当前为 60 秒),但这种行为似乎没有太大变化。

如果有人能指出我如何继续和调查这个问题,或者原因可能是什么,我将非常感激。

Sri*_*m G 3

我们在 EKS 和 ALB 组合方面遇到了类似的问题。如果目标响应代码为-1,则目标端的请求等待队列可能已满。因此 ALB 将立即放弃该请求。

尝试ab通过跳过 ALB 并直接将请求发送到服务或私有 IP 地址来进行基准测试。这样做将帮助您确定问题出在哪里。

对于我们来说,如果我们通过 ALB 发送流量,十分之一的请求会失败。如果我们直接将请求发送到服务,我们不会看到失败。

AWS 建议使用 NLB 而不是 ALB。NLB 具有更多优势,适合 Kubernetes。有一篇博客解释了在 Amazon EKS 上使用网络负载均衡器和 NGINX 入口控制器

我们更改为 NLB,现在不会收到 5XX 错误。