У меня есть кластер Kubernetes, в котором запущено приложение Django в контейнере докеров, обслуживаемом uWSGI. Контроллер входящего трафика - ingress-nginx (этот: https://github.com/kubernetes/ingress-nginx).
Недавно я обновил весь кластер с 1.9 до 1.11, и из-за некоторых проблем мне пришлось запустить kubeadm reset
и kubeadm init
очередной раз.
С тех пор (я думаю) иногда я получаю странные ошибки 502, о которых сообщают пользователи: upstream prematurely closed connection while reading response header from upstream
.
Самая большая проблема для меня в том, что эти запросы не видны в журналах uWSGI внутри контейнера, поэтому я понятия не имею, что происходит.
Вот мой файл uwsgi.ini:
[uwsgi]
http = 0.0.0.0:8000
# Django-related settings
# the base directory (full path)
chdir = /app
# Django's wsgi file
module = in_web_server.wsgi:application
pythonpath = /app
static-map = /static=/app/static
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# clear environment on exit
vacuum = true
# spooler setup
spooler = /spooler
spooler-processes = 2
spooler-frequency = 10
Dockerfile CMD: CMD ["/usr/local/bin/uwsgi", "--ini", "/app/in_web_server/docker/in/in_web_server_uwsgi.ini"]
Kubernetes Ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: in-debug
namespace: in-debug
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "0"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}
spec:
rules:
- host: test-in
http:
paths:
- path: "/"
backend:
serviceName: in-debug
servicePort: 8000
Эти ошибки относятся только к большим (но не очень большим) запросам PUT. Под большим я имею в виду ~ 300 КБ, так что это не имеет большого значения.
Кроме того, ошибка 502 возвращается примерно через 1 минуту, поэтому, возможно, возникла проблема с тайм-аутом. Однако я не могу его найти, поскольку в журнале uwsgi нет следов. Есть намеки на то, что я делаю не так?
Из https://monicalent.com/blog/2013/12/06/set-up-nginx-and-uwsgi/ Я обнаружил параметр «limit-as», который ограничивает размер виртуальной памяти процесса и может быть ответственным за код ошибки 502 с сообщением «восходящее преждевременно закрытое соединение».
Основываясь на проблемах (см. Список ниже), я бы рекомендовал попробовать отключить буферизацию и поэкспериментировать со значениями тайм-аута. Например, попробуйте поставить их на контроллер nginx-ingress. config-map и удалите их из конфигурации объекта Ingress.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: in-debug
namespace: in-debug
annotations:
nginx.org/proxy-buffering: "False"
...
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-config
data:
proxy-connect-timeout: "600s"
proxy-read-timeout: "600s"
client-max-body-size: "5m"
Список проблем:
Руководства: