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

上次更新日期:2021 年 12 月 3 日

当我连接到在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中运行的 Kubernetes Service 时,会出现 HTTP 504(网关超时)错误。

简短描述

当您连接到 Kubernetes Service 一组容器(pod)(位于为负载均衡器配置的 Amazon EKS 集群中)时,会出现 HTTP 504 错误。

要解决 HTTP 503 错误,请参阅在 Amazon EKS 集群中访问 Kubernetes Service 时如何解决 HTTP 503(服务不可用)错误?

要解决 HTTP 504 错误,请完成以下问题排查步骤。

解决方法

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

负载均衡器建立了与目标的连接,但是目标没有在达到空闲超时期限之前响应。原定设置下,Classic Load BalancerApplication Load Balancer 的空闲超时为 60 秒。

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

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

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

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

要修改 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)或 Worker 节点中的保持活动值。参阅以下有关一组容器(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) 不允许将流量从目标传送到负载均衡器节点的临时端口 (1024-65535)。

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

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