今天开发反馈有个项目导入接口60s就超时了,按照之前其他项目的经验,在腾讯云LB设置proxy_read_timeout和proxy_send_timeout就正常了,因为这两个参数刚好默认是60s,项目其他地方也没有配置超时时间。
但是设置以后,开发测试还是60s超时。
怀疑是ingress方面返回的超时,因为之前大部分项目使用的都是Traefik Ingress和Nginx Ingress,Traefik Ingress默认是不限制超时,Nginx Ingress的默认的超时时间也比较长。
于是让开发提供了接口请求的Headers信息,如下图:
发现果然是Kong Ingress返回的超时,于是判断应该是kong ingress默认超时是60s。
于是先在Kong官网找了一通,没找到相关的配置,又百度谷歌一番搜索,解决方法到挺多。
有让在ingress里面添加nginx.ingress.kubernetes.io/proxy-read-timeout注解的.
有让在kong Deployment添加环境变量KONG_NGINX_PROXY_KEEPALIVE_TIMEOUT、KONG_NGINX_PROXY_PROXY_READ_TIMEOUT等。
可能因为版本原因,找到的方法测试都无效。
无赖又回到官网全局搜索了timeout关键词,找到了相关的注解(版本大于2.8):
konghq.com/connect-timeout
设置连接超时,以毫秒为单位。例如,将此注释设置为60000将指示代理最多等待 60 秒以完成与上游服务的初始 TCP 连接。
konghq.com/read-timeout
设置读取超时,以毫秒为单位。例如,将此注释设置为60000将指示代理在发送请求后最多等待 60 秒,然后超时并向客户端返回 504 响应。
konghq.com/write-timeout
设置写入超时,以毫秒为单位。例如,将此注释设置为60000将指示代理在关闭保持活动连接之前最多等待 60 秒而不写入数据。
konghq.com/retries
设置请求的最大重试次数。例如,将此注解设置为,3 如果遇到失败(例如超时),最多会重新发送请求 3 次。
于是马上在自己写的测试服务的ingress添加注释测试:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: atang-test-ingress namespace: default annotations: konghq.com/connect-timeout: '1000' konghq.com/write-timeout: '2000' konghq.com/read-timeout: '2000' konghq.com/retries: '0' spec: ingressClassName: kong rules: - host: test.amd5.cn http: paths: - path: / pathType: Prefix backend: service: name: atang-test-svc port: number: 80
奇迹没有出现,依然60s超时。
然后又是一番搜索,在Kong的crd文件里面找到timeout的一段描述:
The timeout in milliseconds between two successive read operations for transmitting a request to the upstream server. Deprecated: use Service''s "konghq.com/read-timeout" annotation instead.
翻译过来就是read_timeout这个参数已经启用,需要使用Service的konghq.com/read-timeout注释。
突然反应过来注释应该添加在service里面,不是ingress里面,然后马上添加测试:
apiVersion: v1 kind: Service metadata: name: atang-test-svc namespace: default annotations: konghq.com/connect-timeout: '1000' konghq.com/write-timeout: '2000' konghq.com/read-timeout: '2000' konghq.com/retries: '0' spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: atang-test sessionAffinity: None
奇迹终于出现了,2s就返回了超时。