1.背景
首先談一下背景環境,出現文章标題的出錯是公司的tke(騰訊雲k8s,當然問題和騰訊雲k8s叢集沒有關系),首先分為dev叢集環境和生産叢集環境,出現問題是在很早期建立的dev環境。
問題報錯以下:
注意:同時,後端upstream-host IP并不是svc的IP或者pod的IP。是一個不存在的IP。這是第二個問題。
可以看到請求已經到了ingress,但是就是無法通路後端服務。
檢查了k8s的yaml配置,以及在測試pod中通路目标服務pod也可以通路,删除重新建立也是no route to host。
2.問題解決
一籌莫展之際,想到有2套環境,于是再次釋出至另一套環境,果然,另一套prod環境是正常的。于是想到兩個環境隻有ingress的版本不同。于是去查詢。 Dev的環境為0.23,而prod環境是0.30。
同時拉上騰訊的支援人員去分析,後面認為是0.23版本的bug,可能是長連接配接等問題,導緻,即使pod不在了,連接配接依舊保持,并将請求轉發至老的POD ip上(即使POD已經不存在),由于ingress鏡像沒有看tcp連接配接的指令,于是果斷删除了ingress,然後自動拉起,問題果然解決,并且,ingress日志中的upstream-host ip也正常了。
該問題運作2個月後出現,出現機率較小,但是為了避免出現問題,還是推薦使用0.30以上版本的ingerss。
3.參考
https://github.com/kubernetes/ingress-nginx/issues/5715
作者:小家電維修
轉世燕還故榻,為你銜來二月的花。