【问题标题】:Kubernetes Ingress (Specific APP) 504 Gateway Time-Out with 60 secondsKubernetes Ingress(特定 APP)504 网关超时 60 秒
【发布时间】:2020-09-17 19:56:15
【问题描述】:

我们有一个带有 k8s + Rancher 2(3 个节点)的环境和一个外部 nginx,根据此文档仅将连接转发到 k8s 集群:https://rancher.com/docs/rancher/v2.x/en/installation/k8s-install/

在此环境中运行的特定应用程序中,当我们执行 POST 时(因为此 POST 大约需要 3 到 4 分钟才能完成),它会在 60 秒后被“504 Gateway Time-Out”消息中断。我已尝试应用特定注释来更改超时,如下所示,但无济于事:

应用入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-loteamento-spring-hml
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/server-snippet: "keepalive_timeout 3600s;client_body_timeout 3600s;client_header_timeout 3600s;"
  labels:
    run: api-loteamento-spring-hml
spec:
  rules:
  - host: hml-api-loteamento-sp.gruposfa.bla.bla
    http:
      paths:
      - backend:
          serviceName: api-loteamento-spring-hml
          servicePort: 80

我也尝试使用以下参数创建一个全局 ConfigMap,但也没有成功:

[rancher@srv-rcnode01 ssl]$ kubectl get pods -n ingress-nginx
NAME                                    READY   STATUS    RESTARTS   AGE
default-http-backend-67cf578fc4-lcz82   1/1     Running   1          38d
nginx-ingress-controller-7jcng          1/1     Running   11         225d
nginx-ingress-controller-8zxbf          1/1     Running   8          225d
nginx-ingress-controller-l527g          1/1     Running   8          225d
[rancher@srv-rcnode01 ssl]$ kubectl get pod nginx-ingress-controller-8zxbf -n ingress-nginx -o yaml |grep configmap
    - --configmap=$(POD_NAMESPACE)/nginx-configuration
    - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
    - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
[rancher@srv-rcnode01 ~]$ cat global-configmap.yaml
apiVersion: v1
data:
  client-body-timeout: "360"
  client-header-timeout: "360"
  proxy-connect-timeout: "360"
  proxy-read-timeout: "360"
  proxy-send-timeout: "360"
kind: ConfigMap
metadata:
  name: nginx-configuration

并申请:

kubectl apply -f global-configmap.yaml

访问 ingress pod 并检查 nginx.conf,我看到注释是根据应用程序块内设置的参数创建的:

[rancher@srv-rcnode01 ~]$ kubectl -n ingress-nginx exec --stdin --tty nginx-ingress-controller-8zxbf -- /bin/bash

并查看 nginx.conf

keepalive_timeout 3600s;client_body_timeout 3600s;client_header_timeout 3600s;

# Custom headers to proxied server
            
            
            proxy_connect_timeout                   3600s;
            proxy_send_timeout                      3600s;
            proxy_read_timeout                      3600s;

我在“服务器”配置块中的 nginx.conf 文件开头注意到的是它具有默认的 60 秒超时值:

# Custom headers to proxied server
            
            proxy_connect_timeout                   5s;
            proxy_send_timeout                      60s;
            proxy_read_timeout                      60s;

在这种情况下我的问题是这些值是否会干扰这个问题,以及如何在 k8s 中更改这些值?

有没有人经历过这种情况或什么,可以给我一个北方?

谢谢!!

【问题讨论】:

  • 它是您的本地环境还是云?你是如何部署 Ingress 的?您是否强制入口使用新配置?您是否尝试根据docs 的最低要求在您的入口spec.rules.http.paths.path 添加特定路径
  • 嗨。环境是本地的。是的,我在 ingress 上应用了更改,但没有成功。

标签: kubernetes timeout


【解决方案1】:

Nginx DocumentationCustom Configuration 中提到了您想要实现的目标。推荐使用ConfigMap

$ cat configmap.yaml
apiVersion: v1
data:
  proxy-connect-timeout: "10"
  proxy-read-timeout: "120"
  proxy-send-timeout: "120"
kind: ConfigMap
metadata:
  name: ingress-nginx-controller

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/docs/examples/customization/custom-configuration/configmap.yaml \
    | kubectl apply -f -

如果更新了 Configmap,NGINX 将重新加载新的配置。

之后,在Ingress controller pod 中,您应该会看到如下条目:

8 controller.go:137] Configuration changes detected, backend reload required.
8 controller.go:153] Backend successfully reloaded.

但是,请记住,不建议为Nginx 设置更高的超时值。这个信息可以在Nginx Ingress - proxy-connect-timeout找到:

设置与代理服务器建立连接的超时时间。 需要注意的是,这个超时时间通常不能超过 75 秒。

其他信息:

1. 有时Nginx Ingress 无法加载新配置时,您可以看到如下日志:

controller.go:149"] - Unexpected failure reloading the backend": Invalid PID number "" in "/tmp/nginx/pid"

要修复它,你只需要重启Ingress pod

2.如果你不喜欢默认设置,你可以在Go language中创建一个config template

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2016-08-16
    • 2013-05-20
    • 1970-01-01
    • 2014-09-11
    • 2011-08-30
    • 2017-04-30
    相关资源
    最近更新 更多