故障發生在2023春節前兩天,DeepFlow 團隊內部訪問工單系統出現問題,影響了所有北京區的同事,這篇文章將詳細記錄如何利用 DeepFlow 定位到對這次問題根因(網關 MSS 誤變更導致報文大于 MTU,大數據報文被丟棄)。
01|背景介紹
工單系統是 DeepFlow 團隊自主研發的一個跟蹤工單的內部工具,部署在阿里公有云的容器服務(ACK)中,工單系統通過 Ingress 的方式對外提供服務,辦公區與阿里云通過 VPN 連接,因此辦公區可以直接使用域名訪問工單系統。在《K8s 服務異常排障過程全解密》[1]文中對 K8s 訪問方式做過總結,工單系統是比較典型的??方式三?
?的訪問形式
集群外客戶端通過 Ingress 訪問集群內服務
下圖是通過 DeepFlow 自動繪制的訪問拓撲圖,可以看出北京和廣州辦公區都是通過 Ingress 的形式來訪問工單的入口服務 (ticket_web)。工單系統部署在基礎服務的容器集群上,此容器集群所有的 Node 上都已經部署了 deepflow-agent,因此可以自動采集所有 POD 及 Node 的網絡/系統/應用相關的數據,其中就包括阿里云 Nginx-ingress-controller 服務對應的 POD 以及應用的 POD
工單系統訪問拓撲
02|排障過程
下午 3:00 左右,陸續收到同事反饋,工單系統加載不出來,首先和工單系統研發明確,并未做過任何變更
故障現場
依據《K8s 服務異常排障過程全解密》[2]總結的思路
K8s 服務異常排障思路
查看了對應的 ??Node/POD?
? 負載、狀態等都正常;登錄到 DeepFlow 平臺,調出了工單系統的訪問拓撲(拓撲上標紅部分表明有異常),從訪問拓撲可知??后端服務?
?黃金指標也都一切正常;又通過圖可看出來廣州辦公室對工單系統的訪問也并沒有異常(也同步與廣州同事確認,訪問一切正常),可推測 ??DNS/SVC?
? 也應該都正常;進一步結合拓撲圖,可看出異常僅出現在北京辦公室與 nginx-ingress-controller 之間。
訪問拓撲
繼續分析標紅的路徑,查看對應的流日志,因為云下未部署采集器,因此僅支持查看的是 nginx-ingress-controller POD 以及 Node 的數據,發現了幾個問題:
- 服務端異常都是因為
傳輸-連接超時
導致的 - 服務端異常時,服務端 (nginx-ingress-controller) 回復的數據包,都是大包
- 服務端異常時,服務端 (nginx-ingress-controller) 都未收到任何客戶端發送的數據
流日志
結合以上幾點發現,懷疑方向轉移到 MSS/MTU 上,立馬咨詢了 IT 同事,是不是變動過網關的 MSS/MTU 值,IT 同事否認了
聊天記錄-01
既然云下部分未變動過,轉而懷疑是不是 nginx-ingress-controller 動過 MSS/MTU,通過??時序圖?
?查看 MSS 是否有變化,通過故障前后對比可知:
- 客戶端在故障前后發送的 MSS 確實發生過變動,從 1280 變為了 1380
- 服務端 (nginx-ingress-controller) MSS 值一直未變動過
時序圖
通過數據可明確,云下一定變動過 MSS 值,拿著數據截圖又去找 IT 同事,最后 IT 同事一頓找,明確改了 MSS 值,將 MSS 值恢復后,工單系統恢復正常
聊天記錄-02
03|問題總結
問:MSS 值變動了,為什么影響了工單系統
- 因為云下的 MTU 值設置的是 1420,如果 MSS 值為 1380 + 報文頭則會大于 MTU 值,因此大數據報文無法通過云下的網關,這就導致了 nginx-ingress-controller 收不到任何客戶端的回應(客戶端也未收到服務端的包)出現?
?傳輸-連接超時?
?的情況
問:MSS 值變動了,為什么其他內部系統未受到影響
- 工單描述中包含了大量的圖片和文件,因此存在傳輸大數據的情況,而其他系統大部分都是文字傳輸,所以未受到明顯影響
- 其他如 gitlab 存在圖片和大文字傳輸的服務,并未使用 Ingress 的方式對外提供訪問形式,而是利用阿里云 Terway 提供的內網直接訪問 Headless 服務后端 POD 的方式,在協商 MSS 值時,后端 POD 的值為 1360(nginx-ingress-controller 的值為 1460),因此最終協商的取 1360 + 報文頭則小于 MTU 值,所以也未受到明顯影響
04|什么是 DeepFlow
DeepFlow[3] 是一款開源的高度自動化的可觀測性平臺,是為云原生應用開發者建設可觀測性能力而量身打造的全棧、全鏈路、高性能數據引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技術,創新的實現了 AutoTracing、AutoMetrics、AutoTagging、SmartEncoding 等核心機制,幫助開發者提升埋點插碼的自動化水平,降低可觀測性平臺的運維復雜度。利用 DeepFlow 的可編程能力和開放接口,開發者可以快速將其融入到自己的可觀測性技術棧中。
GitHub 地址:https://github.com/deepflowys/deepflow
訪問 DeepFlow Demo[4],體驗高度自動化的可觀測性新時代。
參考資料
[1] 《K8s 服務異常排障過程全解密》: ??https://deepflow.yunshan.net/blog/020-k8s-service-exception-troubleshooting/??
[2] 《K8s 服務異常排障過程全解密》: ??https://deepflow.yunshan.net/blog/020-k8s-service-exception-troubleshooting/??
[3] DeepFlow: ??https://github.com/deepflowys/deepflow??
[4] DeepFlow Demo: ??https://deepflow.yunshan.net/docs/zh/install/overview/?