用這個(gè)開(kāi)源項(xiàng)目,網(wǎng)絡(luò)小白也能搞定容器網(wǎng)絡(luò)問(wèn)題排查 全球快報(bào)

2023-06-28 19:34:39       來(lái)源:技術(shù)聯(lián)盟

溪恒、謝石、遐宇 阿里云云原生 2023-06-27 18:30 發(fā)表于浙江


(資料圖片僅供參考)

Kubernetes 本身比較復(fù)雜,使用門(mén)檻較高,用戶(hù)在開(kāi)始容器化遷移時(shí)經(jīng)常遇到各種各樣的問(wèn)題,由于缺乏故障定位的技能和工具,用戶(hù)常常產(chǎn)生挫敗感,甚至放棄業(yè)務(wù)容器化。其中網(wǎng)絡(luò)問(wèn)題表現(xiàn)尤為突出,Kubernetes 網(wǎng)絡(luò)虛擬化導(dǎo)致網(wǎng)絡(luò)問(wèn)題排查的難度巨大。

KubeSkoop 是阿里云容器服務(wù)團(tuán)隊(duì)開(kāi)源的 Kubernetes 容器網(wǎng)絡(luò)診斷工具,支持主流的網(wǎng)絡(luò)插件和云廠商的 Kubernetes 集群診斷。它正是為了降低網(wǎng)絡(luò)問(wèn)題排查難度,讓沒(méi)有網(wǎng)絡(luò)知識(shí)的人也可以自動(dòng)化地定位網(wǎng)絡(luò)問(wèn)題。

Kubernetes 容器網(wǎng)絡(luò)診斷工具:

/alibaba/kubeskoop

KubeSkoop 能夠自動(dòng)構(gòu)建出給定源和目的地址在容器網(wǎng)絡(luò)中的訪問(wèn)路徑,自動(dòng)化地采集和分析鏈路上每一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)的配置,結(jié)合 eBPF 內(nèi)核監(jiān)控以及 IaaS 層的網(wǎng)絡(luò)配置檢查,定位出導(dǎo)致網(wǎng)絡(luò)不通的根因,極大地降低了網(wǎng)絡(luò)問(wèn)題定位的時(shí)間,即使沒(méi)有任何網(wǎng)絡(luò)技能的用戶(hù)也可以使用。目前在阿里云容器服務(wù)的環(huán)境中,作為自運(yùn)維工具解決了大量客戶(hù)在大規(guī)模 Kubernetes 集群場(chǎng)景下遇到的網(wǎng)絡(luò)問(wèn)題。

本文將會(huì)對(duì)容器網(wǎng)絡(luò)和傳統(tǒng)定位手段帶來(lái)的問(wèn)題進(jìn)行簡(jiǎn)單的介紹,以及對(duì) KubeSkoop 的功能設(shè)計(jì)等方面進(jìn)行總體解說(shuō)。

容器網(wǎng)絡(luò)

Cloud Native

網(wǎng)絡(luò)連通性-CNI

容器網(wǎng)絡(luò)是 Kubernetes 集群中及其重要的一部分,包括了構(gòu)成集群網(wǎng)絡(luò)連通性的 CNI 插件、Service 服務(wù)發(fā)現(xiàn)機(jī)制、NetworkPolicy 網(wǎng)絡(luò)策略等。Kubernetes 集群網(wǎng)絡(luò)保證了每個(gè) Pod 擁有自己獨(dú)立的網(wǎng)絡(luò)空間,并且能夠與集群中的 Pod 和 Node 互相通信。

CNI 插件是構(gòu)成集群容器網(wǎng)絡(luò)中的核心,實(shí)現(xiàn)集群級(jí)別唯一的地址分配,將集群維度的網(wǎng)絡(luò)打通。

不同的 CNI 插件,如 Flannel、Calico、Cilium、Terway 等,有其不同的網(wǎng)絡(luò)實(shí)現(xiàn),包括地址分配,網(wǎng)絡(luò)虛擬化實(shí)現(xiàn),網(wǎng)絡(luò)連通性實(shí)現(xiàn)等。

服務(wù)發(fā)現(xiàn)和網(wǎng)絡(luò)策略

