Тайм-аут Nginx Ingress 504 - EKS с подключением ELB к входу Nginx

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

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

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

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

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

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

1 ответ

Решение

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

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

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

Мы также изменили настройку 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"}}'
Другие вопросы по тегам