我有一个 Kubernetes 集群,它在由 uWSGI 提供服务的 docker 容器中运行 Django 应用程序。入口控制器是 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 ["/usr/local/bin/uwsgi", "--ini", "/app/in_web_server/docker/in/in_web_server_uwsgi.ini"]
Kubernetes 入口:
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 请求。我说的较大是指 ~300KB,所以这不是什么大问题。
此外,大约 1 分钟后返回 502 错误,因此可能存在超时问题。但是我无法找到它,因为 uwsgi 日志中没有任何痕迹。有什么提示我做错了什么吗?
答案1
从https://monicalent.com/blog/2013/12/06/set-up-nginx-and-uwsgi/ 我发现“limit-as”选项限制了进程虚拟内存大小,并且可能导致 502 错误代码和消息“上游过早关闭连接”。
答案2
根据问题(见下面的列表),我建议尝试关闭缓冲,并尝试使用超时值。例如,尝试将它们放入 nginx-ingress 控制器配置图并将其从 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"
问题列表:
手册: