Назад | Перейти на главную страницу

Nginx Ingress 504 timeout - EKS с ELB, подключенным к nginx ingress

Мы используем NLB в AWS, подключенном к нашему кластеру EKS через входной контроллер nginx. Некоторые из наших запросов получают случайный таймаут шлюза 504.

Мы думаем, что отладили проблему с нашим входом nginx. Основываясь на некоторых рекомендациях Stackoverflow, мы поигрались с заголовками Connection.

  1. Мы установили соединение "закрыть", это не повлияло
  2. Устанавливаем соединение "keep-alive" снова без эффекта

Мы также заметили другое поведение с нашим proxy_read_timeout когда это было 60 секунд, наш запрос от браузера будет выполнен за 60.xx секунд. Когда мы уменьшили его до 30, получилось 30.xx, 20 стало 20.xx. Мы перешли на 1, но по-прежнему получаем случайные таймауты шлюза 504 и не понимаем, почему proxy_read_timeout имеет такое поведение в нашей среде.

Мы хотим понять, каков эффект proxy_read_timeout и почему мы получаем вышеуказанное поведение? Также есть способ установить соединение на "" на нашем входе nginx (мы не можем сделать это через nginx.ingress.kubernetes.io/connection-proxy-header: "")

Заранее спасибо!

Мы думаем, что наша проблема была связана с этим:

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

Мы используем внутренний nlb с нашим контроллером входящего трафика nginx с целями, зарегистрированными по идентификатору экземпляра. Мы обнаружили, что таймаут 504 и X секунд ожидания имели место только в приложениях, которые совместно использовали узел с одной из реплик нашего входящего контроллера. Мы использовали комбинацию nodeSelectors, меток, taints и допусков, чтобы принудительно установить контроллеры входа на их собственный узел, и, похоже, это устранило таймауты.

Мы также изменили настройку externalTrafficPolicy на Local.

У меня была та же проблема, что и у J. Koncel, когда мои приложения, которые совместно использовали те же узлы, что и входной контроллер nginx, были единственными, у которых был таймаут 504.

Вместо использования nodeSelectors и taints / терпимости я использовал антиаффинность Pod: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity.

Я добавил метку в спецификацию для моего nginx-ingress-controller

podType: ingress

Затем я обновил файлы yml для приложений, которые не должны планироваться в том же экземпляре, что и nginx-ingress-controller, следующим образом:

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

На данный момент я не могу комментировать, но следующая строка должна помочь вам добавить параметр externalTrafficPolicy:

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