深度解析|基于 eBPF 的 Kubernetes 一站式可觀測性系統(tǒng)
作者:李煌東、炎尋
摘要
阿里云目前推出了面向 Kubernetes 的一站式可觀測性系統(tǒng),旨在解決 Kubernetes 環(huán)境下架構(gòu)復(fù)雜度高、多語言&多協(xié)議并存帶來的運維難度高的問題,數(shù)據(jù)采集器采用當(dāng)下火出天際的 eBPF 技術(shù),產(chǎn)品上支持無侵入地采集應(yīng)用黃金指標(biāo),構(gòu)建成全局拓?fù)?,極大地降低了公有云用戶運維 Kubernetes 的難度。
前言
背景與問題
當(dāng)前,云原生技術(shù)主要是以容器技術(shù)為基礎(chǔ)圍繞著 Kubernetes 的標(biāo)準(zhǔn)化技術(shù)生態(tài),通過標(biāo)準(zhǔn)可擴(kuò)展的調(diào)度、網(wǎng)絡(luò)、存儲、容器運行時接口來提供基礎(chǔ)設(shè)施,同時通過標(biāo)準(zhǔn)可擴(kuò)展的聲明式資源和控制器來提供運維能力,兩層標(biāo)準(zhǔn)化推進(jìn)了細(xì)化的社會分工,各領(lǐng)域進(jìn)一步提升規(guī)?;蛯I(yè)化,全面達(dá)到成本、效率、穩(wěn)定性的優(yōu)化,在這樣的背景下,大量公司都使用云原生技術(shù)來開發(fā)運維應(yīng)用。正因為云原生技術(shù)帶來了更多可能性,當(dāng)前業(yè)務(wù)應(yīng)用出現(xiàn)了微服務(wù)眾多、多語言開發(fā)、多通信協(xié)議的特征,同時云原生技術(shù)本身將復(fù)雜度下移,給可觀測性帶來了更多挑戰(zhàn):
1、混沌的微服務(wù)架構(gòu)
業(yè)務(wù)架構(gòu)因為分工問題,容易出現(xiàn)服務(wù)數(shù)量多,服務(wù)關(guān)系復(fù)雜的現(xiàn)象(如圖 1)。

