Тайм-аут Nginx Ingress 504 - EKS с подключением ELB к входу Nginx
Мы используем NLB в AWS, подключенном к нашему кластеру EKS через входной контроллер nginx. Некоторые из наших запросов получают случайный тайм-аут 504.
Мы думаем, что отладили проблему до нашего входа в nginx. Основываясь на некоторых рекомендациях Stackoverflow, мы поиграли с заголовками подключений.
- Мы установили соединение "закрыть", это не имело никакого эффекта
- Мы устанавливаем соединение "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"}}'