Nginx Ingress 504 超时-带有 ELB 的 EKS 连接到 nginx ingress

Nginx Ingress 504 超时-带有 ELB 的 EKS 连接到 nginx ingress

我们正在使用 AWS 中的 NLB,通过 nginx 入口控制器连接到我们的 EKS 集群。我们的某些请求会随机出现 504 网关超时。

我们认为我们已经将问题调试到了我们的 nginx 入口。根据 Stackoverflow 的一些建议,我们尝试了连接标头。

  1. 我们将连接设置为“关闭”,这没有效果
  2. 我们再次设置连接“保持活动”无效

我们还注意到了另一种行为,即proxy_read_timeout当时间为 60 秒时,浏览器发出的请求将在 60.xx 秒内完成。当我们将其减少到 30 秒时,它变成了 30.xx,20 秒变成了 20.xx。我们将其减少到 1 秒,但仍然会随机出现 504 网关超时,不明白为什么proxy_read_timeout我们的环境中会出现这种行为。

我们想了解 的效果是什么proxy_read_timeout,为什么会出现上述行为?还有没有办法在我们的 nginx ingress 上将 Connection 设置为“”(我们无法通过 执行此操作nginx.ingress.kubernetes.io/connection-proxy-header: ""

提前致谢!

答案1

我们认为我们的问题与此有关:

https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-troubleshooting.html#loopback-timeout

我们在 nginx 入口控制器中使用内部 nlb,目标通过实例 ID 注册。我们发现 504 超时和 X 秒等待仅发生在与我们的某个入口控制器副本共享节点的应用程序上。我们结合使用 nodeSelector、标签、污点和容忍度来强制入口控制器进入它们自己的节点,似乎已经消除了超时问题。

我们还将 externalTrafficPolicy 设置更改为 Local。

答案2

我遇到了与 J. Koncel 相同的问题,其中与 nginx 入口控制器共享相同节点的应用程序是唯一出现 504 超时的应用程序。

我没有使用 nodeSelectors 和 taints/tolerations,而是使用了 Pod 反亲和性:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity

我在 nginx-ingress-controller 的规范中添加了一个标签

podType: ingress

然后,我更新了不应与 nginx-ingress-controller 安排在同一实例上的应用程序的 yml 文件,如下所示:

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: podType
          operator: In
          values:
          - ingress
      topologyKey: "kubernetes.io/hostname"

答案3

目前我无法发表评论,但以下行应该可以帮助您添加 externalTrafficPolicy 设置:

kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'

相关内容