• Kubernetes
  • ingress 设置超时不生效 504 Gateway Timeout?

现象如下:

Request URL: http://xxxx.10.1.1.122.nip.io:31729/test/save
Request Method: POST
Status Code: 504 Gateway Timeout
Remote Address: 10.1.1.122:31729
Referrer Policy: strict-origin-when-cross-origin
content-length: 24
content-type: text/plain
date: Mon, 22 Feb 2021 08:59:30 GMT
server: istio-envoy
x-envoy-decorator-operation: kubesphere-router-test.kubesphere-controls-system.svc.cluster.local:80/*
x-envoy-upstream-service-time: 15003

一开始以为是ingress超设置有问题,ingress添加如下超时注解后问题依旧:

    nginx.ingress.kubernetes.io/proxy-connect-timeout: '300'
    nginx.ingress.kubernetes.io/proxy-read-timeout: '300'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '300'

google了一下,发现有个类似的问题istio-envoy-504-gateway-timeouts-after-15-seconds-for-outbound-connections,但不知道怎么设置,基本排除是应用层的超时

未开启应用治理如下图:

感觉应该是k8s这一层的超时,各位大佬有木有遇到类似的问题

看下日志的报错:

kubectl -n kubesphere-controls-system logs -f kubesphere-router-ns4-7d57b7bf6b-m2nr5 -c nginx-ingress-controller

    zackzhang
    大神看了一下日志如下,就是报的504超时,都是15秒钟左右,这个超时时间是不是在这个router设置

    127.0.0.1 - [127.0.0.1] - - [22/Feb/2021:08:17:14 +0000] "POST /form/automForm/save?checkMust=true HTTP/1.1" 504 24 "http://test.10.1.1.122.nip.io:31729/train/certificat/automForm/form_bb71493498ff1a64" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36" 230949 15.042 [hse-test-yth-hse-frontend-80] 10.233.8.73:80 24 15.008 504 87bb5975-1521-4bd9-b3f6-89e26a75d2fd

    是不是下面这个connectTimeout

        - jaeger-collector.istio-system.svc:9411
        - --dnsRefreshRate
        - 300s
        - --connectTimeout
        - 10s
        - --proxyAdminPort
        - "15000"
        - --concurrency

      zackzhang 大佬,这个参数是在哪设置?先临时解决问题,我后续再研究一下

      怎么复现,我本地连接一个注入sidecar应用,时间可以不受限制;跟负载大小有关系吗

        zackzhang 复现的话直接在接口中 sleep 30s,然后通过ingress暴露接口请求。我猜测现在的应该是应用还没返回,可能是k8s这边某个组件15s超时直接返回了。

          zealzhangz 我这测试一直正常,你把可以复现的详细步骤描述下(尽量详细点)。

          1. 什么应用,怎么部署
          2. 如何访问,怎么验证

            zackzhang 大佬,我新建了一个工程,在原先的项目内部署该工程,问题依旧存在。后面我新建了一个项目部署上去发现没有这个问题,然后再回去测试发现原先有问题的项目也好了。发现相关的 ReplicaSet router 更新了,目测这个还是跟istio sidecar 有关,可能之前关闭应用治理的时候这个ReplicaSet router 没更新,我本次新建触发了更新然后就好了。不过原先那个ReplicaSet 后面参数都变成0了,是个啥子意思?

              zackzhang 目前能稳定复现,开启应用治理,请求超过15s就会超时,关闭之后就正常。

              但刚开始我也关闭了应用治理,但是还是超时,这个我就解释不了了。

              你这timeout有20000的,不也有些正常的吗?

              复现的要求应该是:所有请求达到15s,应该马上被拒绝。

              另外,你如果怀疑是网关造成的,可以绕开网关,直接请求服务(service NodePort);

                zackzhang 正常的是我关闭应用治理的测试,超时的是我开启应用治理的测试,绕开网关不会超时。这些我都测试过了。这里有我测试完整的源码和k8s脚本,大佬可以自己测试一下

                # 部署好之后请求这个地址
                http://timeout-test.10.1.1.122.nip.io:31729/test/?timeout=20000

                卧槽,附件不支持gz压缩包

                大佬移步百度网盘:

                链接: https://pan.baidu.com/s/19-KICUiDoC2GmoFCHIgc6A 提取码: mewe 

                总结一下就是关闭应用治理,删除如下注解,就不会超时,超时原因还是因为 istio sidecar

                 nginx.ingress.kubernetes.io/service-upstream: 'true'