60 秒后 NGINX 入口控制器超时请求
NGINX ingress controller timing out request after 60s
当请求超过 60 秒才能响应时,入口控制器似乎会反弹
据我所见,我们的 NGINX 入口控制器 returns 在请求处理超过 60 秒后向客户端发送 504。我可以从 NGINX 日志中看到这一点:
2019/01/25 09:54:15 [error] 2878#2878: *4031130 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 10.244.0.1, server: myapplication.com, request: "POST /api/text HTTP/1.1", upstream: "http://10.244.0.39:45606/api/text", host: "myapplication.com"
10.244.0.1 - [10.244.0.1] - - [25/Jan/2019:09:54:15 +0000] "POST /api/text HTTP/1.1" 504 167 "-" "PostmanRuntime/7.1.6" 2940 60.002 [default-myapplication-service-80] 10.244.0.39:45606 0 60.000 504 bdc1e0571e34bf1223e6ed4f7c60e19d
第二个日志项显示上游响应时间和请求时间均为 60 秒(参见NGINX log format here)
但是我在入口配置中指定所有超时值都是 3 分钟:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: aks-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/send_timeout: "3m"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "3m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3m"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3m"
spec:
tls:
- hosts:
- myapplication.com
secretName: tls-secret
rules:
- host: myapplication.com
http:
paths:
- path: /
backend:
serviceName: myapplication-service
servicePort: 80
我错过了什么?
我在 Azure (AKS) 上使用 nginx-ingress-1.1.0 和 k8s 1.9.11。
因为您似乎在使用来自 ngnix.com 的实际入口,所以您需要使用 nginx.org/proxy-connect-timeout: "3m"
样式注释,正如您在
their example
我仍然很确定我的 kubectl cp
-ing nginx.conf
关闭控制器 Pod 的调试技巧可以帮助您自行调试这种情况,但请务必阅读文档你的入口控制器也会有很长的路要走
虽然这对您来说可能无关紧要,但他们的 latest release 也是 1.4.3,所以我希望您是故意使用旧版本。
问题已通过为这些注释提供的整数值(以秒为单位)解决:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "180"
nginx.ingress.kubernetes.io/proxy-read-timeout: "180"
nginx.ingress.kubernetes.io/proxy-send-timeout: "180"
NGINX ingress controller 的 this variation 似乎需要这样。
当请求超过 60 秒才能响应时,入口控制器似乎会反弹
据我所见,我们的 NGINX 入口控制器 returns 在请求处理超过 60 秒后向客户端发送 504。我可以从 NGINX 日志中看到这一点:
2019/01/25 09:54:15 [error] 2878#2878: *4031130 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 10.244.0.1, server: myapplication.com, request: "POST /api/text HTTP/1.1", upstream: "http://10.244.0.39:45606/api/text", host: "myapplication.com"
10.244.0.1 - [10.244.0.1] - - [25/Jan/2019:09:54:15 +0000] "POST /api/text HTTP/1.1" 504 167 "-" "PostmanRuntime/7.1.6" 2940 60.002 [default-myapplication-service-80] 10.244.0.39:45606 0 60.000 504 bdc1e0571e34bf1223e6ed4f7c60e19d
第二个日志项显示上游响应时间和请求时间均为 60 秒(参见NGINX log format here)
但是我在入口配置中指定所有超时值都是 3 分钟:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: aks-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/send_timeout: "3m"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "3m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3m"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3m"
spec:
tls:
- hosts:
- myapplication.com
secretName: tls-secret
rules:
- host: myapplication.com
http:
paths:
- path: /
backend:
serviceName: myapplication-service
servicePort: 80
我错过了什么?
我在 Azure (AKS) 上使用 nginx-ingress-1.1.0 和 k8s 1.9.11。
因为您似乎在使用来自 ngnix.com 的实际入口,所以您需要使用 nginx.org/proxy-connect-timeout: "3m"
样式注释,正如您在
their example
我仍然很确定我的 kubectl cp
-ing nginx.conf
关闭控制器 Pod 的调试技巧可以帮助您自行调试这种情况,但请务必阅读文档你的入口控制器也会有很长的路要走
虽然这对您来说可能无关紧要,但他们的 latest release 也是 1.4.3,所以我希望您是故意使用旧版本。
问题已通过为这些注释提供的整数值(以秒为单位)解决:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "180"
nginx.ingress.kubernetes.io/proxy-read-timeout: "180"
nginx.ingress.kubernetes.io/proxy-send-timeout: "180"
NGINX ingress controller 的 this variation 似乎需要这样。