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