本篇文章要來探討 Kubernetes/Docker 一些關於 connection timeout 的事情,文章非常長,這邊幫大家重點整理
1. 跟我之前分享的 DNS timeout 問題類似,都會踩到 Kernel 的 race condition,都是 __ip_conntrack_confirm 這個人丟掉大家封包的
2. 本文著重於怎麼發現這個問題,如何減緩這個問題。對於喜歡研究細節的人值得一看。
3. 2017年底作者團隊開始將服務遷移到 Kubernetes (v1.8), Flannel(1.9.0),開始發現團隊中基於 Scala 的應用程式出現封包 timeout 的問題,這導致部分請求回應都延遲1-3秒
4. 決定認真調查網路問題,經由研究與錄製封包後發現 TCP 重送(SYN)的現象,該現象導致第一個封包會特別慢
5. 接下來要縮小範圍,使用環境中的一個VM作為基底,上面安裝 docker,開始觀察相關的網路流量與封包,發現可以重製這個行為,第一個封包從容器出去後,宿主機上面的真實網卡卻看不到,直到下次第二個封包就可以。藉由這個行為他們判斷,問題出在VM上,跟底層其餘硬體架構無關,藉此縮小問題範圍。
6. 介紹 iptalbes + SNAT + conntrack
7. 問題發生在 Kernel 裡面針對 SNAT 去選擇對外 source IP 時會出錯,因為(1)挑選一個適當的 source port, (2)將該紀錄寫到 conntrack 這兩個步驟中間會有落差,因此如果兩個封包同時進入(1),選到一樣的結果,後續要跑(2)就會有一個人寫不進去,導致封包被丟棄
8. 一種解決方法是告訴 kernel 請隨機幫我挑選對外的 source port, 這樣就算大家同時執行(1),有很大的機會會挑到不同的 source port,藉此減少衝突的機會。
9. iptables 執行 --masquerate 的時候可以下 --random-fully 這個參數
10. 團隊當時客製化 Flannel 來解決這個問題
註: 對 SNAT 有興趣瞭解的可以參考我之前撰寫的 SNAT Kernel 原始碼閱讀文章
https://www.hwchiu.com/iptables-masquerade.html
https://www.hwchiu.com/iptables-masquerade-handson.html
https://tech.xing.com/a-reason-for-unexplained-connection-timeouts-on-kubernetes-docker-abd041cf7e02
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
iptables masquerade 在 コバにゃんチャンネル Youtube 的最讚貼文
iptables masquerade 在 大象中醫 Youtube 的最佳貼文
iptables masquerade 在 大象中醫 Youtube 的精選貼文
iptables masquerade 在 7.4. FORWARD 與NAT 規則 的相關結果
有時候這種轉送服務非常危險,例如有些破解工具能假冒為內部IP 位址,讓遠端攻擊者的電腦看起來就像區網上的電腦一樣。要防止這種攻擊,iptables 提供了路由與轉送政策,以 ... ... <看更多>
iptables masquerade 在 IPtables中SNAT和MASQUERADE的區別 - 幻滅名為不動 的相關結果
IPtables 中可以靈活的做各種網絡地址轉換(NAT) 網絡地址轉換主要有兩種:SNAT和DNAT SNAT是source network address translation的縮寫 ... <看更多>
iptables masquerade 在 Linux NAT Masquerade 研究(上) | Hwchiu Learning Note 的相關結果
本篇文章透過閱讀原始碼的方式來學習MASQUERADE 的運作模式,而MASQUERADE 則是被廣為使用的SOURCE NAT 模組。作為一個IPTABLES 的擴充模組, ... ... <看更多>