【问题标题】:NGINX Ingress times out with large file downloadsNGINX Ingress 因大文件下载而超时
【发布时间】:2021-09-11 17:38:59
【问题描述】:

我们正在一个 k8s pod 中运行一个 Spring Boot 应用程序,该 pod 托管在一个带有 EC2 负载均衡器的 NGINX 入口后面。我们的应用有时需要发送一个非常大的文件(10/20 GB)。我们观察到这个操作在通过 ingress 查询时偶尔会超时,但直接查询时不会超时。为了更容易地重现这一点,我们创建了一个简单的端点来请求任意大小的文件 (/files/SIZE)。这就是您在下面看到的。

当请求超时时,入口控制器似乎没有发布任何日志。从 HTTP 客户端,当请求超时时,我们得到的是:

{ [3744 bytes data]
100 16.4G    0 16.4G    0     0  22.7M      0 --:--:--  0:12:23 --:--:-- 23.9M* TLSv1.2 (IN), TLS alert, close notify (256):
{ [2 bytes data]
100 16.5G    0 16.5G    0     0  22.7M      0 --:--:--  0:12:23 --:--:-- 23.6M
* Connection #0 to host INGRESS_URL left intact
* Closing connection 0
curl INGRESS_URL/files/21474836480 -v    31.47s user 26.92s system 7% cpu 12:23.81 total

这是我们入口的配置:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: USER
  namespace: NAMESPACE
  selfLink: /apis/extensions/v1beta1/namespaces/NAMESPACE/ingresses/USER
  uid: d84f3ab2-7f2c-42c1-a44f-c6a7d432f03e
  resourceVersion: '658287365'
  generation: 1
  creationTimestamp: '2021-06-29T13:21:45Z'
  labels:
    app.kubernetes.io/instance: USER
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: APP
    helm.sh/chart: CHART
  annotations:
    kubernetes.io/ingress.class: nginx-l4-ext
    meta.helm.sh/release-name: USER
    meta.helm.sh/release-namespace: NAMESPACE
    nginx.ingress.kubernetes.io/client-max-body-size: '0'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
    nginx.ingress.kubernetes.io/proxy-buffering: 'off'
    nginx.ingress.kubernetes.io/proxy-max-temp-file-size: '0'
    nginx.ingress.kubernetes.io/proxy-read-timeout: '1800'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '1800'
    nginx.ingress.kubernetes.io/websocket-services: core-service
    nginx.org/websocket-services: core-service
  managedFields:
    - manager: Go-http-client
      operation: Update
      apiVersion: networking.k8s.io/v1beta1
      time: '2021-06-29T13:21:45Z'
      fieldsType: FieldsV1
      fieldsV1:
        'f:metadata':
          'f:annotations':
            .: {}
            'f:kubernetes.io/ingress.class': {}
            'f:meta.helm.sh/release-name': {}
            'f:meta.helm.sh/release-namespace': {}
            'f:nginx.ingress.kubernetes.io/client-max-body-size': {}
            'f:nginx.ingress.kubernetes.io/proxy-body-size': {}
            'f:nginx.ingress.kubernetes.io/proxy-buffering': {}
            'f:nginx.ingress.kubernetes.io/proxy-max-temp-file-size': {}
            'f:nginx.ingress.kubernetes.io/proxy-read-timeout': {}
            'f:nginx.ingress.kubernetes.io/proxy-send-timeout': {}
            'f:nginx.ingress.kubernetes.io/websocket-services': {}
            'f:nginx.org/websocket-services': {}
          'f:labels':
            .: {}
            'f:app.kubernetes.io/instance': {}
            'f:app.kubernetes.io/managed-by': {}
            'f:app.kubernetes.io/name': {}
            'f:helm.sh/chart': {}
        'f:spec':
          'f:rules': {}
    - manager: nginx-ingress-controller
      operation: Update
      apiVersion: networking.k8s.io/v1beta1
      time: '2021-06-29T13:21:59Z'
      fieldsType: FieldsV1
      fieldsV1:
        'f:status':
          'f:loadBalancer':
            'f:ingress': {}
spec:
  rules:
    - host: HOST_URL.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: SERVICE_NAME
              servicePort: 9081
status:
  loadBalancer:
    ingress:
      - hostname: LOAD_BALANCER_URL

我们正在运行ingress-nginx@v0.46.0

如果有人对为什么我们的大型下载超时有任何建议,那就太好了!

测试已经完成:

  1. 验证参数确实出现在生成的 nginx.conf 中
  2. 尝试更改 client-body-timeout - 这必须生效。
  3. 在我的本地 minikube 实例上重新创建了整个环境。该应用程序在那里工作。这可能是 Amazon ELB 问题吗?
  4. 更改 spring.mvc.async.request-timeout 并不能解决问题。
  5. 该问题仅在进行 HTTPS 调用时出现。 HTTP 调用运行良好

【问题讨论】:

  • 您是否已经尝试过调整client-body-timeout in the ConfigMap?您是否已经确认这些注释在生成的 nginx.conf 中正确应用?基本上,您已经采取了哪些故障排除步骤以及它们的结果是什么?不要把它放在 cmets 中,编辑你的帖子以显示它们
  • 感谢您的建议。我已经更新了帖子以反映您的要求以及另外一条信息。
  • 您是否尝试将 springboots 超时更改为更高的值?
  • 您好,感谢您的建议。刚试过这个,添加请求超时并没有改变任何东西。此外,在“测试完成”部分添加了更多信息。

标签: amazon-web-services nginx kubernetes nginx-ingress


【解决方案1】:

我的一个 SpringBoot 应用程序也有类似问题,问题在于 application.properties 文件中的 Springboot 配置。

spring:
  mvc:
    async:
      request-timeout: 3600000

参考:https://stackoverflow.com/a/43496244/2777988

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多