最近跟大家分享一個 2020 年初左右的問題,這個問題的徵狀使用者透過 service 去存取相關服務時,會一直遲遲連接不上,直到 63 秒後服務才會通。
這個問題有兩種類型,一個是 63 秒後服務會通,一個則是 1 秒後會通,兩個背後的原因都一樣,這邊就來稍微簡介一下這個問題
# 發生條件
1. 使用 VXLAN 作為底層 Overlay Network,最常見的就是 Flannel 這套 CNI
2. Kubernetes 的版本不能太舊,至少要 1.16 以後,不過目前這個問題已經修復,所以現在要撞到除非特別指定版本
3. 使用的 Linux Kernel 版本也不能太新,目前該問題已經修復於大部分的 upstream
# 發生原因
1. VXLAN 本身是一個基於 UDP 的封裝協議,有一個已知的 bug 會使得其 checksum 發生錯誤,導致封包不會被遠端接收方給接收
2. kube-proxy 內關於 iptables 的設定沒有妥善,導致 VXLAN 封包會進行二次 SNAT
3. 第二次的 SNAT 就會觸發(1) 的 bug(當然還有其他條件,但是那些條件也剛好符合)
,最後導致封包的 checksum 不同,因此送到遠方就被拒絕
4. 底層的 TCP 建立連線時,會不停地嘗試,每次失敗都會等待更多時間,分別是1,2,4,8,16,32秒
5. 五次都失敗後, TCP 就會觸發重傳機制,下一次的重傳就不會進入到第二次的 SNAT,因此封包就不會踩到問題,因此通過
# 解決方法
1. 基本上這個問題要踩到要各方一起努力才會踩到,也因此修復方式也是多元化
2. Kernel 本身修復了關於 UDP 封裝的 Checksum 計算
3. Kubernetes 這邊則是針對 kube-proxy 進行強化,其使用的 iptables 規則會避免二次 SNAT 的情況
# 其他問題
1. 為什麼 TCP 重送後就不會踩到二次 SNAT? 這部分我看了相關的 issue 以及諸多文章都沒有看到解釋,都在探討 SNAT 後產生的 checksum,至於為什麼 TCP 重送後就通則是一個謎底
2. 為了解決這個謎體,我特別指定 kubernetes 版本並且重新編譯 Ubuntu 的 Linux Kernel 版本,盼望從 Kernel 中來觀察並且理解這個問題,目前已經有一些初步的進度。之後完成後會在撰寫文章跟大家分享這個問題
這個問題我認為非常有趣,也許自己的環境剛好沒有踩到,但是可以透過觀察不同的 issue 來研究各式各樣問題,也藉由這些過程來學習
相關 PR: https://github.com/kubernetes/kubernetes/pull/92035
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「linux kernel編譯」的推薦目錄:
- 關於linux kernel編譯 在 矽谷牛的耕田筆記 Facebook 的最佳解答
- 關於linux kernel編譯 在 PCDIY online Facebook 的最讚貼文
- 關於linux kernel編譯 在 紀老師程式教學網 Facebook 的最佳貼文
- 關於linux kernel編譯 在 コバにゃんチャンネル Youtube 的最佳解答
- 關於linux kernel編譯 在 大象中醫 Youtube 的最讚貼文
- 關於linux kernel編譯 在 大象中醫 Youtube 的最讚貼文
- 關於linux kernel編譯 在 如何編譯自訂小米手機Android kernel - YouTube 的評價
- 關於linux kernel編譯 在 Linux 内核编译指南 - GitHub Gist 的評價
- 關於linux kernel編譯 在 在Ubuntu 上編譯Linux 核心| 他山教程,只選擇最優質的自學材料 的評價
linux kernel編譯 在 PCDIY online Facebook 的最讚貼文
Linux之父也真香了... (當時的比中指事件很紅~ XD)
【PCDIY!科技情報:從Intel Inside切成AMD Inside,Linux之父Linus Torvalds轉至AMD Ryzen Threadripper平台,因為編譯快3倍!】
http://www.pcdiy.com.tw/detail/16271
#AMD #Ryzen #Threadripper #3970X
#Linux #Kernel #Linus #Torvalds
★沒新聞心癢?加入PCDIY!官方Telegram頻道:https://t.me/PCDIY
☆「找嘸人」聊科技?加入PCDIY! Telegram討論群:https://t.me/PCDIY_Chat
linux kernel編譯 在 紀老師程式教學網 Facebook 的最佳貼文
想在 30 分鐘內學會 Git 嗎?看這裡就對了!
Git 是一種「原始碼版本控制」軟體,它可以儲存原始碼每個版本之間的差異,然後您可以要求「時光回溯」到任何指定的版本。這可以防止一天到晚改規格的客戶或老闆,在您辛苦更動原始碼後,來一句要命的:「還是之前的那一版比較好」。我個人認為,它是程式設計中,最重要的 7 大軟體之一(文字編輯器、編譯器、版本控制器、自動化建構系統、單元測試軟體、環境佈建系統、與除錯器)。
這類「版本控制軟體」,依照流行先後,著名的有 CVS、Subversion、與 Git。目前最流行的版本控制軟體是「Git」,流行原因多多少少是因為 Linux 核心(Linux Kernel)原始碼,就是用這套軟體保持各個版本差異的。不少公司也要求程式設計師寫好原始碼後,一律都得回存 Git 系統才算完工,不能只是存在私人的硬碟就了事。所以 Git 就變成業界必備的軟體之一。
補習班常常有同學問我,有沒有那種很簡單的 Git 說明書,不用講太深,但要在 30 ~ 60 分鐘內就掌握常用功能的教材?之前一直找不到,不過今天幫大家找到了!還有中文版喔!叫做「Git 簡明指南」。鏈結如下:
https://rogerdudler.github.io/git-guide/index.zh.html
其實它的原文名稱有點好玩:「Git - The Simple Guide, No Deep Shit!」。這類標題通常能騷動我個性中愛作怪的小惡魔,讓我會心一笑後點進去看看。看完後,果然「一點點深的便便」都沒有... XD 還有中文版(簡中)!心想這麼讚的東西不介紹怎麼行!就花時間寫了這一篇。
希望今天的分享對各位的日常工作有幫助!我也很鼓勵大家能找到適合自己的「七大系統」,把它弄熟。畢竟「工欲善其事,必先利其器」嘛!我個人習慣使用的七大系統,也列在底下讓大家參考:
1. 文字編輯器:vim。不好學,但游標移動速度與文字操控能力超快!
2. 編譯器:gcc。因為我寫 C 語言比較多,所以用 gcc。
3. 版本控制器:git。其實我之前是熟 subversion。不過 git 也很好用喔!
4. 自動化建構系統:make。可以把編譯、安裝...等囉哩八唆的指令濃縮成一個簡稱(如:build, install...等)。打完按下 enter 後就可以去泡咖啡了!還能偵測哪些原始碼已經編譯過,不需重新編譯已縮短作業時間。
5. 單元測試軟體:CUnit。嚴格來說,這算一套「函式庫」,可以針對你寫好的原始碼做測試。由於我寫 C 較多,所以用 CUnit。如果您寫的程式碼是 Java 或其它,可能得找相對應的測試軟體。
6. 環境佈建軟體:VirtualBox。用它的原因是 Win, Mac, Linux 全平台都支援。我會把程式設計環境灌好後的 VirtualBox 映像檔保存好,每次要乾淨環境就 new 一個新的虛擬機起來。最近迷上 Vagrant,想知道 Vagrant 是什麼的可以看這篇: http://goo.gl/29mBs9
7. 除錯器:gdb。雖然是文字介面,但連線到運算能力很差的開發板上想除錯,也只有 gdb 跑得動。用久了也習慣了。
其實最近還想加上第八項「(8) 軟體部署系統:Docker」,不過還在研究,也還沒熟悉。等熟悉了再跟大家報告。 :-)
如果覺得文章不錯,還煩請各位不吝按讚打賞或分享一下喔! m(^ ^)m
linux kernel編譯 在 コバにゃんチャンネル Youtube 的最佳解答
linux kernel編譯 在 大象中醫 Youtube 的最讚貼文
linux kernel編譯 在 大象中醫 Youtube 的最讚貼文
linux kernel編譯 在 Linux 内核编译指南 - GitHub Gist 的推薦與評價
下载Linux内核源代码(Gentoo) emerge -av vanilla-sources # 切换到所需内核源代码eselect kernel list eselect kernel set 2 cd /usr/src/linux # 删除之前的核心功能 ... ... <看更多>
linux kernel編譯 在 在Ubuntu 上編譯Linux 核心| 他山教程,只選擇最優質的自學材料 的推薦與評價
在Ubuntu 中編譯> = 13.04. 選項A)使用Git. 如果你想與最新的Ubuntu 核心原始碼保持同步,請使用git。詳細說明可以在Kernel Git Guide 中找到。git ... ... <看更多>
linux kernel編譯 在 如何編譯自訂小米手機Android kernel - YouTube 的推薦與評價
自行修改Android內核,開啟特定的功能,再重新 編譯 ,將其刷入手機。 ... <看更多>