圖 1 混沌的微服務(wù)架構(gòu)(圖片來源見文末)
這樣會引發(fā)一系列問題:
- 無法回答當(dāng)前的運行架構(gòu);
- 無法確定特定服務(wù)的下游依賴服務(wù)是否正常;
- 無法確定特定服務(wù)的上游依賴服務(wù)流量是否正常;
- 無法回答應(yīng)用的 DNS 請求解析是否正常;
- 無法回答應(yīng)用之間的連通性是否正確;
- ...
2、多語言應(yīng)用
業(yè)務(wù)架構(gòu)里面,不同的應(yīng)用使用不同的語言編寫(如圖 2),傳統(tǒng)可觀測方法需要對不同語言使用不同的方法進(jìn)行可觀測。
圖 2 多語言(圖片來源見文末)
這樣也會引發(fā)一系列問題:
- 不同語言需要不同埋點方法,甚至有的語言沒有現(xiàn)成的埋點方法;
- 埋點對應(yīng)用性能影響無法簡單評估;
3、多通信協(xié)議
業(yè)務(wù)架構(gòu)里面,不同的服務(wù)之間的通信協(xié)議也不同(如圖 3),傳統(tǒng)可觀測方法通常是在應(yīng)用層特定通信接口進(jìn)行埋點。
圖 3 多通信協(xié)議
這樣也會引發(fā)一系列問題:
- 不同通信協(xié)議因為不同的客戶端需要不同埋點方法,甚至有的通信協(xié)議沒有現(xiàn)成的埋點方法;
- 埋點對應(yīng)用性能影響無法簡單評估;
4、Kubernetes 引入的端到端復(fù)雜度
復(fù)雜度是永恒的,我們只能找到方法來管理它,無法消除它,云原生技術(shù)的引入雖然減少了業(yè)務(wù)應(yīng)用的復(fù)雜度,但是在整個軟件棧中,他只是將復(fù)雜度下移到容器虛擬化層,并沒有消除(如圖 4)。
圖 4 端到端軟件棧
這樣也會引發(fā)一系列問題:
- Deployment 的期望副本數(shù)和實際運行副本數(shù)不一致;
- Service 沒有后端,無法處理流量;
- Pod 無法創(chuàng)建或者調(diào)度;
- Pod 無法達(dá)到 Ready 狀態(tài);
- Node 處于 Unknown 狀態(tài);
- ...
解決思路與技術(shù)方案
為了解決上面的問題,我們需要使用一種支持多語言,多通信協(xié)議的技術(shù),并且在產(chǎn)品層面盡可能得覆蓋軟件棧端到端的可觀測性需求,通過調(diào)研我們提出一種立足于容器界面和底層操作系統(tǒng),向上關(guān)聯(lián)應(yīng)用性能觀測的可觀測性解決思路(如圖 5)。
數(shù)據(jù)采集
圖 5 端到端可觀測性解決思路
我們以容器為核心,采集關(guān)聯(lián)的 Kubernetes 可觀測數(shù)據(jù),與此同時,向下采集容器相關(guān)進(jìn)程的系統(tǒng)和網(wǎng)絡(luò)可觀測數(shù)據(jù),向上采集容器相關(guān)應(yīng)用的性能數(shù)據(jù),通過關(guān)聯(lián)關(guān)系將其串聯(lián)起來,完成端到端可觀測數(shù)據(jù)的覆蓋。
數(shù)據(jù)傳輸鏈路
我們的數(shù)據(jù)類型包含了指標(biāo),日志和鏈路,采用了 open telemetry collector 方案(如圖 6)支持統(tǒng)一的數(shù)據(jù)傳輸。
圖 6 OpenTelemetry Collector(圖片來源見文末)
數(shù)據(jù)存儲
背靠 ARMS 已有的基礎(chǔ)設(shè)施,指標(biāo)通過 ARMS Prometheus 進(jìn)行存儲,日志/鏈路通過 XTRACE 進(jìn)行存儲。
產(chǎn)品核心功能介紹
核心場景上支持架構(gòu)感知、錯慢請求分析、資源消耗分析、DNS 解析性能分析、外部性能分析、服務(wù)連通性分析和網(wǎng)絡(luò)流量分析。支持這些場景的基礎(chǔ)是產(chǎn)品在設(shè)計上遵循了從整體到個體的原則:先從全局視圖入手,發(fā)現(xiàn)異常的服務(wù)個體,如某個 Service,定位到這個 Service 后查看這個 Service 的黃金指標(biāo)、關(guān)聯(lián)信息、Trace等進(jìn)行進(jìn)一步關(guān)聯(lián)分析。
圖 7 核心業(yè)務(wù)場景
永不過時的黃金指標(biāo)
什么是黃金指標(biāo)?用來可觀測性系統(tǒng)性能和狀態(tài)的最小集合:latency、traffic、errors、saturation。以下引自 SRE 圣經(jīng) Site Reliability Engineering 一書:
The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four.
為什么黃金指標(biāo)非常重要?一,直接了然地表達(dá)了系統(tǒng)是否正常對外服務(wù)。二,面向客戶的,能進(jìn)一步評估對用戶的影響或事態(tài)的嚴(yán)重性,這樣能大量節(jié)省SRE或研發(fā)的時間,想象下如果我們?nèi)?CPU 使用率作為黃金指標(biāo),那么 SRE 或研發(fā)將會奔于疲命,因為 CPU 使用率高可能并不會造成多大的影響,尤其在運行平穩(wěn)的 Kubernetes 環(huán)境中。所以 Kubernetes 可觀測性支持這些黃金指標(biāo):
- 請求數(shù)/QPS
- 響應(yīng)時間及分位數(shù)(P50、P90、P95、P99)
- 錯誤數(shù)
- 慢調(diào)用數(shù)
圖8 黃金指標(biāo)
主要支持以下場景:
1、性能分析
2、慢調(diào)用分析
全局視角的應(yīng)用拓補
不謀全局者,不足謀一域 。--諸葛亮
隨著當(dāng)下技術(shù)架構(gòu)、部署架構(gòu)的復(fù)雜度越來越高,發(fā)生問題后定位問題變得越來越棘手,進(jìn)而導(dǎo)致 MTTR 越來越高。另一個影響是對影響面的分析帶來非常大的挑戰(zhàn),通常顧得了這頭顧不了那頭。因此,有一張像地圖一樣的大圖非常必要。全局拓?fù)渚哂幸韵绿攸c:
- 系統(tǒng)架構(gòu)感知:系統(tǒng)架構(gòu)圖通常稱為程序員了解一個新系統(tǒng)的重要參考,當(dāng)我們拿到一個系統(tǒng),起碼我們得知道流量的入口在哪里,有哪些核心模塊,依賴了哪些內(nèi)部外部組件等。在異常定位過程中,有一張全局架構(gòu)的圖對異常定位進(jìn)程有非常大的推動作用。一個簡單電商應(yīng)用的拓?fù)涫纠?,整個架構(gòu)一覽無遺:
圖 9 架構(gòu)感知
- 依賴分析:有一些問題是出現(xiàn)在下游依賴,如果這個依賴不是自己團(tuán)隊維護(hù)就會比較麻煩,當(dāng)自己系統(tǒng)和下游系統(tǒng)沒有足夠的可觀測性的時候就更麻煩了,這種情況下就很難跟依賴的維護(hù)者講清楚問題。在我們的拓?fù)渲?,通過將黃金指標(biāo)的上下游用調(diào)用關(guān)系連起來,形成了一張調(diào)用圖。邊作為依賴的可視化,能查看對應(yīng)調(diào)用的黃金信號。有了黃金信號就能快速地分析下游依賴是否存在問題。下圖為底層服務(wù)調(diào)用微服務(wù)發(fā)生慢調(diào)用導(dǎo)致應(yīng)用整體 RT 高的定位示例,從入口網(wǎng)關(guān),到內(nèi)部服務(wù),到 MySQL 服務(wù),最終定位到發(fā)生慢 SQL 的語句:
圖 10 依賴分析
- 高可用分析:拓?fù)鋱D能方便地看出系統(tǒng)之間的交互,從而看出哪些系統(tǒng)是主要核心鏈路或者是被重度依賴的,比如 CoreDNS,幾乎所有的組件都會通過 CoreDNS 進(jìn)行 DNS 解析,所以我們進(jìn)一步看到可能存在的瓶頸,通過檢查 CoreDNS 的黃金指標(biāo)預(yù)判應(yīng)用是否健康、是否容量不足等。
圖 11 高可用分析
- 無侵入:跟螞蟻的 linkd 和集團(tuán)的 eagleeye 不同的是,我們的方案是完全無侵入的。有時候我們之所以缺少某個方面的可觀測性,并不是說做不到,而是因為應(yīng)用需要改代碼。作為 SRE 為了更好的可觀測性固然出發(fā)點很好,但是要讓全集團(tuán)的應(yīng)用 owner 陪你一起改代碼,顯然是不合適的。這時候就顯示出無侵入的威力了:應(yīng)用不需要改代碼,也不需要重啟。所以在接入成本上是非常低的。
協(xié)議 Trace 方便根因定位
協(xié)議 Trace 區(qū)別于分布式追蹤,只跟蹤一次調(diào)用。協(xié)議 Trace 同樣是無入侵、語言無關(guān)的。如果請求內(nèi)容中存在分布式鏈路 TraceID,能自動識別出來,方便進(jìn)一步下鉆到鏈路追蹤。應(yīng)用層協(xié)議的請求、響應(yīng)信息有助于對請求內(nèi)容、返回碼進(jìn)行分析,從而知道具體哪個接口有問題。
圖 12 協(xié)議詳情
開箱即用的告警功能
任何一個可觀測性系統(tǒng)不支持告警是不合適的。1、默認(rèn)模板下發(fā),閾值經(jīng)過業(yè)界最佳實踐。
圖 13 告警
2、支持用戶多種配置方式
- 靜態(tài)閾值,用戶只需要配置閾值即可,不需要手動寫 PromQL
- 基于靈敏度調(diào)節(jié)的動態(tài)閾值,適合不好確定閾值的場景
- 兼容 PromQL,需要一定的學(xué)習(xí)成本,適合高級用戶
豐富的上下文關(guān)聯(lián)
datadog 的 CEO 在一次采訪中直言 datadog 的產(chǎn)品策略不是支持越多功能越好,而是思考怎樣在不同團(tuán)隊和成員之間架起橋梁,盡可能把信息放在同一個頁面中(to bridge the gap between the teams and get everything on the same page)。產(chǎn)品設(shè)計上我們將關(guān)鍵的上下文信息關(guān)聯(lián)起來,方便不同背景的工程師理解,從而加速問題的排查。
目前我們關(guān)聯(lián)的上下文有告警信息、黃金指標(biāo)、日志、Kubernetes 元信息等,同時不斷新增有價值的信息。比如告警信息,告警信息自動關(guān)聯(lián)到對應(yīng)的服務(wù)或應(yīng)用節(jié)點上,清晰地看到哪些應(yīng)用有異常,點擊應(yīng)用或告警能自動展開應(yīng)用的詳情、告警詳情、應(yīng)用的黃金指標(biāo),所有的動作都在一個頁面中進(jìn)行:
圖 14 上下文關(guān)聯(lián)
其他
一、網(wǎng)絡(luò)性能可觀測性:
網(wǎng)絡(luò)性能導(dǎo)致響應(yīng)時間變長是經(jīng)常遇到的問題,由于 TCP 底層機(jī)制屏蔽了一部分的復(fù)雜性,應(yīng)用層對此是無感的,這對丟包率高、重傳率高這種場景帶來一些麻煩。Kubernetes 支持了重傳&丟包、TCP 連接信息來表征網(wǎng)絡(luò)狀況,下圖展示了重傳高導(dǎo)致 RT 高的例子:
圖 15 網(wǎng)絡(luò)性能可觀測性
eBPF 超能力揭秘
圖 16 數(shù)據(jù)處理流程
eBPF 相當(dāng)于在內(nèi)核中構(gòu)建了一個執(zhí)行引擎,通過內(nèi)核調(diào)用將這段程序 attach 到某個內(nèi)核事件上,做到監(jiān)聽內(nèi)核事件;有了事件我們就能進(jìn)一步做協(xié)議推導(dǎo),篩選出感興趣的協(xié)議,對事件進(jìn)一步處理后放到 ringbuffer 或者 eBPF 自帶的數(shù)據(jù)結(jié)構(gòu) Map 中,供用戶態(tài)進(jìn)程讀取;用戶態(tài)進(jìn)程讀取這些數(shù)據(jù)后,進(jìn)一步關(guān)聯(lián) Kubernetes 元數(shù)據(jù)后推送到存儲端。這是整體處理過程。
eBPF 的超能力體現(xiàn)在能訂閱各種內(nèi)核事件,如文件讀寫、網(wǎng)絡(luò)流量等,運行在 Kubernetes 中的容器或者 Pod 里的一切行為都是通過內(nèi)核系統(tǒng)調(diào)用來實現(xiàn)的,內(nèi)核知道機(jī)器上所有進(jìn)程中發(fā)生的所有事情,所以內(nèi)核幾乎是可觀測性的最佳觀測點,這也是我們?yōu)槭裁催x擇 eBPF 的原因。另一個在內(nèi)核上做監(jiān)測的好處是應(yīng)用不需要變更,也不需要重新編譯內(nèi)核,做到了真正意義上的無侵入。當(dāng)集群里有幾十上百個應(yīng)用的時候,無侵入的解決方案會幫上大忙。
eBPF作為新技術(shù),人們對其有些擔(dān)憂是正常的,這里分別作簡單的回答:
1、eBPF 安全性如何?eBPF 代碼有諸多限制,如最大堆??臻g當(dāng)前為 512、最大指令數(shù)為 100 萬,這些限制的目的就是充分保證內(nèi)核運行時的安全性。
2、eBPF探針的性能如何?大約在 1% 左右。eBPF 的高性能主要體現(xiàn)在內(nèi)核中處理數(shù)據(jù),減少數(shù)據(jù)在內(nèi)核態(tài)和用戶態(tài)之間的拷貝。簡單說就是數(shù)據(jù)在內(nèi)核里算好了再給用戶進(jìn)程,比如一個 Gauge 值,以往的做法是將原始數(shù)據(jù)拷貝到用戶進(jìn)程再計算。
總結(jié)
產(chǎn)品價值
阿里云 Kubernetes 可觀測性是一套針對 Kubernetes 集群開發(fā)的一站式可觀測性產(chǎn)品?;?Kubernetes 集群下的指標(biāo)、應(yīng)用鏈路、日志和事件,阿里云 Kubernetes 可觀測性旨在為 IT 開發(fā)運維人員提供整體的可觀測性方案。阿里云 Kubernetes 可觀測性具備以下特性:
- 代碼無侵入:通過旁路技術(shù),不需要對代碼進(jìn)行埋點即可獲取到豐富的網(wǎng)絡(luò)性能數(shù)據(jù)。
- 語言無關(guān):在內(nèi)核層面進(jìn)行網(wǎng)絡(luò)協(xié)議解析,支持任意語言,任意框架。
- 高性能:基于 eBPF 技術(shù),能以極低的消耗獲取豐富的網(wǎng)絡(luò)性能數(shù)據(jù)。
- 強(qiáng)關(guān)聯(lián):通過網(wǎng)絡(luò)拓?fù)?,資源拓?fù)?,資源關(guān)系從多個維度描述實體關(guān)聯(lián),與此同時也支持各類數(shù)據(jù)(可觀測指標(biāo)、鏈路、日志和事件)之間的關(guān)聯(lián)。
- 數(shù)據(jù)端到端覆蓋:涵蓋端到端軟件棧的觀測數(shù)據(jù)。
- 場景閉環(huán):控制臺的場景設(shè)計,關(guān)聯(lián)起架構(gòu)感知拓?fù)?、?yīng)用可觀測性、Prometheus 可觀測性、云撥測、健康巡檢、事件中心、日志服務(wù)和云服務(wù),包含應(yīng)用理解,異常發(fā)現(xiàn),異常定位的完整閉環(huán)。