今天開發反饋有個項目導入接口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 如果遇到失?。ɡ绯瑫r),最多會重新發送請求 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就返回了超時。