除 CNI 插件外,Kubernetes 還提供了 Service 作為服務(wù)發(fā)現(xiàn),以及 NetworkPolicy 作為網(wǎng)絡(luò)策略能力。這些能力也是通過(guò)可替換的組件來(lái)實(shí)現(xiàn)的。

復(fù)雜性和網(wǎng)絡(luò)問(wèn)題定位

由于概念繁多,以及插件實(shí)現(xiàn)選擇的豐富性,導(dǎo)致 Kubernetes 網(wǎng)絡(luò)問(wèn)題存在著相當(dāng)?shù)膹?fù)雜性,包括:

邏輯概念的復(fù)雜性 Ingress/Service/NetworkPolicy 配置靈活,可能導(dǎo)致配置錯(cuò)誤/規(guī)則沖突等問(wèn)題。 使用 ServiceMesh 或第三方 CNI 插件,帶來(lái)更復(fù)雜的網(wǎng)絡(luò)策略和擴(kuò)展能力。 數(shù)據(jù)面實(shí)現(xiàn)的復(fù)雜性 數(shù)據(jù)平面經(jīng)過(guò)不同組件的多層處理,且存在多種實(shí)現(xiàn)。 協(xié)議棧鏈路復(fù)雜,涉及到網(wǎng)卡驅(qū)動(dòng) /netfilter/route/bridge 等配置。 不同云廠商的底層配置不同,安全組、路由表等配置復(fù)雜。

傳統(tǒng)的容器網(wǎng)絡(luò)問(wèn)題定位手段,主要是通過(guò)抓包定位丟包點(diǎn)、壓測(cè)復(fù)現(xiàn)、人工查配置等方式。存在著定位流程長(zhǎng)、大量時(shí)間開(kāi)銷(xiāo)、人員經(jīng)驗(yàn)要求高等問(wèn)題。

在日常的工作中,排查容器網(wǎng)絡(luò)問(wèn)題占用了相當(dāng)大部分的精力。因此,我們開(kāi)發(fā)了 KubeSkoop 項(xiàng)目,來(lái)實(shí)現(xiàn)針對(duì)容器網(wǎng)絡(luò)場(chǎng)景下問(wèn)題的自動(dòng)診斷系統(tǒng)。

KubeSkoop 功能

Cloud Native

在我們的分析中,常見(jiàn)的 Kubernetes 網(wǎng)絡(luò)問(wèn)題可以分為以下兩類(lèi):

網(wǎng)絡(luò)持續(xù)不通問(wèn)題 持續(xù)的無(wú)法訪問(wèn):ping 不同、connect 超時(shí)、DNS 無(wú)法解析等。 網(wǎng)絡(luò)抖動(dòng)問(wèn)題 偶發(fā)的網(wǎng)絡(luò)問(wèn)題:偶爾的業(yè)務(wù)超時(shí)、504、偶發(fā) reset 等。 網(wǎng)絡(luò)性能問(wèn)題:網(wǎng)絡(luò)性能低、QPS 壓不上去等。

在這些問(wèn)題中,80% 都是可以依賴(lài)經(jīng)驗(yàn)解決的已知問(wèn)題。而問(wèn)題的處理時(shí)間主要浪費(fèi)在 問(wèn)題上報(bào)、信息收集和驗(yàn)證上。

KubeSkoop 即是針對(duì)這兩類(lèi)場(chǎng)景,通過(guò)信息收集(包括 CNI 插件、ServiceMesh、Kernel/eBPF、基礎(chǔ)設(shè)施等)、推導(dǎo)和展示(容器服務(wù)智能運(yùn)維、Prometheus、Grafana/Loki 等),實(shí)現(xiàn)全鏈路一鍵診斷、網(wǎng)絡(luò)棧延遲分析、網(wǎng)絡(luò)異常事件識(shí)別回溯,快速定位問(wèn)題根因。

項(xiàng)目可分為兩部分:診斷網(wǎng)絡(luò)持續(xù)不通問(wèn)題的 KubeSkoop 連通性診斷, 和分析網(wǎng)絡(luò)抖動(dòng)問(wèn)題的 KubeSkoop 深度網(wǎng)絡(luò)監(jiān)控。

連通性診斷

通過(guò) KubeSkoop,能夠?qū)W(wǎng)絡(luò)持續(xù)不通問(wèn)題進(jìn)行一鍵診斷。

