1.背景
之前碰到過ingress nginx遇到502錯誤,(113 No route to host) while connecting to upstream的問題,於是按照以上方式將ingress升級至1.30。
但是今天發現,發布容器后,老的報錯沒有碰上,這里出現一個相同的代碼,但是不一樣的報錯提示。
出現的場景是,因為業務需要測試更改時間,時間更改后在使用ntp同步回去,pod就無法訪問,出現connect() failed (113 Host is unreachable) while connecting to upstream報錯。
升級至1.30之后。無法訪問的情況還存在,只是nignx的報錯日志內容有點小改變,但是網頁的報錯還是相同。
2.原因
以下描述一下整個排錯的過程。
1.這里首先查看最后端pod的IP為以下:172.16.0.98
然后使用瀏覽器訪問網址,結果為502
2.查看ingress日志的,發現ingress-nginx upstreamhost的IP為172.16.0.90,此IP為更新之前的pod IP。
3.查看ingress-nginx的連接,發現也是向老的pod發起的請求。該pod都已經不存在了。
到這里,問題定位到了,還是之前的bug,在更改pod時間后,然后將時間還原,然后發布版本后,老的pod消失,新的pod出現,ingress還是會將請求轉發至老的pod,導致出現以上錯誤,網頁返回502.
4.解決方式(臨時)
上一篇案例中與騰訊雲聯調懷疑是ingress保存了已經不存在的pod連接,將請求轉發到已經刪除掉的pod上去,所以這次直接刪除ingress然后自動拉起一個問題臨時得到解決。
至於最終解決辦法,還是沒有改變。在刪除ingress控制器之后,ingress-nginx控制器的日志正常。
后記:想過嘗試重置pod的網卡或者清空TCP緩存,但是由於是pod,無法做到這些操作,至於最終解決方案,目前正在調研中。