如何解决 Amazon EKS 中的 HTTP 504 错误?

上次更新时间:2020 年 2 月 17 日

在通过 Amazon Elastic Kubernetes 服务 (Amazon EKS) 中的 Classic Load Balancer 或 Application Load Balancer 连接到 Kubernetes 服务时出现 HTTP 504 错误。

简短描述

您的 HTTP 504 错误可能是由于以下原因造成的:

  • 负载均衡器建立了与目标的连接,但是目标没有在达到空闲超时期限之前响应。默认情况下,Classic Load Balancer 和 Application Load Balancer 的空闲超时为 60 秒。
  • 负载均衡器未能在连接超时到期(10 秒)之前建立与后端目标的连接。
  • 子网的网络访问控制列表 (ACL) 不允许将流量从目标传送到负载均衡器节点的临时端口 (1024-65535)。

解决方法

验证您的负载均衡器的空闲超时设置是否正确

1.    检查您的 Classic Load BalancerApplication Load Balancer 的 Amazon CloudWatch 指标。

如果延迟数据点等于您当前配置的负载均衡器超时值且 HTTPCode_ELB_5XX 指标中有数据点,则说明至少一个请求已超时。

2.    修改负载均衡器的空闲超时,以便 HTTP 请求可以在空闲超时期限内完成,或者将应用程序配置为更快地响应。

要修改 Classic Load Balancer 的空闲超时,请更新服务定义以包括 service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout 注释。有关示例,请参阅其他 ELB 注释

要修改 Application Load Balancer 的空闲超时,请更新入口定义以包括 alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds 注释。有关示例,请参阅入口注释

验证您的后端实例是否没有后端连接错误

如果后端实例在负载均衡器达到其空闲超时值之前关闭与负载均衡器的 TCP 连接,则负载均衡器可能无法满足请求。

1.    检查 Classic Load Balancer 的 CloudWatch BackendConnectionErrors 指标,以及 Application Load Balancer 的目标组的 TargetConnectionErrorCount

2.    在后端工作线程节点或 Pod 上启用保持活动设置,并将保持活动超时的值设置为大于负载均衡器的空闲超时。

要查看保持活动超时是否小于空闲超时,请验证 Pod 或工作线程节点中的保持活动值。参阅以下有关 Pod 和节点的示例:

对于 Pod:

$ kubectl exec your-pod-name -- sysctl \
    net.ipv4.tcp_keepalive_time \
    net.ipv4.tcp_keepalive_intvl \
    net.ipv4.tcp_keepalive_probes

对于节点:

$ sysctl \
    net.ipv4.tcp_keepalive_time \
    net.ipv4.tcp_keepalive_intvl \
    net.ipv4.tcp_keepalive_probes

验证您的后端目标是否可以在临时端口范围内接收来自负载均衡器的流量

您必须将安全组和网络 ACL 配置为允许数据在负载均衡器和后端目标之间移动。例如,根据负载均衡器的类型,这些目标可以是 IP 地址或实例。

要为临时端口访问配置安全组,必须将节点和 Pod 的安全组出口规则连接到负载均衡器的安全组。有关更多信息,请参阅使用安全组以及添加和删除规则