用戶(hù)通過(guò)指定網(wǎng)絡(luò)不通的來(lái)源 IP 和目的 IP 發(fā)起一次診斷。在診斷中,KubeSkoop 將會(huì)自動(dòng)構(gòu)建網(wǎng)絡(luò)訪問(wèn)鏈路,收集網(wǎng)絡(luò)棧信息,分析鏈路問(wèn)題。

同時(shí),診斷包含了 Service、NetworkPolicy 等 Kubernetes 概念的分析,全面覆蓋協(xié)議棧、底層 IaaS 的連通性相關(guān)檢查,讓用戶(hù)無(wú)需了解網(wǎng)絡(luò)插件的實(shí)現(xiàn),也無(wú)需擁有復(fù)雜網(wǎng)絡(luò)問(wèn)題排查經(jīng)驗(yàn),就能夠一鍵定位網(wǎng)絡(luò)問(wèn)題并自助解決。

連通性診斷目前提供了 Flannel、Calico(內(nèi)部包括 Terway)網(wǎng)絡(luò)插件插件的診斷支持,以及阿里云作為基礎(chǔ)設(shè)施的支持。關(guān)于診斷能力的完整使用文檔,可見(jiàn): /docs/guide/diagnose/intro

深度網(wǎng)絡(luò)監(jiān)控

針對(duì)網(wǎng)絡(luò)抖動(dòng)問(wèn)題,KubeSkoop 深度網(wǎng)絡(luò)監(jiān)控提供了基于 eBPF 的,Pod 級(jí)別的容器網(wǎng)絡(luò)異常監(jiān)控能力。

基于 eBPF,KubeSkoop 提供了精簡(jiǎn)、低開(kāi)銷(xiāo)的內(nèi)核異常監(jiān)控能力,覆蓋驅(qū)動(dòng)、netfilter、TCP 等完整協(xié)議棧,幾十種異常場(chǎng)景的識(shí)別。同時(shí),基于云原生部署,提供了與 Prometheus 等可觀測(cè)體系的對(duì)接,支持網(wǎng)絡(luò)問(wèn)題的 Metrics 查看和事件回溯。

關(guān)于深度網(wǎng)絡(luò)監(jiān)控能力的指標(biāo)透出,可參考: /docs/guide/exporter/exporter-description

KubeSkoop 設(shè)計(jì)

Cloud Native

KubeSkoop 的設(shè)計(jì),同樣分為連通性診斷和深度網(wǎng)絡(luò)監(jiān)控兩部分。

連通性診斷

工作流程 ?

KubeSkoop 連通性診斷的工作流程可分為三步: 拓?fù)錁?gòu)建、信息采集和鏈路模擬。

拓?fù)錁?gòu)建

通過(guò)用戶(hù)所提供的信息,再通過(guò) API Server 獲取集群內(nèi)的 Pod/Node 資源和 Service/NetworkPolicy 規(guī)則,匹配對(duì)應(yīng)的 CNI 插件、基礎(chǔ)設(shè)施,構(gòu)建集群內(nèi)的訪問(wèn)關(guān)系。

信息采集

在構(gòu)建鏈路的過(guò)程中,KubeSkoop 會(huì)按需向集群中的節(jié)點(diǎn)下發(fā)信息采集任務(wù)。采集的內(nèi)容包括運(yùn)行時(shí)信息、協(xié)議棧采集(路由、iptables、IPVS 等)和基礎(chǔ)設(shè)施信息(ECS metadata)。采集后的信息用于后續(xù)的網(wǎng)絡(luò)拓?fù)錁?gòu)建和診斷模擬過(guò)程。

鏈路模擬

KubeSkoop 會(huì)根據(jù)網(wǎng)絡(luò)拓?fù)浜退占降降男畔ⅲM(jìn)行檢查和模擬。包括對(duì)路徑上的拓?fù)潼c(diǎn)和鏈路的轉(zhuǎn)發(fā)模擬、對(duì)于 CNI 插件實(shí)現(xiàn)的模擬、云廠商的模擬,快速發(fā)現(xiàn)鏈路中存在的丟包或錯(cuò)誤路由配置。

最終,結(jié)合網(wǎng)絡(luò)拓?fù)湟约霸\斷中發(fā)現(xiàn)的異常鏈路,KubeSkoop 會(huì)輸出診斷結(jié)果和鏈路中存在的問(wèn)題,或在 Web UI 中進(jìn)行直觀地展示。

擴(kuò)展性

KubeSkoop 連通性診斷提供了對(duì) CNI 插件和基礎(chǔ)設(shè)施架構(gòu)的擴(kuò)展,能夠輕松地在框架中提供對(duì)其它 CNI 插件和云廠商的支持。

深度網(wǎng)絡(luò)監(jiān)控

工作流程

KubeSkoop 深度網(wǎng)絡(luò)監(jiān)控通過(guò)在需要采集信息的集群節(jié)點(diǎn)上運(yùn)行 KubeSkkop exporter 的方式,采集節(jié)點(diǎn)上 Pod 的網(wǎng)絡(luò)監(jiān)控信息并以多種形式導(dǎo)出,包括:

深度容器網(wǎng)絡(luò)采集 通過(guò) eBPF 采集協(xié)議棧關(guān)鍵點(diǎn) 采集 procfs 下內(nèi)核透出信息用于回溯 采用 CRI 接口關(guān)聯(lián)采集點(diǎn)和 Pod 容器指標(biāo)和異常事件預(yù)處理 網(wǎng)絡(luò)異常 Metrics 過(guò)濾,減少開(kāi)銷(xiāo) 多指標(biāo)聚合生成異常 Event 網(wǎng)絡(luò) Metrics 和 Event 展示 通過(guò) Prometheus+Grafa 存儲(chǔ)和回溯異常時(shí)間點(diǎn)指標(biāo) Grafana Loki 記錄異常事件 KubeSkoop Inspector 查看實(shí)時(shí)異常事件流

實(shí)現(xiàn)

在實(shí)現(xiàn)中,采用了 eBPF 作為 KubeSkoop 主要數(shù)據(jù)的采集來(lái)源。eBPF 可以達(dá)到在內(nèi)核中動(dòng)態(tài)注入代碼的目的,eBPF 代碼在內(nèi)核中執(zhí)行效率高,并且可以通過(guò) map 和 pert_event 與用戶(hù)態(tài)通信。eBPF 還自帶了校驗(yàn)機(jī)制,避免了因掛載的程序問(wèn)題而導(dǎo)致宕機(jī)。

為了兼容性和性能考慮,在使用 eBPF 的過(guò)程中,我們也做了許多優(yōu)化措施:

采用 CO-RE 方式減少編譯開(kāi)銷(xiāo),提升內(nèi)核兼容性 減少在關(guān)鍵路徑上的注入 盡量在 eBPF 程序中過(guò)濾異常數(shù)據(jù),以減少內(nèi)存開(kāi)銷(xiāo) 默認(rèn)注入低開(kāi)銷(xiāo)程序,根據(jù)需求可動(dòng)態(tài)插拔 eBPF 采集模塊和修改過(guò)濾參數(shù)

未來(lái)規(guī)劃

Cloud Native

目前,KubeSkoop 項(xiàng)目仍舊處于早期階段。我們下一步的規(guī)劃包括:

增加更多云廠商和網(wǎng)絡(luò)插件的支持。 支持模擬發(fā)包和追蹤以定位未知問(wèn)題點(diǎn),縮小排查范圍。 提供 KubeSkoop Analysis 工具,智能分析 KubeSkoop 的指標(biāo)和事件,降低診斷結(jié)果理解門(mén)檻。 不限于網(wǎng)絡(luò)診斷,增加存儲(chǔ)、性能診斷。 應(yīng)用層感知能力,提供對(duì)7層協(xié)議(如 http、redis 等)的感知和處理。

KubeSkoop 的官網(wǎng)位于:

歡迎大家前來(lái)試用&提供建議&貢獻(xiàn)代碼! 也歡迎通過(guò)搜索群號(hào)的方式加入 KubeSkoop 用戶(hù)釘釘交流群~(群號(hào):26720020148)

關(guān)鍵詞:
x 廣告
x 廣告

Copyright @  2015-2022 海外生活網(wǎng)版權(quán)所有  備案號(hào): 滬ICP備2020036824號(hào)-21   聯(lián)系郵箱:562 66 29@qq.com